Menganimasikan perubahan bingkai dan tata letak UICollectionView

Saya mencoba membuat efek di mana saya mengubah tata letak UICollectionView saya sambil mengubah ukuran bingkai

Awalnya tata letak collectionView menghadirkan gaya galeri "thumbnail" layar penuh.

Setelah mengubah ukuran bingkai menjadi strip tipis - saya ingin menyajikan tata letak gaya "strip film".

kedua tata letak secara independen berfungsi dengan baik dan seperti yang diharapkan.

Saya mencoba kode yang mirip dengan ini:

[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
                     }];

Namun tampilannya sangat berombak dan ukurannya tidak berubah seperti yang diharapkan.

Apakah ada cara agar saya dapat mengubah tata letak tampilan koleksi dan ukuran bingkai secara bersamaan sambil menganimasikan perubahan?


person Avner Barr    schedule 08.09.2013    source sumber
comment
Apakah Anda pernah mendapatkan solusi yang baik? performBatchUpdates:withCompletion: bagus, tetapi tidak membantu menggabungkan perubahan animasi frame atau contentOffset. Saya ingin mendapatkan ini untuk menganimasikan zoom dengan lancar kembali ke tempat tata letak saya dan contentOffset bergantung pada zoom.   -  person Benjohn    schedule 02.08.2015
comment
@Benjohn apakah Anda menemukan solusi yang bagus? Baru saja menemukan hal yang sama dan jawaban yang ada tidak ideal...   -  person aheze    schedule 21.06.2021
comment
@aheze Maaf, saya tidak tahu - ini lebih ke masa lalu daripada yang bisa saya ingat sekarang :-/   -  person Benjohn    schedule 21.06.2021


Jawaban (3)


Pertama-tama atur ukuran item kisi seperti gridItemSize = CGSizeMake(98, 98); lalu lakukan tindakan batch UICollectionView. Item dalam tampilan koleksi mengubah ukurannya dengan animasi. :)

- (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) {    
}];
person Zulqarnain    schedule 04.11.2013
comment
Ini adalah hal yang berguna, tapi bagaimana dengan perubahan bingkai animasi yang terjadi pada saat yang sama? Setara dengan itu, menurut saya, perubahan contentOffset? Saya juga membutuhkan keduanya terjadi sekaligus. - person Benjohn; 02.08.2015
comment
Dalam kasus penggunaan saya, flowLayout saya harus berbeda saat digulir dan saat statis. Apa yang saya lakukan adalah: (1) menyetel tanda di tata letak dan menggunakan kode di atas untuk membatalkan tata letak; (ke-2) scrollToIndexPath dianimasikan menggunakan collectionViewMethod default; (3) setel ulang tanda tata letak dan gunakan kembali kode di atas untuk menganimasikannya kembali ke keadaan semula. Saya tidak dapat mencapai hasil yang diinginkan dengan menganimasikannya secara bersamaan, jadi saya hanya mengantri animasinya. - person marcelosalloum; 23.10.2019
comment
[self.collectionview.collectionViewLayout invalidateLayout]; aneh di sini, ini menyebabkan bug dalam animasi. - person surfrider; 22.05.2020

Saya tidak punya jawaban spesifik, tapi ada beberapa saran untuk dipertimbangkan.

UICollectionView tidak selalu menangani peralihan contoh tata letak dengan baik. Berikut adalah diskusi yang bagus tentang masalah dan beberapa solusinya.

Namun apa yang sebenarnya saya lakukan dalam praktik dan berhasil bagi saya adalah menerapkan kedua tata letak dalam satu objek tata letak yang mengetahui cara beralih di antara mode tata letak. Saya menemukan bahwa mengganti mode tata letak dalam blok pembaruan batch tidak terlalu bermasalah dibandingkan menggunakan setCollectionViewLayout dengan dua contoh tata letak berbeda:

[self.collectionView performBatchUpdates:^{
    MyLayout *layout = (MyLayout *)self.collectionView.collectionViewLayout;
    layout.mode = otherLayoutMode;
} completion:nil];
person Timothy Moose    schedule 08.09.2013
comment
Apa yang Anda gunakan performBatchUpdates:? - person alltom; 09.05.2014
comment
Menetapkan instance baru selama pembaruan, serius?. Ini pada akhirnya akan membuat aplikasi Anda mogok. - person Abdul Yasin; 02.02.2021

Berikut adalah trik sederhana setiap kali Anda memperbarui CollectionView, gunakan ini:

[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];
person Shivam Singh    schedule 22.02.2016