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

xon*_*rlz 17 iphone objective-c uiscrollview ipad ios

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

evy*_*vya 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;
}
Run Code Online (Sandbox Code Playgroud)

  • 确保您要捕获滚动的视图具有委托集,并且该委托是scrollViewDidScroll将存在的位置.如果让控制器实现协议<UIScrollViewDelegate>,则可以在控制器中将委托分配为"self",如[this](http://stackoverflow.com/a/14096093) (2认同)

小智 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)
}
Run Code Online (Sandbox Code Playgroud)


isa*_*aac 2

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

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