フレームサイズを変更しながらUICollectionViewのレイアウトを変更するエフェクトを作成しようとしています
最初、collectionViewレイアウトは「サムネイル」ギャラリースタイルの全画面を表示します。
フレームを薄いストリップにサイズ変更した後-「フィルムストリップ」スタイルのレイアウトを提示したい
どちらのレイアウトも独立して正常に機能し、期待どおりに機能します。
私はこれに似たコードを試しました:
[UIView animateWithDuration:1
delay:0.0
options:UIViewAnimationOptionCurveEaseOut
animations:^{
self.collectionview.frame = newFrame; // animate the frame size
}
completion:^(BOOL finished) {
[self.collectionView.collectionViewLayout invalidateLayout];
[self.collectionView setCollectionViewLayout:filmstriplayout animated:YES]; // now set the new layout
}];
しかし、それは非常に途切れ途切れに見え、予想どおりにサイズ変更されていません。
変更をアニメーション化しながら、コレクションビューのレイアウトとフレームサイズを同時に変更できる方法はありますか?
具体的な答えはありませんが、考慮すべきいくつかの提案があります。
UICollectionView
は常にレイアウトインスタンスの切り替えを適切に処理するわけではありません。ここに良い 問題といくつかの回避策の議論 があります。
しかし、実際に機能したのは、レイアウトモードを切り替える方法を知っている単一のレイアウトオブジェクトに両方のレイアウトを実装することでした。バッチ更新ブロックでレイアウトモードを切り替えると、2つの異なるレイアウトインスタンスでsetCollectionViewLayout
を使用するよりも問題が少ないことがわかりました。
[self.collectionView performBatchUpdates:^{
MyLayout *layout = (MyLayout *)self.collectionView.collectionViewLayout;
layout.mode = otherLayoutMode;
} completion:nil];
最初にgridItemSize = CGSizeMake(98, 98);
のようにグリッドアイテムのサイズを設定してから、UICollectionViewのバッチアクションを実行します。コレクションビューのアイテムは、アニメーションによってサイズが変化します。 :)
- (CGSize)collectionView:(UICollectionView *)collectionView
layout:(UICollectionViewLayout*)collectionViewLayout
sizeForItemAtIndexPath:(NSIndexPath *)indexPath {
return CGSizeMake(gridItemSize.width, gridItemSize.height);
}
[self.collectionview performBatchUpdates:^{
[self.collectionview.collectionViewLayout invalidateLayout];
[self.collectionview setCollectionViewLayout:self.collectionview.collectionViewLayout animated:YES];
} completion:^(BOOL finished) {
}];
UICollectionViewLayout
が機能していないようで、アニメーションブロックでlayoutIfNeeded
と呼ばれるカスタムperformBatchUpdates
でサイズ変更をアニメーション化していました。 setCollectionViewLayout
を追加しても違いはないようです
UIView.animate(withDuration: 0.2, animations: {
let layout = self.collectionView.collectionViewLayout as! CustomFlowLayout
self.collectionView.collectionViewLayout.invalidateLayout()
let size = smallCollection
? CGSize(width: 44, height: 44)
: CGSize(width: 120, height: 120)
layout.size = size
self.collectionView.layoutIfNeeded()
})