デバイスを回転させるUICollectionView
と、カスタム レイアウト (のサブクラス) で不思議な動作が見られます。UICollectionViewLayout
単純な水平方向にスクロールするセルの行があります。デバイスを縦向きから横向きに回転すると、以前は表示されなかった追加のセルが表示され、それらの表示されたセルのアニメーションが正しくありません (おなじみのゴースト効果を使用します。これは、コレクション ビューのデフォルトのアニメーション効果のようなものだと思います)。レイアウト)。このアニメーションの左端にセルが表示されていることに注意してください。
カスタム レイアウトの設定に関する詳細:
shouldInvalidateLayoutForBoundsChange:
戻りますYES
。- In
layoutAttributesForItemAtIndexPath:
は、属性がまだ作成されていない場合、属性をディクショナリにキャッシュします。 - では
layoutAttributesForElementsInRect:
、どのセルを表示するかを手動で計算し、centre
その属性を返す前に毎回プロパティを微調整します。
次に、初期/最終レイアウト属性を処理する次のコードがあります。
- (void)prepareForAnimatedBoundsChange:(CGRect)oldBounds
{
[super prepareForAnimatedBoundsChange:oldBounds];
self.animatingBoundsChange = YES;
}
- (void)finalizeAnimatedBoundsChange
{
[super finalizeAnimatedBoundsChange];
self.animatingBoundsChange = NO;
}
- (UICollectionViewLayoutAttributes *)initialLayoutAttributesForAppearingItemAtIndexPath:(NSIndexPath *)itemIndexPath
{
if (self.animatingBoundsChange) {
// If the view is rotating, appearing items should animate from their current attributes (specify `nil`).
// Both of these appear to do much the same thing:
//return [self layoutAttributesForItemAtIndexPath:itemIndexPath];
return nil;
}
return [super initialLayoutAttributesForAppearingItemAtIndexPath:itemIndexPath];
}
- (UICollectionViewLayoutAttributes *)finalLayoutAttributesForDisappearingItemAtIndexPath:(NSIndexPath *)itemIndexPath
{
if (self.animatingBoundsChange) {
// If the view is rotating, disappearing items should animate to their new attributes.
return [self layoutAttributesForItemAtIndexPath:itemIndexPath];
}
return [super finalLayoutAttributesForDisappearingItemAtIndexPath:itemIndexPath];
}
新しく表示されたセルの初期レイアウト属性がどういうわけか正しくないように思えます (結局のところ、正しい場所で終了します)。しかしcenter
、メソッドから返されたレイアウト属性のプロパティをログに記録するinitalLayout...
と、すべてが正しく表示され、水平軸に沿ってすべて均等に配置されます。
正しくアニメーション化されていないセルの唯一の特徴は、メソッドが呼び出され[collectionView visibleCells]
たときにそのセルが配列に返されないことです。initialLayout...
ただし、そのlayoutAttributesForElementsInRect:
前にある は、そのレイアウト属性が必要であることを正しく識別します。
どうしたの?フードの下で何が起こっているかについてのいくつかの洞察はとても役に立ちます...UICollectionView
巨大なブラックボックスのようです.