Saya harus melakukan beberapa operasi setiap kali UICollectionView telah dimuat sepenuhnya, yaitu pada saat itu semua metode sumber data / tata letak UICollectionView harus dipanggil. Bagaimana saya tahu itu ?? Apakah ada metode delegasi untuk mengetahui status UICollectionView dimuat?
uicollectionview
delegates
reload
Jirune
sumber
sumber
[self.collectionView removeObserver:self forKeyPath:@"contentSize" context:NULL];
untuk-viewWillDisappear:animated:
juga.Ini berhasil untuk saya:
Sintaks Swift 4:
sumber
reloadData
memuat ulangcollectionView
sehingga menggunakan metode sumber datanya lagi ... yangperformBatchUpdates
memiliki blok penyelesaian terpasang sehingga jika keduanya dilakukan pada utas utama, Anda tahu kode apa pun yang menggantikan/// collection-view finished reload
akan dieksekusi dengan segar dan ditatacollectionView
Ini sebenarnya sangat sederhana.
Saat Anda misalnya memanggil metode reloadData UICollectionView atau metode invalidateLayout layout, Anda melakukan hal berikut:
Mengapa ini berhasil:
Utas utama (di mana kita harus melakukan semua pembaruan UI) menampung antrian utama, yang bersifat serial, yaitu bekerja dengan cara FIFO. Jadi dalam contoh di atas, blok pertama dipanggil, yang mana
reloadData
metode kita sedang dipanggil, diikuti oleh apa pun di blok kedua.Sekarang utas utama juga memblokir. Jadi jika Anda
reloadData
membutuhkan 3 detik untuk dieksekusi, pemrosesan blok kedua akan ditangguhkan oleh 3 detik tersebut.sumber
reloadData
sekarang mengantrekan pemuatan sel di thread utama (bahkan jika dipanggil dari thread utama). Jadi sel tidak benar-benar dimuat (cellForRowAtIndexPath:
tidak dipanggil) setelahreloadData
dikembalikan. Kode pembungkus yang ingin Anda jalankan setelah sel Anda dimuatdispatch_async(dispatch_get_main...
dan memanggilnya setelah panggilan Anda kereloadData
akan mencapai hasil yang diinginkan.Hanya untuk menambah jawaban @dezinezync yang bagus:
Cepat 3+
sumber
Lakukan seperti ini:
sumber
Coba paksa penerusan tata letak sinkron melalui layoutIfNeeded () tepat setelah panggilan reloadData (). Tampaknya berfungsi untuk UICollectionView dan UITableView di iOS 12.
sumber
Saat dezinezync menjawab, yang Anda butuhkan adalah mengirimkan blok kode setelah
reloadData
dari aUITableView
atau ke antrean utamaUICollectionView
, dan kemudian blok ini akan dijalankan setelah sel dequeuingUntuk membuatnya lebih lurus saat menggunakan, saya akan menggunakan ekstensi seperti ini:
Ini juga dapat diterapkan ke a
UITableView
jugasumber
Pendekatan yang berbeda menggunakan RxSwift / RxCocoa:
sumber
performBatchUpdates
tidak berfungsi dalam kasus saya, yang ini berhasil. Bersulang!Ini bekerja untuk saya:
sumber
Saya memerlukan beberapa tindakan yang harus dilakukan pada semua sel yang terlihat saat tampilan koleksi dimuat sebelum terlihat oleh pengguna, saya menggunakan:
Perhatikan bahwa ini akan dipanggil saat menggulir melalui tampilan koleksi, jadi untuk mencegah overhead ini, saya menambahkan:
dan dalam aksinya itu sendiri:
Tindakan tersebut masih akan dilakukan beberapa kali, sebagai jumlah sel yang terlihat pada keadaan awal. tetapi pada semua panggilan itu, Anda akan memiliki jumlah sel terlihat yang sama (semuanya). Dan bendera boolean akan mencegahnya berjalan kembali setelah pengguna mulai berinteraksi dengan tampilan koleksi.
sumber
Saya baru saja melakukan hal berikut untuk melakukan apa pun setelah tampilan koleksi dimuat ulang. Anda dapat menggunakan kode ini bahkan dalam respons API.
sumber
Solusi terbaik yang saya temukan sejauh ini adalah menggunakan
CATransaction
untuk menangani penyelesaian.Cepat 5 :
sumber
Def lakukan ini:
Kemudian panggil seperti ini di dalam VC Anda
Pastikan Anda menggunakan subclass !!
sumber
Ini bekerja untuk saya:
sumber
Cukup muat ulang collectionView di dalam pembaruan batch dan kemudian periksa di blok penyelesaian apakah sudah selesai atau belum dengan bantuan boolean "finish".
sumber
Di bawah ini adalah satu-satunya pendekatan yang berhasil bagi saya.
sumber
Beginilah cara saya memecahkan masalah dengan Swift 3.0:
sumber
Coba ini:
sumber
Anda bisa melakukan seperti ini ...
sumber