Saya telah melakukan beberapa penelitian, tetapi saya tidak dapat menemukan contoh kode apa pun tentang cara memusatkan sel di UICollectionView secara horizontal.
alih-alih sel pertama seperti X00 ini , saya ingin menjadi seperti ini 0X0 . apakah ada cara untuk mencapai ini?
EDIT:
untuk memvisualisasikan apa yang saya inginkan:
Saya membutuhkannya agar terlihat seperti versi B ketika hanya ada satu elemen di CollectionView. Ketika saya mendapatkan lebih dari satu elemen, maka itu harus seperti versi A tetapi dengan lebih banyak elemen.
Saat ini sepertinya Versi A ketika saya hanya memiliki 1 elemen, dan saya bertanya-tanya bagaimana saya bisa membuatnya terlihat seperti B.
Terima kasih untuk bantuannya!
Jawaban:
Ini bukan ide yang baik untuk menggunakan perpustakaan, jika tujuan Anda hanya ini yaitu untuk meratakan tengah.
Lebih baik Anda bisa melakukan penghitungan sederhana ini dalam fungsi collectionViewLayout Anda.
sumber
collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, insetForSectionAt section: Int)
.leftInset
nilai Anda seperti ini:let leftInset = max(0.0, (self.collectionView.bounds.width - CGFloat(totalCellWidth + totalSpacingWidth)) / 2)
Swift 5.1.0
Swift 4.2.0
Cepat 3
jangan lupa tambahkan protokolnya
sumber
Coba ini untuk Swift 4
Tambahkan cellWidth Anda sebagai gantinya 165.0
sumber
Saya menggunakan KTCenterFlowLayout untuk ini, dan ini berfungsi dengan baik. Ini adalah subkelas khusus dari
UICollectionViewFlowLayout
sel pusat yang Anda inginkan. (Catatan: ini bukan hal yang sepele untuk diselesaikan dengan memposting beberapa kode, itulah sebabnya saya menautkan ke proyek GitHub!)sumber
Versi objektif-C dari jawaban Darshan Patel :
sumber
Sedikit mengubah jawaban @Safad Funy, inilah yang berhasil bagi saya di versi terbaru Swift & iOS. Dalam hal ini saya ingin lebar sel menjadi sepertiga dari ukuran tampilan koleksi.
sumber
Anda dapat menggunakan ekstensi ini (Swift 4).
Itu dapat memusatkan sel dengan jika Anda
collectionView
punyalayout.estimatedItemSize = UICollectionViewFlowLayoutAutomaticSize
.Ini bekerja dengan ukuran sel apa pun dan bekerja dengan sempurna saat
scrollDirection = .horizontal
Semoga membantu Anda!
sumber
Swift 4.2 (Secara Horizontal dan Vertikal). Ini peningkatan kecil dari kode Pink Panther dan terima kasih banyak padanya!
Pastikan kelas Anda sesuai dengan protokol UICollectionViewDelegateFlowLayout
sumber
Berikut adalah versi yang lebih baru untuk Swift 5 yang juga berfungsi dengan baik saat sel lebih dari satu baris:
Harap pastikan kelas Anda sesuai dengan
UICollectionViewDelegateFlowLayout
protokol.sumber
Cepat 4
sumber
Untuk orang yang hanya ingin menambahkan padding ( atas, kiri, bawah, kanan ):
Tambahkan protokol
UICollectionViewDelegateFlowLayout
Contoh ini menunjukkan padding kiri dan kanan dengan 40.
sumber
SWIFT 4.2
//
sumber
Anda dapat mencoba solusi saya, ini berfungsi dengan baik,
sumber
Jawaban yang diterima adalah jawaban yang benar tetapi jika Anda
totalCellWidth
kurang dariCollectionView
ituwidth
, tetapi hanya untuk menjaganya, Anda dapat melakukan seperti di bawah ini.sumber
Kode ini harus memusatkan tampilan koleksi secara horizontal bahkan di Swift 4.0 tanpa modifikasi apa pun:
Pastikan kelas Anda sesuai dengan
UICollectionViewDelegateFlowLayout
protokolsumber
Saya akhirnya mengambil pendekatan yang sama sekali berbeda di sini, yang menurut saya layak untuk disebutkan.
Saya menetapkan batasan pada tampilan koleksi saya agar sejajar secara horizontal di tengah. Kemudian saya menetapkan batasan lain yang menentukan lebarnya. Saya membuat outlet untuk batasan lebar di dalam viewController saya yang menyimpan tampilan koleksi. Kemudian, ketika sumber data saya diubah dan saya memperbarui tampilan koleksi, saya menghitung jumlah sel dan melakukan kalkulasi (sangat mirip) untuk menyetel ulang lebarnya.
let newWidth = (items.count * cellWidth) + (items.count * cellSpacing)
Kemudian saya menetapkan nilai outlet kendala
.constant
ke hasil kalkulasi dan autolayout melakukan sisanya.Ini mungkin bertentangan dengan `UICollectionViewDelegateFlowLayout, tetapi ini bekerja dengan sempurna bagi saya untuk membuat tampilan koleksi rata kiri. Tanpa delegasi, tampaknya hanya berfungsi jika sel memenuhi sebagian besar tampilan.
sumber
Solusi umum untuk tata letak alur yang memusatkan halaman jika kurang dari lebarnya dan sejajar ke kiri jika ada lebih banyak
Versi Swift (dikonversi dari ObjC)
sumber
Saya memiliki situasi serupa dalam proyek, dan saya memperbaikinya dengan merujuk
UPCarouselFlowLayout
Saya pikir itu mendukung
swift 5
versihttps://github.com/ink-spot/UPCarouselFlowLayout/blob/master/UPCarouselFlowLayout/UPCarouselFlowLayout.swift
Lihat implementasi kode di
sumber
cara termudah adalah menyetel ukuran perkiraan tampilan koleksi ke Tidak Ada di storyboard atau dengan kode
layout.estimatedItemSize = CGSize.zero
sumber
Jika hanya ada ruang untuk satu sel per grup, a
leading:
dantrailing:
dari.flexible(0)
akan memusatkan sel secara horizontal:sumber
Saya menggunakan kode itu dalam sebuah proyek. Ini memusatkan collectionView secara horizontal dan vertikal di kedua arah
.horizontal
dan.vertical
menggunakan sisipan bagian. Menghormati jarak dan inset asli bagian tersebut jika disetel. Kode untuk digunakan dalam delegasiUICollectionViewDelegateFlowLayout
sehingga kita memiliki akses ke semua properti yang perlu kita ambil dariUIcollectionView
atau set di storyboard untuk digunakan kembali.Semoga ini dapat membantu seseorang - ini memusatkan bagian bukan item di dalam bagian, untuk lebih lanjut kita harus subkelas
UICollectionViewFlowLayout
atauUICollectionViewLayout
sebagai contoh mosaik dari Apple.sumber
Saya pikir Anda perlu ke tengah sel, jadi daripada menggunakan collectionView, saya ingin UITableView akan sangat berguna. Cukup gunakan UIViewController dan letakkan dua UIViews di depan dan belakang dan letakkan
UITableView
di tengah Semoga ini bisa membantusumber