【问题标题】:How to make floating view?如何制作浮动视图?
【发布时间】:2016-07-14 09:48:44
【问题描述】:

我所说的浮动视图是自定义视图,它是滚动视图的子视图(或看起来是子视图),它一直滚动直到它锚定在某个点上。类似的行为将是 UITableView 的部分标题。下面附上图片

我的内容视图(浮动视图下方的视图)不在 tableview 布局中。这意味着如果我仅将 tableview 用于浮动视图,我必须将我的内容视图放在 1 个巨型单元格中,或者将其分成几个具有不同布局的单元格。内容视图将有很多动态元素,这就是为什么我不想把它放在 UITableViewCell 中,除非我必须这样做。我可以以编程方式制作浮动视图/在滚动视图上使用自动布局吗?

【问题讨论】:

  • 这是一个主要基于意见的问题,请报告有关您问题的更多详细信息。
  • 我也遇到过,我的经验是用auto layout好像不太好,有时会有一些延迟动画,我用的是KVO,好很多。顺便说一句,正如你所说,使用表格视图更容易
  • 你说“我不需要页面的表格视图”,但从技术上讲,你已经排除了使用浮动部分标题的明显解决方案,并且没有显示任何努力提出任何其他解决方案,您只是在这里提出要求,让 someone else 和 somehow else 解决您的问题 - 这不是在这里提出问题的方式。
  • @holex 我的措辞很糟糕。我确实解释了为什么我不喜欢使用 tableview。我知道如何使用浮动部分标题,我想知道是否有更好的选择。我确实尝试过提出其他解决方案来征求建议,而之前的评论者认为这是一个基于意见的问题,这就是为什么我编辑直接提出“如何”问题。感谢您的建议,我是新来的,还在学习如何正确提问:)

标签: ios objective-c swift uitableview autolayout


【解决方案1】:

使用 tableview 部分标题可能是最好的解决方案,您始终可以轻松自定义单元格的数量或单元格本身以实现特定的布局。

但是,如果您绝对不想处理 tableview,这个组件看起来真的很酷,它实际上是要添加到 tableview 中的,但是我使用 twitter 示例对其进行了测试,您实际上可以将它添加到滚动视图,因此您不需要表格视图并且它会起作用,给制作它的人提供道具。 GSKStretchyHeaderView

希望对你有帮助,有问题可以评论,祝你好运。

【讨论】:

    【解决方案2】:

    使用 KVO 更新浮动视图的框架。

    这是用 Objective-C 编写的示例代码:

    // ScrollView.m
    // ScrollView is a subclass of UIScrollView
    
    @interface ScrollView ()
    
    @property (nonatomic, strong) UIView *floatingView;
    @property (nonatomic) CGRect originalBorderFrame;
    @property (nonatomic) CGFloat anchorHeight;
    
    @end
    
    @implementation ScrollView
    
    
    - (instancetype)initWithFrame:(CGRect)frame {
        self = [super initWithFrame:frame];
    
        if (self) {
            self.floatingView = [UIView new];
            self.floatingView.backgroundColor = [UIColor colorWithRed:0.8211 green:0.5 blue:0.5 alpha:1.0];
            self.floatingView.frame = CGRectMake(0, 150, frame.size.width, 20);
            self.originalBorderFrame  = self.floatingView.frame;
            [self addSubview:self.floatingView];
    
            self.anchorHeight = 44;
    
            [self addObserver:self forKeyPath:@"contentOffset" options:NSKeyValueObservingOptionNew context:nil];
        }
    
        return self;
    }
    
    - (void)dealloc {
        [self removeObserver:self forKeyPath:@"contentOffset"];
    }
    
    - (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary<NSString *,id> *)change context:(void *)context {
        if ([keyPath isEqualToString:@"contentOffset"]) {
            if (self.contentOffset.y > self.originalBorderFrame.origin.y-self.anchorHeight) {
                self.floatingView.frame = CGRectOffset(self.originalBorderFrame, 0, self.contentOffset.y - (self.originalBorderFrame.origin.y-self.anchorHeight));
            }
        }
    }
    @end
    

    下面是截图:

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-06-07
      • 2020-04-02
      • 2022-11-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-09-29
      相关资源
      最近更新 更多