私はUICollectionViewLayout
のサブクラスを持ち、セルを円に配置します。 レイアウトは、shouldInvalidateLayoutForBoundsChange:
の場合はYES
を返します。 回転に、初期位置にあるセルがフェードアウトし、最終 位置にあるセルがフェードイン。UICollectionView/UICollectionViewLayoutの回転または境界の変更でクロスフェードを無効にする最適な方法は何ですか?
私のレイアウトに次のコードを追加することにより、私はフェードを無効にすることができ、アイテムの 円は、単にに表示されます姿勢の変化に伴って回転:ドキュメントが は、彼らが示唆していないようなので、
- (UICollectionViewLayoutAttributes *)initialLayoutAttributesForAppearingItemAtIndexPath:(NSIndexPath *)itemIndexPath {
return nil;
}
- (UICollectionViewLayoutAttributes *)finalLayoutAttributesForDisappearingItemAtIndexPath:(NSIndexPath *)itemIndexPath {
return [self layoutAttributesForItemAtIndexPath:itemIndexPath];
}
はなぜな方法は、境界の変化に呼ばれるのですか?ドキュメントには、コレクションビューからのアイテムの挿入と削除に関連する という名前が付けられているようです。
ローテーション中にクロスフェードを無効にするより良い方法はありますか?
注:
initialLayoutAttributesForAppearingItemAtIndexPath:
ドキュメント は、デフォルトではメソッドがnil
を返しますがsuper
には 非nilの値を返さ呼び出すと述べています。- 私はUICollectionView方法
deleteItemsAtIndexPaths:
、moveItemAtIndexPath:toIndexPath:
とinsertItemsAtIndexPaths:
にシンボリックブレイクポイントを設定し、それらのどれもが回転中にヒットされていません。
これは暗闇の中の単なるショットですが、回転アニメーションを無効にするために、回転操作のために完全にコアアニメーションを停止することができます:[CATransaction begin]; [CATransaction setValue:(id)kCFBooleanFalse forKey:kCATransactionDisableActions]; //あなたの回転を行います [CATransaction commit]; – maz
おそらく、内部的に境界の変更が行われ、項目が削除されて追加され、その結果メソッドが呼び出されることがあります。理由については、-deleteItemsAtIndexPaths:と-insertItemsAtIndexPaths:は呼び出されません..ここでのヒントはありません。おそらく、UIKitのプログラマーは、挿入と削除を実行するためにAPIを不正行為し、避けたのでしょうか?前例がない。 – maz
ここで説明するように、ビューのバッキングレイヤーで暗黙のアニメーションを無効にできますか?http://stackoverflow.com/questions/2244147/disabling-implicit-animations-in-calayer-setneedsdisplayinrect/2244734#2244734? –