2013-11-22 1 views
9

私はコレクションビューを持っています。セルをタップすると画面全体を占めるようになります。これを達成するために、私は本質的にはdidSelectItemAtIndexPathの中にperformBatchUpdatesを呼び出し、sizeForItemAtIndexPathは選択されたセルのより大きなサイズを返すことを知っています。これはすべて正常に機能し、細胞は必要に応じて増殖し、収縮します。コレクションビューのセルの内側のビューをアニメーション化してサイズを変更するにはどうすればよいですか?

問題はセルの内部です。コレクションビューセルは、制約によって管理される適度に複雑なビュー階層で構成されます。アニメーション化されたセルで、セルのサブビューを拡大して縮小したい。残念ながら、私のサブビューは、新しいサイズにゆっくりとアニメーション化されるので、新しい位置にすぐにスナップしています。どのようにしてセルの内容がセルサイズでアニメーション化されるようにすることができますか?私は正確に同じ問題を抱えていた

- (CGSize) collectionView:(UICollectionView *)collectionView layout:(UICollectionViewLayout *)collectionViewLayout sizeForItemAtIndexPath:(NSIndexPath *)indexPath { 
if ([collectionView.indexPathsForSelectedItems containsObject:indexPath]) 
    return CGSizeMake(collectionView.bounds.size.width - 20, collectionView.bounds.size.height - (20 + [self.topLayoutGuide length])); 
else 
    return CGSizeMake(260, 100); 
} 

- (void) collectionView:(UICollectionView *)collectionView didSelectItemAtIndexPath:(NSIndexPath *)indexPath { 
    [collectionView performBatchUpdates:nil completion:nil]; 
} 
+1

拡張されるセルを示すフラグが偽から真に切り替わり、 'layoutSubviews'が呼び出され、サブビューを直ちに展開された位置に移動するため、サブビューがスナップする可能性が最も高いです。私はちょうど推測している - あなたがコードを追加した場合、それが当てはまるかどうかを見ることができます。もう1つの注意点 - セルがコレクション内の他のセルの上に展開されるか、それとも途中で押し出されるべきか?上に展開する必要がある場合は、UICollectionViewの上に新しいビューを追加してアニメーション化することをお勧めします。 – Ian

+0

選択時にサイズ変更を行う2つの関連メソッドを追加しました。 View Controllerには他のコードはほとんどありません。セル自体はいくつかのnibファイルですが、投稿に簡単に追加することはできません。 – Mike

答えて

11

:ここ

はコレクションビューコントローラから2つの関連メソッドです。多くの試行の後、次のコードは私のためのトリックでした。 3.0のバッチ更新の直後にlayoutIfNeedを呼び出すと(バッチ更新期間)、制約がアニメートされます。

[self performBatchUpdates:nil completion:nil]; 

// IndexPath of cell to be expanded 
UICollectionViewCell *cell = [self cellForItemAtIndexPath:indexPath]; 
[UIView animateWithDuration:0.3 animations:^{ 
    [cell.contentView layoutIfNeeded]; 
}]; 
+0

ありがとうございました。 – logancautrell

+0

はい、これはうまくいきます、私はそれを使って同じ問題を解決しました – Sherlock

2

私はアントワーヌの答えを広げたいと思います。アニメーションブロック内にperformBatchUpdates:completion:を呼び出すと、実際にはセルのサイズ変更の継続時間が設定され、コンテンツのサイズ変更に合わせられます。

[UIView animateWithDuration:0.3 animations:^{ 
    [self performBatchUpdates:^{ 
     // set flags needed for new cell size calculation 
    } completion:nil]; 
    [collectionView layoutIfNeeded]; 
}]; 

この方法でも、アニメーションのタイミングで再生したり、春のアニメーションを使用することもできます。

0

私は同じ問題があります。これらをCollectionViewCellのサブクラスに追加します。わたしにはできる。

// ProblematicCollectionViewCell.swift 

override func apply(_ layoutAttributes: UICollectionViewLayoutAttributes) { 
    super.apply(layoutAttributes) 
    layoutIfNeeded() 
} 

ここはoriganlのリンクです:https://codedump.io/share/LXZwAOOMxafU/1/uicollectionviewcell---contents-do-not-animate-alongside-cell39s-contentview答えはコメントです。

関連する問題