14

UICollectionViewLayoutセルを円に配置するサブクラスがあります。YES呼び出しのレイアウトが返されますshouldInvalidateLayoutForBoundsChange:。回転すると、最初の位置にあるセルがフェードアウトし、最後の位置にあるセルがフェードインします。

レイアウトに次のコードを追加することで、フェードを無効にすることができ、アイテムの円が向きの変化に合わせて単純に回転するように見えます。

- (UICollectionViewLayoutAttributes *)initialLayoutAttributesForAppearingItemAtIndexPath:(NSIndexPath *)itemIndexPath {
    return nil;
}

- (UICollectionViewLayoutAttributes *)finalLayoutAttributesForDisappearingItemAtIndexPath:(NSIndexPath *)itemIndexPath {
    return [self layoutAttributesForItemAtIndexPath:itemIndexPath];
}

ドキュメントではメソッドが呼び出されることを示唆していないように見えるため、境界の変更でメソッドが呼び出されるのはなぜですか? ドキュメントには、コレクション ビューからのアイテムの挿入と削除に関連して呼び出されると記載されているようです。

回転中にクロスフェードを無効にするより良い方法はありますか?

ノート:

  • initialLayoutAttributesForAppearingItemAtIndexPath:ドキュメントには、デフォルトでメソッドは戻りますが、返された非 nil 値nilを呼び出すと記載されています。super
  • UICollectionViewメソッド deleteItemsAtIndexPaths:にシンボリックブレークポイントを設定しましたが、ローテーション中にヒットするものはありませんmoveItemAtIndexPath:toIndexPath:insertItemsAtIndexPaths:
4

1 に答える 1

11

UICollectionViewLayout.hファイルの状態

// This set of methods is called when the collection view undergoes an
     animated transition such as a batch update block or an animated 
     bounds change.
// For each element on screen before the invalidation, 
     finalLayoutAttributesForDisappearingXXX will be called and an 
     animation setup from what is on screen to those final attributes.
// For each element on screen after the invalidation, 
     initialLayoutAttributesForAppearingXXX will be called an an 
     animation setup from those initial attributes to what ends up on 
     screen.

これは、境界の変更で呼び出されることを明確に示しています。取り外し/挿入よりも、「古い状態」と「新しい状態」の方が正確に見えます。

于 2012-10-11T07:55:07.617 に答える