Ini membuatku gila! Saya memiliki UICollectionViewController seperti yang ditunjukkan di bawah ini:
class PhrasesCompactCollectionViewController: UICollectionViewController
NumberOfSections dan cellForItemAt dipanggil tetapi sizeForItemAtIndexPath tidak pernah dipanggil. Saya menggunakan kode yang sama persis di tempat lain dan itu diaktifkan dengan benar. Saya menggunakan Xcode 8 Beta 6.
func collectionView(collectionView: UICollectionView,
layout collectionViewLayout: UICollectionViewLayout,
sizeForItemAtIndexPath indexPath: NSIndexPath) -> CGSize {
return CGSize(width: 120, height:120)
}
Di Swift 3+ Gunakan metode ini:
func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAt indexPath: IndexPath) -> CGSize { return CGSize(width:(collectionView.frame.height-90)/2, height: 100) }
Pastikan kelas Anda mematuhi kedua Delegasi
UICollectionViewDelegate
UICollectionViewDelegateFlowLayout
sumber
UICollectionViewDelegate
seperti yang sudah dilakukan UICollectionViewController.Saya memiliki masalah yang sama. Satu hal yang membantu saya adalah membuat 'Estimated Size' untuk Cell Size di bawah collectionView size inspector 'None'.
sumber
sizeForItemAt
gagal menyebutkan ini. Sangat berguna.sizeForItemAt
berfungsi dengan baik hingga Xcode 11.4 ketika tiba-tiba selnya salah lebar. Mencoba banyak hal dan ini akhirnya berhasil.Cepat 5
Semua langkah ini diperlukan :
UICollectionViewDelegate, UICollectionViewDataSource
collectionView.delegate = self
dancollectionView.dataSource = self
sebagai :
func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAt indexPath: IndexPath) -> CGSize { return CGSize(width: 100, height:100) }
sumber
Cepat 3
Untuk mengatur Ukuran Sel UICollectionView, Anda perlu membuat dan menyesuaikan objek
UICollectionViewFlowLayout
. Sesuaikan properti dan setel objek layout itu ke objek UICollectionView.Ubah objek cellheight dan cellWidth sesuai dengan kebutuhan Anda (sel tinggi dan lebar yang Anda inginkan).
override func viewDidLoad() { super.viewDidLoad() let cellWidth : CGFloat = myCollectionView.frame.size.width / 4.0 let cellheight : CGFloat = myCollectionView.frame.size.height - 2.0 let cellSize = CGSize(width: cellWidth , height:cellheight) let layout = UICollectionViewFlowLayout() layout.scrollDirection = .vertical //.horizontal layout.itemSize = cellSize layout.sectionInset = UIEdgeInsets(top: 1, left: 1, bottom: 1, right: 1) layout.minimumLineSpacing = 1.0 layout.minimumInteritemSpacing = 1.0 myCollectionView.setCollectionViewLayout(layout, animated: true) myCollectionView.reloadData() }
Pastikan: jika Anda menambahkan metode sizeForItemAt indexPath maka harus HAPUS metode ...
func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAt indexPath: IndexPath) -> CGSize { }
sumber
Kelas pertama perlu mengonfirmasi ke UICollectionViewDelegateFlowLayout. Kemudian Anda perlu menulis kode berikut di viewDidLoad ():
// Untuk memberi tahu UICollectionView agar menggunakan metode UIViewController UICollectionViewDelegateFlowLayout Anda
collectionView.delegate = self
// Jika Anda ingin menyetel tata letak aliran tampilan koleksi Anda sendiri
let layout = UICollectionViewFlowLayout() layout.scrollDirection = .vertical //depending upon direction of collection view self.collectionView?.setCollectionViewLayout(layout, animated: true)
Dengan menggunakan kode ini metode UICollectionViewDelegateFlowLayout
func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAt indexPath: IndexPath) -> CGSize
akan dipanggil, Anda dapat mengatur ukuran dalam metode ini.
sumber
Tiga hal yang perlu Anda periksa jika tidak ada jawaban yang berhasil:
Menerapkan Delegasi FlowLayout:
class MyController: UICollectionViewController, UICollectionViewDelegateFlowLayout
Gunakan metode ukuran item untuk swift 3.0+:
func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAt indexPath: IndexPath) -> CGSize { return CGSize(width: (collectionView.frame.width / 3) - 1, height: collectionView.frame.width) }
Pilih
Estimate size = None
di elemen Inspect dari UICollectionView.sumber
Saya memiliki masalah yang sama dan tidak ada yang dapat memperbaikinya. Saya mendapat peringatan kuning yang mengatakan untuk membuatnya pribadi karena itu mendekati fungsi lain yang ditentukan oleh Delegasi Tata Letak. Yang memperbaikinya untuk saya adalah:
Perhatikan perbedaan dari "sizeForItemAtIndexPath" ke "sizeForItemAt" yang benar.
Saya merobek rambut saya selama berhari-hari mencoba mencari tahu dan akhirnya berhasil. Di bawah ini saya akan menyertakan semua fungsi saya untuk menunjukkan kepada Anda bagaimana saya juga "menyembunyikan" sel dengan membuat tingginya sama dengan 0.
func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAt indexPath: IndexPath) -> CGSize { let findIndex = labelArray.index(of: "\(labelArray[indexPath.row])") let screenSize = UIScreen.main.bounds let screenWidth = screenSize.width if (findIndex! % 2 == 0){ // Even index, show cell return CGSize(width: screenWidth, height: 246) } else { return CGSize(width: screenWidth, height: 0) } }
sumber
Pastikan Anda meletakkan ini di viewDidLoad ()
collectionView.delegate = self
sumber
Saya mengalami masalah ini tadi malam. Akhirnya menyelesaikannya pada tengah malam ketika saya menyadari metode 'didSelectItemAtIndex' tidak ditutup dengan braket penutupan "}"
Saya menambahkan braket penutup di bagian paling bawah kelas ketika ditanya oleh kesalahan kompilasi. Jadi pada dasarnya semua metode di bawah 'didSelectItemAtIndex' ada di dalam metode itu.
Posting di sini untuk berjaga-jaga kalau-kalau ada orang lain yang menyia-nyiakan 4 jam malam mereka untuk yang satu ini :-(
sumber
masalah saya adalah bahwa saya membuat objek UICollectionViewDataSource saya sebagai variabel lokal. Jadi, jika Anda menginisialisasi objek dataSource secara manual dalam kode, pastikan untuk menyimpannya sebagai variabel global.
sumber
Gunakan metode ini
func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAt indexPath: IndexPath) -> CGSize { }
Dari pada
private func collectionView(collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAtIndexPath indexPath: NSIndexPath) -> CGSize { }
sumber
Cukup tambahkan: UICollectionViewDelegateFlowLayout
class YourClass: UIViewController, UICollectionViewDelegate, UICollectionViewDataSource, UICollectionViewDelegateFlowLayout {}
sumber
Bagi saya (di Swift 3.1) metode tersebut harus diumumkan ke publik seperti ini:
public func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAt indexPath: IndexPath) -> CGSize { return CGSize() }
Jangan lupa untuk mempublikasikannya .
sumber
public
adalah apa yang Anda gunakan untuk membuat kode Anda dapat diakses antara kerangka kerja dan modul.