做的UIView在UIScrollView中坚持到顶部时,向上滚动(make UIView in U

2019-06-25 22:12发布

因此,在一个UITableView当你有部分剖面视图枝顶端,直到下一个部分重叠,然后将其替换它的顶部。 我想有一个类似的效果,在这里基本上我有一个UIView在我的UIScrollView,代表了部分的UIView,当它击中顶。我希望它留在了那里,并没有冲昏了。 我该怎么做呢? 我认为,这需要在任何layoutSubviews或scrollViewDidScroll要做,做对的UIView操纵..

Answer 1:

要在创建的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;
}


Answer 2:

基于EVYA的反应迅速解决:

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


Answer 3:

如果我没有记错,在2010 WWDC滚动型演示讨论如何精确保持在一个固定位置的图,而其他元素围绕它滚动。 观看视频,你应该有实现一个明确的办法。

它本质上是更新基于scrollViewDidScroll回调帧(虽然内存是在细微之处几分朦胧)。



Answer 4:

Evya的解决方案确实很好,但是如果你使用自动布局,你应该做这样的事情(自动布局语法中砌体 ,但你的想法。):

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


文章来源: make UIView in UIScrollView stick to the top when scrolled up