web-dev-qa-db-ja.com

scrollViewDidScrollを呼び出すUICollectionView:ナビゲーションスタックからポップされたとき

私はナビゲーションコントローラーを持っています、そのルートビューコントローラーはタイプCollectionViewControllerAです。アイテムを選択すると、フェードアウトして展開するアニメーションが表示され、続いてタイプCollectionVewControllerBの2番目のビューコントローラーをスタックにプッシュするように呼び出します。

CollectionViewControllerB *b = ... // construction of the view controller to be pushed
[UIView animateWithDuration:.3
                 animations:^{
                     self.collectionView.transform = CGAffineTransformMakeScale(1.5, 1.5);
                     self.collectionView.alpha = 0;
                 }
                 completion:^(BOOL s){
                     [self.navigationController pushViewController:b animated:NO];
                 }];

同様の方法でViewControllerをポップします

[UIView animateWithDuration:.3
                 animations:^{
                     self.collectionView.transform = CGAffineTransformMakeScale(.3, .3);
                     self.collectionView.alpha = 0;
                 }
                 completion:^(BOOL s){
                     [self.navigationController popViewControllerAnimated:NO];
                 }];

ここでの問題は、ViewControllerをポップするとアプリがクラッシュすることです。理由:

*** -[CollectionViewControllerB scrollViewDidScroll:]: message sent to deallocated instance

ポップされたViewControllerが破壊されていることが問題であると理解していますが、そもそもなぜscrollViewDidScroll:が呼び出されるのですか?コード内のcontentOffsetcollectionViewを変更するものはなく、ユーザーの操作もありません。 transformプロパティを変更すると、メソッドが呼び出されない限り?

垂直スクロールを無効にする必要があるため、CollectionViewControllerBscrollViewDidScroll:を実装します。

その間、クラッシュを防ぐために非常に厄介なハックがあります。つまり、アニメーションの前です。

self.collectionView.delegate = nil;

これにより、メソッドが呼び出されなくなります。しかし、もっと良い方法が必要です。

scrollViewDidScroll:が呼び出される理由と、それを停止する方法について、誰かが光を当てることはできますか?

27
Allen Zeng

問題を解決する唯一の方法は、私がすでに行ったことのようです...アニメーションの前にデリゲートをnilに設定します。

self.collectionView.delegate = nil;

うまくいけば、これは将来誰か他の人を助けるでしょう。

56
Allen Zeng

セットする self.automaticallyAdjustsScrollViewInsets = NO;ビューコントローラ内。

これと同様の問題が発生し、ページから移動すると、contentOffsetが毎回20ずつ変化することがわかりました。

ビューコントローラ内でこのプロパティを設定すると、この変更が停止したため、scrollViewDidScrollが呼び出されなくなったことがわかりました。ビューコントローラは、離れた場所に移動した場合でも、ステータスバー、ナビゲーションバーなどの変更に合わせてコンテンツインセットを自動的に調整することがわかりました。

これは、スクロールメソッドが呼び出された理由についてのより良い解決策と適切な説明だと思います。

9
jack moseley

これはコントローラーで試すことができます。

[self setEdgesForExtendedLayout:UIRectEdgeNone];

これがお役に立てば幸いです。

0
wxhui