私はナビゲーションコントローラーを持っています、そのルートビューコントローラーはタイプ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:
が呼び出されるのですか?コード内のcontentOffset
のcollectionView
を変更するものはなく、ユーザーの操作もありません。 transform
プロパティを変更すると、メソッドが呼び出されない限り?
垂直スクロールを無効にする必要があるため、CollectionViewControllerB
はscrollViewDidScroll:
を実装します。
その間、クラッシュを防ぐために非常に厄介なハックがあります。つまり、アニメーションの前です。
self.collectionView.delegate = nil;
これにより、メソッドが呼び出されなくなります。しかし、もっと良い方法が必要です。
scrollViewDidScroll:
が呼び出される理由と、それを停止する方法について、誰かが光を当てることはできますか?
問題を解決する唯一の方法は、私がすでに行ったことのようです...アニメーションの前にデリゲートをnilに設定します。
self.collectionView.delegate = nil;
うまくいけば、これは将来誰か他の人を助けるでしょう。
セットする self.automaticallyAdjustsScrollViewInsets = NO;
ビューコントローラ内。
これと同様の問題が発生し、ページから移動すると、contentOffset
が毎回20ずつ変化することがわかりました。
ビューコントローラ内でこのプロパティを設定すると、この変更が停止したため、scrollViewDidScroll
が呼び出されなくなったことがわかりました。ビューコントローラは、離れた場所に移動した場合でも、ステータスバー、ナビゲーションバーなどの変更に合わせてコンテンツインセットを自動的に調整することがわかりました。
これは、スクロールメソッドが呼び出された理由についてのより良い解決策と適切な説明だと思います。
これはコントローラーで試すことができます。
[self setEdgesForExtendedLayout:UIRectEdgeNone];
これがお役に立てば幸いです。