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 に答える
2

私が正しく思い出せば、2010 WWDC ScrollViewプレゼンテーションでは、他の要素がその周りをスクロールしている間、ビューを固定位置に保つ方法について正確に説明しています。ビデオを見ると、実装するための明確なアプローチが必要です。

これは基本的に、scrollViewDidScrollコールバックに基づいてフレームを更新します(ただし、メモリは細かい点で少しかすんでいます)。

于 2012-06-30T14:29:04.600 に答える
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 に答える