使UIScrollView中的UIView在滚动时保持顶部

所以在UITableView中,当你有部分的时候,部分视图会粘到顶部,直到下一部分重叠,然后在顶部replace它。 我想有一个类似的效果,基本上我有一个UIViewView在我的UIScrollView,表示部分UIView,当它击中顶部..我希望它留在那里,而不是进行。 我该怎么做呢? 我认为这需要在layoutSubviews或scrollViewDidScroll中完成,并对UIVIew进行操作。

在UIScrollView中创buildUIView的时候,向上滚动时要做到:

- (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; } 

基于EVYA响应的Swift解决scheme:

 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) } 

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

它本质上是基于scrollViewDidScrollcallback更新框架(虽然内存在更细的点上有点模糊)。

Evya的解决scheme工作得很好,但是如果你使用自动布局,你应该这样做(自动布局语法是用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]; }