6

UICollectionView に多数の画像セルを表示しています。1 つのボタンで、すべてのセルを最初のセルにグループ化できるようにしたいと考えています。

これはうまく機能していますが、アニメーション トランジションを再グループ化アクションに追加しようとしても、何も起こりません。

カスタムレイアウトで使用する方法は次のとおりです。

- (NSArray*)layoutAttributesForElementsInRect:(CGRect)rect
{
    NSArray* allAttributesInRect = [super layoutAttributesForElementsInRect:rect];

    if([allAttributesInRect count] > 0 && _isRegroup)
    {
        UICollectionViewLayoutAttributes *firstAttribute = [allAttributesInRect objectAtIndex:0];
        CGRect frame = firstAttribute.frame;

        for(UICollectionViewLayoutAttributes *attribute in allAttributesInRect)
            [UIView animateWithDuration:0.3f animations:^{attribute.frame = frame;}];
    }
    return allAttributesInRect;
}

- (void)regroupCells:(BOOL)isRegroup // This method is called from my collection controller when my button is pressed
{
    _isRegroup = isRegroup;
    [self invalidateLayout];
}

何か案が ?ありがとう !

4

1 に答える 1

22

アニメーションは、呼び出し元のメソッド内からは機能しません。

レイアウトを変更して新しいものにアニメーション化する最も簡単な方法は、 for each ブロック パラメーターを使用performBatchUpdatesして、コレクション ビューを呼び出すことです。nilこれにより、レイアウトが無効になり、新しいレイアウトにアニメーション化されます。

これを行う前に、新しいレイアウトを作成することをレイアウト オブジェクトに伝えます。また、内部layoutAttributesForElementsInRectでは、ブール変数を確認し、グループ化されたフレーム (おそらく中央の方がよいでしょう) をすべての属性に適用しますが、アニメーションは使用しません。また、このコードを で再現する必要がありますlayoutAttributesForElementAtIndexPath

つまり、要約すると:

  1. 無効なレイアウト呼び出しをある場所から削除します
  2. アニメーション呼び出しを元の場所から削除し、レイアウト属性を修正するだけです
  3. ..forElementAtIndexPath コードも追加します
  4. ビュー コントローラーで、レイアウト オブジェクトの regroup メソッドを呼び出してから、コレクション ビューの performBatchupdates を呼び出します。
于 2012-10-21T16:12:20.413 に答える