Saya baru mulai belajar tentang UICollectionViews. Saya ingin tahu apakah ada yang tahu bagaimana menentukan jumlah kolom dalam collectionview. Default diatur ke 3 (iPhone / potret). Saya telah melihat dokumentasinya dan sepertinya tidak dapat menemukan jawaban yang ringkas.
100
UICollectionView
pada dasarnya saya gunakan sebagai kisi karena saya tahu saya hanya ingin 4 kolom. Saya melakukan ini dengan membuat sel saya berukuran tertentu, dan jarak di antara mereka berukuran tertentu sehingga tampilan koleksi hanya menampilkan 4 kolom, apa pun orientasinya. Apakah ini serupa dengan yang Anda butuhkan?Jawaban:
CollectionView sangat kuat, dan harganya mahal. Banyak, dan banyak pilihan. Seperti kata omz:
Saya menyarankan untuk menerapkan
<UICollectionViewDelegateFlowLayout>
Protokol, memberi Anda akses ke metode berikut di mana Anda dapat memiliki kontrol yang lebih besar atas tata letak AndaUICollectionView
, tanpa perlu subclassing itu:collectionView:layout:insetForSectionAtIndex:
collectionView:layout:minimumInteritemSpacingForSectionAtIndex:
collectionView:layout:minimumLineSpacingForSectionAtIndex:
collectionView:layout:referenceSizeForFooterInSection:
collectionView:layout:referenceSizeForHeaderInSection:
collectionView:layout:sizeForItemAtIndexPath:
Selain itu, menerapkan metode berikut akan memaksa UICollectionView Anda memperbarui tata letaknya pada perubahan orientasi: (misalnya Anda ingin mengubah ukuran sel untuk lanskap dan membuatnya meregang)
Selain itu, berikut adalah 2 tutorial yang sangat bagus tentang
UICollectionViews
:http://www.raywenderlich.com/22324/beginning-uicollectionview-in-ios-6-part-12
http://skeuo.com/uicollectionview-custom-layout-tutorial
sumber
collectionView:layout:sizeForItemAtIndexPath:
ditangani untuk semua perangkat secara terpisah?new GridLayoutManager(mContext, 4))
(4 kolom), sangat mudah, atau hanya menggunakanLinearLayoutManager
(tentu saja hanya memiliki 1 kolom)Dengan Swift 5 dan iOS 12.3, Anda dapat menggunakan salah satu dari 4 implementasi berikut untuk mengatur jumlah item per baris di Anda
UICollectionView
sambil mengelola insets dan perubahan ukuran (termasuk rotasi).# 1. Subclassing
UICollectionViewFlowLayout
dan menggunakanUICollectionViewFlowLayout
'sitemSize
propertiColumnFlowLayout.swift:
CollectionViewController.swift:
# 2. Menggunakan
UICollectionViewFlowLayout
'sitemSize
metode# 3. Menggunakan
UICollectionViewDelegateFlowLayout
'scollectionView(_:layout:sizeForItemAt:)
metode# 4. Subclassing
UICollectionViewFlowLayout
dan menggunakanUICollectionViewFlowLayout
'sestimatedItemSize
propertiCollectionViewController.swift:
FlowLayout.swift:
Cell.swift:
sumber
Saya mengimplementasikan
UICollectionViewDelegateFlowLayout
pada sayaUICollectionViewController
dan mengganti metode yang bertanggung jawab untuk menentukan ukuran Cell. Saya kemudian mengambil lebar layar dan membaginya dengan persyaratan kolom saya. Misalnya, saya ingin memiliki 3 kolom pada setiap ukuran layar. Jadi, inilah tampilan kode saya -sumber
Memperluas jawaban noob:
Hal ini memungkinkan adanya jarak antar sel. Ini mengasumsikan
Int
variabel anggota yang dipanggilnumberOfItemsPerRow
dan juga bahwa semua sel berbentuk persegi dan berukuran sama. Seperti dicatat dalam jawaban jhilgert00, kita juga harus bereaksi terhadap perubahan orientasi, tetapi sekarang dengan menggunakanviewWillTransitionToSize
aswillRotateToInterfaceOrientation
disusutkan.sumber
Berikut adalah kode yang berfungsi untuk Swift 3, untuk memiliki tata letak dua kolom:
Jangan ragu untuk mengubah "nbCol" ke jumlah kolom yang Anda inginkan.
sumber
Jika Anda malas menggunakan delegate.
PS: Harus dipanggil setelah rotasi juga
sumber
Diperbarui ke Swift 3:
Alih-alih tata letak aliran, saya lebih suka menggunakan tata letak khusus untuk nomor kolom dan nomor baris tertentu. Karena:
Sel normal dan sel Header: (Tambahkan UILabel sebagai IBOutlet ke xib Anda):
Tata letak kustom:
CollectionView:
Gunakan CollectionView dari ViewController:
Akhirnya Anda dapat memiliki CollectionView yang mewah!
sumber
Karena
UICollectionView
sangat fleksibel, ada beberapa cara untuk mengubah jumlah kolom, bergantung pada jenis tata letak yang Anda gunakan.The
UICollectionViewFlowLayout
(yang mungkin sedang Anda kerjakan) tidak menentukan jumlah kolom secara langsung (karena bergantung pada ukuran tampilan / orientasi). Cara termudah untuk mengubahnya adalah dengan mengaturitemSize
properti dan / atauminimumInteritemSpacing
/minimumLineSpacing
.sumber
Swift 3.0.0 Berfungsi untuk arah gulir horizontal dan vertikal serta jarak variabel
Tentukan jumlah kolom
Konfigurasi
flowLayout
untuk merender yang ditentukannumberOfColumns
sumber
Diperbarui ke Swift 5+ iOS 13
Collectionview Estimate Size tidak boleh ada
Deklarasikan margin untuk sel
Dalam viewDidLoad configure
minimumInteritemSpacing
,minimumLineSpacing
,sectionInset
UICollectionViewDataSource metode
sizeForItemAt
sumber
Ini semua tentang tata letak yang ingin Anda gambar. Anda dapat membuat kelas khusus yang diturunkan dari UICollectionViewFlowLayout. Saat ini tidak ada metode langsung untuk mengatur kolom. Jika Anda ingin mencapai fungsionalitas semacam ini, Anda perlu melakukannya secara manual. Anda perlu menanganinya di kelas tata letak aliran khusus Anda.
Sekarang pertanyaan akan muncul bagaimana Anda akan melakukannya? Jika Anda tidak ingin mengganggu bingkai sel, Anda dapat menyesuaikan
Cara lain adalah memberi Anda posisi sel sendiri. Dengan mengganti dua metode di bawah ini, yang akan dipanggil selama pembentukan tata letak Anda.
UICollectionViewLayoutAttributes adalah kelas yang akan menangani posisi sel, bingkai, Zindex dll
sumber
Jawaban ini untuk swift 3.0 ->
pertama-tama sesuai dengan protokol:
lalu tambahkan metode ini:
sumber
Saya hanya ingin menambahkan jawaban # 2 Imanou Petit. Untuk memastikan margin tepat terlepas dari lebar layar, saya menggunakan pemecah berulang dengan margin yang diinginkan, dan # kolom sebagai input. Saya juga menambahkan bendera arah di mana margin akhir mereka akan dibandingkan dengan target mereka.
Pemecah berulang ditampilkan di bawah dan mengembalikan cellWidth dan margin.
Saya menyebutnya seperti itu:
Saya kemudian menerapkan nilai cellWidth dan margin ke tata letak aliran seperti:
{func collectionView (_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAt indexPath: IndexPath) -> CGSize {return CGSize (width: cellWidth, height: cellWidth)}
}
Semoga ini membantu. Mungkin ada cara yang lebih mudah untuk memastikan margin tepat, tetapi ini adalah salah satu metode. Selain itu, kode ini belum diuji untuk perangkat yang memungkinkan tampilan koleksi bergilir.
Terima kasih,
sumber
solusi yang tepat adalah dengan Menggunakan UICollectionViewDelegateFlowLayout tetapi Anda dapat dengan mudah menghitung lebar sel dan membagi jumlah kolom yang Anda inginkan
triknya adalah membuat lebar tanpa pecahan
sumber
Saya membuat tata letak koleksi.
Untuk membuat pemisah terlihat, Atur warna latar belakang tampilan koleksi menjadi abu-abu. Satu baris per bagian.
Penggunaan:
Tata Letak:
sumber
Coba Ini, Ini bekerja sempurna untuk saya,
Ikuti langkah-langkah di bawah ini:
1. Tentukan nilai dalam file .h.
ATAU
2. Tambahkan Kode dalam kumpulan metode sumber data Tampilan Tata Letak seperti di bawah ini,
Semoga ini bisa membantu seseorang.
sumber
Pertama tambahkan UICollectionViewDelegateFlowLayout sebagai protokol.
Kemudian:
sumber