21

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

しかし、それは非常に途切れ途切れに見え、期待どおりにサイズ変更されません.

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

4

3 に答える 3

21

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

UICollectionView常にレイアウト インスタンスの切り替えを適切に処理するとは限りません。ここでは、問題といくつかの回避策についての適切な説明を示します。

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

[self.collectionView performBatchUpdates:^{
    MyLayout *layout = (MyLayout *)self.collectionView.collectionViewLayout;
    layout.mode = otherLayoutMode;
} completion:nil];
于 2013-09-08T22:12:13.273 に答える
-3

CollectionView を更新するときはいつでも、これを使用する簡単なトリックを次に示します。

[self.collectionView removeFromSuperview]; //First remove the Collection View

//Relocate the view with layouts
UICollectionViewFlowLayout *layout=[[UICollectionViewFlowLayout alloc] init];
layout.scrollDirection = UICollectionViewScrollDirectionHorizontal;
layout.minimumInteritemSpacing = 10;
layout.minimumLineSpacing = 10;

 self.collectionView = [[UICollectionView alloc] initWithFrame:CGRectMake(0, 0, self.view.frame.width,100) collectionViewLayout:layout];
[self.collectionView setDataSource:self];
[self.collectionView setDelegate:self];
[self.collectionView registerClass:[UICollectionViewCell class] forCellWithReuseIdentifier:@"cellIdentifier"];
[self.collectionView reloadData];

[self.view addSubview:self.collectionView];
于 2016-02-22T07:08:52.880 に答える