私のコレクションビューは、ビューコントローラのビューの下部にあります。ユーザーが少し上にスクロールしたら、コレクションをビュー全体に表示したいと思います。ユーザーがバウンスエリアに引き下げたときに、再び縮小したいのですが。
これが私が機能させたい(そして私は機能するはずだと思う)コードです:
- (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を実行することでコンテンツを適切に再配置できますが、スクロールタッチはどちらの方法でも機能しなくなります。
しばらく前に、テーブルビュー(または別の種類のスクロールビュー)でこのようなことを試したところ、同様のハングアップが発生しました。誰かがこれを解決した場合、多くの義務があります...