web-dev-qa-db-ja.com

UICollectionViewのアニメーションフレームとレイアウト変更

フレームサイズを変更しながら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
                     }];

しかし、それは非常に途切れ途切れに見え、予想どおりにサイズ変更されていません。

変更をアニメーション化しながら、コレクションビューのレイアウトとフレームサイズを同時に変更できる方法はありますか?

17
Avner Barr

具体的な答えはありませんが、考慮すべきいくつかの提案があります。

UICollectionViewは常にレイアウトインスタンスの切り替えを適切に処理するわけではありません。ここに良い 問題といくつかの回避策の議論 があります。

しかし、実際に機能したのは、レイアウトモードを切り替える方法を知っている単一のレイアウトオブジェクトに両方のレイアウトを実装することでした。バッチ更新ブロックでレイアウトモードを切り替えると、2つの異なるレイアウトインスタンスでsetCollectionViewLayoutを使用するよりも問題が少ないことがわかりました。

[self.collectionView performBatchUpdates:^{
    MyLayout *layout = (MyLayout *)self.collectionView.collectionViewLayout;
    layout.mode = otherLayoutMode;
} completion:nil];
19
Timothy Moose

最初に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) {    
}];
18
Zulqarnain

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()
})
0
richy