18

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

4

4 回答 4

24

要在 UIScrollView 中创建 UIView 在向上滚动时粘在顶部,请执行以下操作:

func createHeaderView(_ headerView: UIView?) {
    self.headerView = headerView
    headerViewInitialY = self.headerView.frame.origin.y
    scrollView.addSubview(self.headerView)
    scrollView.delegate = self
}

func scrollViewDidScroll(_ scrollView: UIScrollView) {
    let headerFrame = headerView.frame
    headerFrame.origin.y = CGFloat(max(headerViewInitialY, scrollView.contentOffset.y))
    headerView.frame = headerFrame
}
于 2013-06-27T09:52:08.097 回答
11

基于 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)
}
于 2015-01-22T20:03:49.400 回答
2

Evya 的解决方案效果很好,但是如果您使用 Auto Layout,则应该执行以下操作(Auto Layout 语法是用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];
}
于 2015-03-06T10:16:17.187 回答
2

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

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

于 2012-06-30T14:29:04.600 回答