私がやりたいのは、セルが選択されたときに UICollectionViewCell のサイズを変更し、その変更をアニメーション化することです。セルを選択済みとしてマークしcollectionView: didSelectItemAtIndexPath:
、reloadData
UICollectionView を呼び出して、選択されたセルを異なるサイズで表示することで、アニメーション化せずにすでにこれを実現しています。
しかし、これはすべて一度に起こるので、サイズの変化をアニメーション化する方法はまったくわかりません。何かアイデアはありますか?
すでに見つけた選択時に uicollectionview セルをアニメーション化するしかし、その答えは私にとっては漠然としており、それが私の場合にも役立つかどうかはまだわかりません。
ベストアンサー1
Chase Roberts の助けを借りて、私は問題の解決策を見つけました。私のコードは基本的に次のようになります。
// Prepare for animation
[self.collectionView.collectionViewLayout invalidateLayout];
UICollectionViewCell *__weak cell = [self.collectionView cellForItemAtIndexPath:indexPath]; // Avoid retain cycles
void (^animateChangeWidth)() = ^()
{
CGRect frame = cell.frame;
frame.size = cell.intrinsicContentSize;
cell.frame = frame;
};
// Animate
[UIView transitionWithView:cellToChangeSize duration:0.1f options: UIViewAnimationOptionCurveLinear animations:animateChangeWidth completion:nil];
さらに詳しい説明:
最も重要なステップの 1 つは、使用している
invalidateLayout
の呼び出しですUICollectionView.collectionViewLayout
。これを忘れると、セルがコレクションの境界を越えて大きくなる可能性が高くなります。これはおそらく望ましくないことです。また、コードでは、ある時点でセルの新しいサイズをレイアウトに表示する必要があることも考慮してください。私の場合 ( を使用UICollectionViewFlowLayout
) では、変更されたセルの新しいサイズを反映するようにメソッドを調整しました。その部分を忘れると、最初に を呼び出してサイズの変更をアニメーション化しようとしても、collectionView:layout:sizeForItemAtIndexPath
セルのサイズにはまったく変化がありません。invalidateLayout
最も奇妙(少なくとも私にとっては)だが重要なことは、
invalidateLayout
ないアニメーション ブロック内。そうすると、アニメーションはスムーズに表示されず、不具合やちらつきが発生します。アニメーション化したいのはコレクション全体ではなくセルであるため、コレクションビュー全体ではなくセルを引数として
UIView
sメソッドを呼び出す必要があります。transitionWithView:duration:options:animations:completion:
transitionWithView
セルのメソッドを使用して
intrinsicContentSize
必要なサイズを返します。私の場合は、セルの選択状態に応じて、セルの幅を拡大または縮小してボタンを表示または非表示にします。
これが誰かの役に立つことを願っています。私の場合、そのアニメーションを正しく動作させる方法を理解するのに数時間かかりました。そのため、他の人がその時間のかかる負担から解放されるように努めています。