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