滚动时,使UIScrollView中的UIView粘到顶部

时间:2012-06-30 08:56:13

标签: iphone objective-c ios ipad uiscrollview

因此,在UITableView中,当您有截面时,截面视图会粘到顶部,直到下一部分与其重叠,然后将其替换为顶部。我希望有一个类似的效果,基本上我在UIScrollView中有一个UIView,表示UIView部分以及它何时触及顶部..我希望它留在那里而不是被占用。我该怎么做呢?我认为这需要在layoutSubviews或scrollViewDidScroll中完成,并对UIVIew进行操作..

4 个答案:

答案 0 :(得分:22)

要在UIScrollView中创建UIView,请在向上滚动时粘贴到顶部:

- (void)createHeaderView:(UIView*)headerView {
    _headerView = [headerView retain];
    _headerViewInitialY = _headerView.frame.origin.y;
    [_scrollView addSubview:_headerView];
    _scrollView.delegate = self;
}

- (void)scrollViewDidScroll:(UIScrollView *)scrollView {
    CGRect headerFrame = _headerView.frame;
    headerFrame.origin.y = MAX(_headerViewInitialY, scrollView.contentOffset.y);
    _headerView.frame = headerFrame;
}

答案 1 :(得分:9)

基于EVYA回应的Swift解决方案:

var navigationBarOriginalOffset : CGFloat?

override func viewWillAppear(animated: Bool) {
    super.viewWillAppear(animated)
    navigationBarOriginalOffset = navigationBar.frame.origin.y
}

func scrollViewDidScroll(scrollView: UIScrollView) {
    navigationBar.frame.origin.y = max(navigationBarOriginalOffset!, scrollView.contentOffset.y)
}

答案 2 :(得分:2)

如果我没记错的话,2010 WWDC ScrollView演示文稿精确讨论了如何将视图保持在固定位置,而其他元素围绕它进行滚动。观看视频,你应该有一个明确的方法来实施。

它基本上是基于scrollViewDidScroll回调更新帧(尽管内存在更精细的点上有点模糊)。

答案 3 :(得分:2)

Evya的解决方案效果非常好,但是如果你使用自动布局,你应该做这样的事情(自动布局语法是用Masonry编写的,但你明白了。):

- (void)scrollViewDidScroll:(UIScrollView *)scrollView {

    //Make the header view sticky to the top.
    [self.headerView mas_remakeConstraints:^(MASConstraintMaker *make) {
        make.top.equalTo(self.scrollView.mas_top).with.offset(scrollView.contentOffset.y);
        make.left.equalTo(self.scrollView.mas_left);
        make.right.equalTo(self.scrollView.mas_right);

        make.height.equalTo(@(headerViewHeight));
    }];

    [self.scrollView bringSubviewToFront:self.headerView];
}