4

私のコレクションビューは、ビューコントローラのビューの下部にあります。ユーザーが少し上にスクロールしたら、コレクションをビュー全体に表示したいと思います。ユーザーがバウンスエリアに引き下げたときに、再び縮小したいのですが。

これが私が機能させたい(そして私は機能するはずだと思う)コードです:

- (void)scrollViewDidScroll:(UIScrollView *)scrollView {
    if (scrollView == self.collectionView) {
        CGFloat offsetY = self.collectionView.contentOffset.y;
        if (offsetY > 20.0) {
            [self setCollectionViewExpanded:YES];
        } else if (offsetY < -10.0) {
            [self setCollectionViewExpanded:NO];
        }
    }
}

- (void)setCollectionViewExpanded:(BOOL)expanded {

    // avoid starting a do-nothing animation
    BOOL currentlyExpanded = self.collectionView.frame.origin.y == 0.0;
    if (expanded == currentlyExpanded) return;

    // note: the collection view is the uppermost subview of the vc's view
    // expanding to view bounds makes it cover every other view
    CGRect newFrame = (expanded)? self.view.bounds : CGRectMake(0.0, 240.0, 320.0, self.view.bounds.size.height-240.0);
    [UIView animateWithDuration:0.3 animations:^{
        self.collectionView.frame = newFrame;
    }];
}

ただし、展開が行われた後、セルは親ビューに対して同じ位置に留まり(まだ下部に近い)、コレクションビューはパンタッチへの応答を停止し、didScroll通知を送信しません。

アニメーション完了ブロックでreloadDataを実行することでコンテンツを適切に再配置できますが、スクロールタッチはどちらの方法でも機能しなくなります。

しばらく前に、テーブルビュー(または別の種類のスクロールビュー)でこのようなことを試したところ、同様のハングアップが発生しました。誰かがこれを解決した場合、多くの義務があります...

4

1 に答える 1

0

ビュー階層をもう少し詳しく説明できますか? UICollectionView は UIScrollView のサブビューですか?

self.viewUIScrollView ですか?

  • その場合、境界の起点は scrollview の contentOffset (0,0 ではない) です。これにより、UICollectionView に予期しないフレームが表示される可能性があります。
  • UICollectionView が scrollview のサブビューである場合、フレームの原点は scrollview-space 内のビューの原点です。そのため、フレームの原点 (サイズのみ) を変更せず、scrollView の contentOffset を設定してフレームを表示します。
于 2013-04-01T15:37:13.427 に答える