スクロールするときにUICollectionViewがクラッシュするという事実を解決する方法はありますか?UICollectionViewが回転中にスクロールするときにクラッシュする(インデックスパスの補助アイテムのレイアウト属性が無効にならずに変更されました..)
私は、スクロールと回転を別々に行い、それぞれがうまく動作しているようです。私はちょうど私がこのクラッシュを得ることができる同時に両方のことをするときに気づいた。つまり、デバイスを回転させ、新しいレイアウト属性がprepareLayout内で計算されていること、継続的なスクロールが「invalidateLayoutWithContext(invalidContext)」(以下を参照)を引き起こしているという事実と関係しているようです。
アイデア?ローテーション中にスクロールレスポンスを保留(または無視)する方法はありますか?ビューコントローラで
viewWillLayoutSubviewsにおける回転アプローチ は、私は私が「スティッキー」装飾ビュー(ヘッダ)を持つことができるようにするには、全体のレイアウト
self.cal.collectionViewLayout.invalidateLayout()
スクロールアプローチ を無効に私はしないでくださいレイアウト全体を無効にします。その結果、パフォーマンスは低下しますが、次のようにします。レイアウトクラスでは、私はshouldInvalidateLayoutForBoundsChange
override func shouldInvalidateLayoutForBoundsChange(newBounds: CGRect) -> Bool {
let invalidContext : UICollectionViewLayoutInvalidationContext = self.invalidationContextForBoundsChange(newBounds)
// Keep Header Sticky
invalidContext.invalidateDecorationElementsOfKind(GCCalendarLayoutKind_Decorative1, atIndexPaths: [headerDecorativeIndexPath])
// Apply Invalidation
self.invalidateLayoutWithContext(invalidContext)
// Return normal super return (just in case of future IOS upgrades)
return super.shouldInvalidateLayoutForBoundsChange(newBounds)
}
注意を上書きクラッシュとエラーが私の補足的なビューのレイアウトが異なることについてであるのに対し、ここで私は、装飾的なビュー(ヘッダ)を無効にしています。
エラー
2015年10月30日07:14:30.181 test3_collectionview [17086:3102132]で* アサーションの失敗 - [UICollectionViewData validateLayoutInRect:]、 /BuildRoot /ライブラリ/キャッシュ/ com.apple.xbs /ソース/ UIKit_Sim/UIKitの-3512.29.5/UICollectionViewData.m:408 2015年10月30日07:14:30.185 test3_collectionview [17086:3102132] * キャッチされない例外「NSInternalInconsistencyExceptionによるアプリの終了'、reason:'のレイアウト属性インデックスパスの補足項目({length = 2、path = 0 - 0})が から に変更されました。path:({length = 2、path = 0 - 0});要素 種類:(装飾1);フレーム=(0 1085.5; 320 16); zIndex = 1; 〜 インデックス パス:({length = 2、path = 0 - 0});要素 種類:(装飾1);フレーム=(0 853.5; 320 16); zIndex = 1; は「レイアウトを無効 ***まずスローコールスタックなし:
'shouldInvalidateLayoutForBoundsChange'メソッドをオーバーライドしないと、クラッシュは継続しますか? – Lefteris
@Lefterisこのケースではクラッシュは起こりませんが、collectionViewのパフォーマンスに影響を与えずにどのようにして達成するかはわかりません(つまり、invalidateLayoutWithContextアプローチを使用する方法がわからない) – Greg