2013-10-22 8 views
7

UICollectionViewからデバイスを回転させるときのカスタムレイアウト(サブクラス:UICollectionViewLayout)の不思議な動きがあります。カスタムレイアウトのUICollectionViewインターフェイスローテーション

私は単純に水平にスクロールするセルの行を持っています。デバイスをポートレートからランドスケープに回転させると、以前は表示されなかった追加のセルが表示され、表示されるセルのアニメーションが間違っています(コレクションビューのデフォルトのアニメーションエフェクトレイアウト)。ここまでアニメーションで左に表示されたセルに注意してください:

UICollectionViewRotationGhosting

カスタムレイアウトのセットアップに関するいくつかの詳細:

  • shouldInvalidateLayoutForBoundsChange:戻りYES
  • 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]; 
} 

それ(初期レイアウトが新たに出現したセルの属性は何とか右ではないように私には思えます結局のところ正しい位置にがあります)。しかし、initalLayout...メソッドから返されたレイアウト属性のcenterプロパティを記録すると、すべてが正しいように見えます。すべてが水平軸に沿って均等に配置されています。

initialLayout...メソッドが呼び出されると、正しくアニメーション化されないセルの唯一の特徴は、そのセルが[collectionView visibleCells]の配列に返されないことです。しかし、その前にあるlayoutAttributesForElementsInRect:は、そのレイアウト属性が必要であることを正しく認識します。

何が起こっているのですか?フードの下で何が起こっているのかについてのいくつかの洞察はとても役に立ちます... UICollectionViewは大規模なブラックボックスのようです。

+0

http://stackoverflow.com/questions/12649271/what-is-the-best-best-way-to-disable-cross-fades- on-uicollectionview-uicollectio?rq = 1 –

+0

移行がスムーズに行えないことが検出された場合、つまりこのシナリオでは、既存のセルと衝突するすべてのセルでクロスフェードアニメーションが使用されます。これは、iOS7のUICollectionViewsのWWDCビデオに記載されています。 – Tim

+0

@Arun_kその質問はこれに関連するようには見えません。なぜ彼らは 'initial/finalLayout ...なぜ?'は回転中に呼び出され、実際には、上記のようにコードを追加するとクロスフェードアニメーションが__prevents__することが確認されます。この質問は、アニメーション境界の変更に続いて表示される追加のセルに関するものです。 – Stuart

答えて

0

the answer that Arun_k linked toに貼り付けた場合、表示されている新しいセルに以外の何かを返す必要があるようです。nilnilはすでに画面に表示されているセルに対しては機能しますが、新しいセルに戻るには適切ではない可能性があります。おそらく、このメソッド内のすべてのセルに固定のUICollectionViewLayoutAttributesという値を返すことで遊んで、新しく挿入されたセルのアニメーション動作を変更してそこから進んでいるかどうかを確認できます。

この質問は、この問題についても、より多くの光を当てる:initialLayoutAttributesForAppearingItemAtIndexPath fired for all visible cells, not just inserted cells

+0

返信ありがとうございます。残念ながら、私が質問したように、返された値を記録すると、すべてのセルの正しい初期位置が表示されますが、非ゼロ値( '[self layoutAttributesForItem ...]')を返すことは何の違いもありません。新たに出現する細胞。私は示唆されたように周りに遊んで、私がもう何かを見つけることができるかどうかを見ます。 – Stuart