2015-10-29 5 views
8

スクロールするときに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; は「レイアウトを無効 ***まずスローコールスタックなし:

+0

'shouldInvalidateLayoutForBoundsChange'メソッドをオーバーライドしないと、クラッシュは継続しますか? – Lefteris

+0

@Lefterisこのケースではクラッシュは起こりませんが、collectionViewのパフォーマンスに影響を与えずにどのようにして達成するかはわかりません(つまり、invalidateLayoutWithContextアプローチを使用する方法がわからない) – Greg

答えて

1

を(コレクションビューがスクロールビューである)私は、これは十分だろうかわからないが、私はそれをこれらの線に沿ってトライ何かを与えるだろう。

+0

私の問題に対処するには? "invalidateLayoutWithContext"はどこに収まるのですか? – Greg

+0

私が(昨日)コメントする特権を持っていれば、私はもっと適切にコメントを投稿したでしょう。あなたは 'shouldInvalidateLayoutForBoundsChange'をオーバーライドしないと、クラッシュしないようです。私の素朴なアイデアはまあまあです:回転イベントがある場合、scrollEnabled = falseを設定すると同時に、スクロールをフリーズさせ、ユーザーのやりとりを防止します(クリーンな状態を維持する)。スクロールが無効になっているときは、 'shouldInvalidateLayoutForBoundsChange'を「中断」することができます(つまり、デフォルト動作を使用します)。おそらく私はここで重要な何かを見逃しているでしょう。 – Eppilo

関連する問題