Saya menggunakan UICollectionView
dengan UICollectionViewFlowLayout
.
Saya mengatur ukuran setiap sel melalui
collectionView:layout:sizeForItemAtIndexPath:
Saat beralih dari potret ke lanskap, saya ingin menyesuaikan ukuran setiap sel agar benar-benar sesuai dengan ukuran CollectionView, tanpa meninggalkan ruang bantalan antar sel.
Pertanyaan:
1) Bagaimana cara mengubah ukuran sel setelah acara rotasi?
2) Dan, lebih baik lagi, bagaimana membuat tata letak di mana sel-sel selalu sesuai dengan seluruh ukuran layar?
ios
uicollectionview
uicollectionviewcell
Fmessina
sumber
sumber
sizeForItemAtIndexPath
sebelum memanggildidRotateFromInterfaceOrientation
. Namun, untuk tampilan koleksi dengan beberapa sel di layar, membatalkan tata letak sebelum rotasi menyebabkan lompatan ukuran yang terlihat dan tidak menyenangkan sebelum tampilan berputar. Dalam hal ini, saya yakin jawaban saya masih merupakan implementasi yang paling benar.I would like to adjust the size of each cell to **completely fit the size of the CollectionView**
solusi yang tepat yang diusulkan dalam jawaban saya. Jika Anda dapat memasukkan solusi saya dalam jawaban Anda dan mencatat pendekatan mana yang paling berhasil dalam kondisi apa yang cukup baik untuk saya.Jawaban:
1) Anda dapat memelihara dan menukar beberapa objek tata letak, tetapi ada cara yang lebih sederhana. Cukup tambahkan yang berikut ini ke
UICollectionViewController
subkelas Anda dan sesuaikan ukurannya sesuai kebutuhan:Memanggil
-performBatchUpdates:completion:
akan membatalkan tata letak dan mengubah ukuran sel dengan animasi (Anda bisa meneruskan nil ke kedua parameter blok jika Anda tidak memiliki penyesuaian tambahan untuk dilakukan).2) Daripada melakukan hardcode ukuran item
-collectionView:layout:sizeForItemAtIndexPath
, cukup bagi tinggi atau lebar batas collectionView dengan jumlah sel yang ingin Anda muat di layar. Gunakan tinggi jika collectionView Anda menggulir secara horizontal atau lebarnya jika menggulir secara vertikal.sumber
[self.collectionView.collectionViewLayout invalidateLayout];
?invalidateLayout
akan menggambar ulang sel dengan ukuran yang benar, tetapi-performBatchUpdates:completion:
akan menghidupkan perubahan, yang IMHO terlihat jauh lebih bagus.didRotateFromInterfaceOrientation
tidak digunakan lagi di iOS 8coordinator.animateAlongsideTransition
diviewWillTransitionToSize
, dan memanggilperformBatchUpdates
dalam nyaanimation
blok. Ini memberikan efek animasi yang bagus.Jika Anda tidak ingin animasi tambahan dibawa oleh
performBatchUpdates:completion:
, cukup gunakaninvalidateLayout
untuk memaksa collectionViewLayout memuat ulang.sumber
Saya memecahkan menggunakan dua UICollectionViewFlowLayout. Satu untuk potret dan satu untuk lanskap. Saya menetapkannya ke collectionView saya secara dinamis di -viewDidLoad
Kemudian saya hanya memodifikasi Metode collectionViewFlowLayoutDelgate saya seperti ini
Terakhir saya beralih dari tata letak ke tata letak lainnya pada rotasi
sumber
Ada cara sederhana untuk menyetel ukuran sel tampilan koleksi:
Tidak yakin apakah itu bisa dianimasikan.
sumber
Swift: Sel Tampilan Koleksi yang n% dari tinggi layar
Yang saya butuhkan adalah sel dengan persentase tertentu dari tinggi tampilan, dan akan diubah ukurannya dengan rotasi perangkat.
Dengan bantuan dari atas, inilah solusinya
sumber
Jika Anda menggunakan
autolayout
. Anda hanya perluinvalidate layout
di pengontrol tampilan saat memutar dan menyesuaikanoffset
di subkelas tata letak aliran Anda.Jadi, Dalam pengontrol tampilan Anda -
Dan di
FlowLayout Subclass
sumber
willRotateToInterfaceOrientation
sudah tidak digunakan lagi di iOS 8 tetapi jugaviewWillTransitionToSize
berfungsi untuk ini.