7

デバイスを回転させるUICollectionViewと、カスタム レイアウト (のサブクラス) で不思議な動作が見られます。UICollectionViewLayout

単純な水平方向にスクロールするセルの行があります。デバイスを縦向きから横向きに回転すると、以前は表示されなかった追加のセルが表示され、それらの表示されたセルのアニメーションが正しくありません (おなじみのゴースト効果を使用します。これは、コレクション ビューのデフォルトのアニメーション効果のようなものだと思います)。レイアウト)。このアニメーションの左端にセルが表示されていることに注意してください。

UICollectionViewRotationGhosting

カスタム レイアウトの設定に関する詳細:

  • shouldInvalidateLayoutForBoundsChange:戻りますYES
  • InlayoutAttributesForItemAtIndexPath:は、属性がまだ作成されていない場合、属性をディクショナリにキャッシュします。
  • では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巨大なブラックボックスのようです.

4

1 に答える 1

0

Arun_kが にリンクした回答に基づいて、表示されている新しいセルinitialLayoutAttributesForAppearingItemAtIndexPath:以外に別のものを返す必要があるようです。既に画面に表示されているセルに対しては機能しますが、新しいセルに対して返すのは適切ではない可能性があります。おそらく、このメソッドですべてのセルに固定値を返すことで、新しく挿入されたセルのアニメーション動作が変更されるかどうかを確認し、そこから先に進むことができます。nilnilUICollectionViewLayoutAttributes

この質問は、この問題にさらに光を当てます: initialLayoutAttributesForAppearingItemAtIndexPath は、挿入されたセルだけでなく、すべての可視セルに対して発生します。

于 2013-10-31T15:57:30.170 に答える