saya sudah UICollectionView
pengguliran horizontal dan selalu ada 2 sel berdampingan di seluruh layar. Saya membutuhkan pengguliran untuk berhenti di awal sel. Dengan paging diaktifkan, tampilan koleksi menggulir seluruh halaman, yaitu 2 sel sekaligus, lalu berhenti.
Saya perlu mengaktifkan pengguliran dengan satu sel, atau menggulir dengan beberapa sel dengan berhenti di tepi sel.
Saya mencoba membuat subkelas UICollectionViewFlowLayout
dan menerapkan metode tersebut targetContentOffsetForProposedContentOffset
, tetapi sejauh ini saya hanya dapat merusak tampilan koleksi saya dan berhenti bergulir. Apakah ada cara yang lebih mudah untuk mencapai ini dan bagaimana, atau apakah saya benar-benar perlu menerapkan semua metode UICollectionViewFlowLayout
subclass? Terima kasih.
sumber
targetContentOffsetForProposedContentOffset:withScrollingVelocity:
dan matikan pagingJawaban:
Oke, jadi saya menemukan solusinya di sini: targetContentOffsetForProposedContentOffset: withScrollingVelocity tanpa subclassing UICollectionViewFlowLayout
Saya harus mencari
targetContentOffsetForProposedContentOffset
di awal.sumber
ganti saja metode ini:
sumber
Halaman Horizontal Dengan Lebar Halaman Kustom (Swift 4 & 5)
Banyak solusi yang disajikan di sini menghasilkan beberapa perilaku aneh yang tidak terasa seperti paging yang diterapkan dengan benar.
Solusi yang disajikan dalam tutorial ini , bagaimanapun, tampaknya tidak memiliki masalah apa pun. Ini hanya terasa seperti algoritma paging yang bekerja dengan sempurna. Anda dapat menerapkannya dalam 5 langkah sederhana:
private var indexOfCellBeforeDragging = 0
collectionView
delegate
seperti ini:collectionView.delegate = self
UICollectionViewDelegate
melalui ekstensi:extension YourType: UICollectionViewDelegate { }
Tambahkan metode berikut ke ekstensi yang menerapkan
UICollectionViewDelegate
kesesuaian dan tetapkan nilai untukpageWidth
:Tambahkan metode berikut ke ekstensi yang menerapkan
UICollectionViewDelegate
kesesuaian, tetapkan nilai yang sama untukpageWidth
(Anda juga dapat menyimpan nilai ini di tempat sentral) dan menetapkan nilai untukcollectionViewItemCount
:sumber
Pop back (against velocity)
bagian menjadi:collectionViewLayout.collectionView!.scrollToItem(at: indexPath, at: .centeredHorizontally, animated: true)
. Perhatikan.centeredHorizontally
.left
baik.left
tidak berfungsi seperti yang diharapkan. Tampaknya mendorong sel terlalu jauh ke belakang @fredpiVersi Swift 3 dari jawaban Evya:
sumber
if(velocity.x > 1) { mod = 0.5; } else if(velocity.x < -1) { mod = -0.5; }
lalu tambahkan+ mod
setelah+ Double(0.5)
Inilah cara termudah yang saya temukan untuk melakukannya di Swift 4.2 untuk gulir horinzontal :
Saya menggunakan sel pertama
visibleCells
dan menggulir ke sana, jika sel pertama yang terlihat menunjukkan kurang dari setengah lebarnya, saya menggulir ke sel berikutnya.Jika koleksi Anda bergulir secara vertikal , cukup ubah
x
olehy
danwidth
olehheight
sumber
Sebagian berdasarkan jawaban StevenOjo. Saya telah menguji ini menggunakan scrolling horizontal dan tanpa Bounce UICollectionView. cellSize adalah ukuran CollectionViewCell. Anda dapat mengubah faktor untuk mengubah sensitivitas pengguliran.
sumber
Inilah implementasi saya di Swift 5 untuk paging berbasis sel vertikal :
Beberapa catatan:
itemSize
benar - benar cocok dengan ukuran item karena itu sering menjadi masalah, terutama saat menggunakancollectionView(_:layout:sizeForItemAt:)
, gunakan variabel khusus dengan itemSize sebagai gantinya.self.collectionView.decelerationRate = UIScrollView.DecelerationRate.fast
.Ini adalah versi horizontal (belum mengujinya secara menyeluruh jadi mohon maafkan jika ada kesalahan):
Kode ini didasarkan pada kode yang saya gunakan dalam proyek pribadi saya, Anda dapat memeriksanya di sini dengan mengunduhnya dan menjalankan target Contoh.
sumber
.fast
sebagai gantiUIScollViewDecelerationRateFast
Pendekatan 1: Tampilan Koleksi
flowLayout
adalahUICollectionViewFlowLayout
propertiPendekatan 2: Pengontrol Tampilan Halaman
Anda dapat menggunakan
UIPageViewController
jika memenuhi persyaratan Anda, setiap halaman akan memiliki pengontrol tampilan terpisah.sumber
Ini adalah cara langsung untuk melakukan ini.
Kasingnya sederhana, tetapi akhirnya cukup umum (penggulung thumbnail khas dengan ukuran sel tetap dan celah tetap antar sel)
Perhatikan bahwa tidak ada alasan untuk memanggil scrollToOffset atau menyelami tata letak. Perilaku pengguliran asli sudah melakukan segalanya.
Salam Semua :)
sumber
collectionView.decelerationRate = .fast
agar lebih dekat paging default mimmic.Mirip seperti jawaban evya, tapi sedikit lebih halus karena tidak menyetel targetContentOffset ke nol.
sumber
modifikasi jawaban Romulo BM untuk mendengarkan kecepatan
sumber
Cepat 5
Saya telah menemukan cara untuk melakukan ini tanpa subclass UICollectionView, hanya menghitung contentOffset secara horizontal. Jelas tanpa isPagingEnabled, set true. Ini kodenya:
sumber
Ini adalah versi saya di Swift 3. Hitung offset setelah pengguliran berakhir dan sesuaikan offset dengan animasi.
collectionLayout
adalahUICollectionViewFlowLayout()
sumber
Anda juga dapat membuat tampilan gulir palsu untuk menangani pengguliran.
Horizontal atau Vertikal
sumber
Oke jadi jawaban yang diusulkan tidak berhasil untuk saya karena saya ingin menggulir berdasarkan bagian, dan dengan demikian, memiliki ukuran halaman lebar variabel
Saya melakukan ini (hanya vertikal):
Dalam kasus ini, saya menghitung setiap ukuran halaman sebelumnya menggunakan tinggi bagian + header + footer, dan menyimpannya dalam array. Itu
pagesSizes
anggotanyasumber
Ini adalah solusi saya, di Swift 4.2, saya berharap ini dapat membantu Anda.
sumber
sumber
Jawaban asli Олень Безрогий bermasalah, jadi tampilan koleksi sel terakhir digulir ke awal
sumber
Inilah cara saya melakukannya dengan menggunakan
UICollectionViewFlowLayout
to overridetargetContentOffset
:(Meskipun pada akhirnya, saya akhirnya tidak menggunakan ini dan menggunakan UIPageViewController sebagai gantinya.)
sumber
Anda dapat menggunakan pustaka berikut: https://github.com/ink-spot/UPCarouselFlowLayout
Ini sangat sederhana dan Anda tidak perlu memikirkan detail seperti jawaban lain.
sumber
saya membuat tata letak tampilan koleksi kustom di sini yang mendukung:
semudah:
Anda tinggal menambahkan PagingCollectionViewLayout.swift ke proyek Anda
atau
tambahkan
pod 'PagingCollectionViewLayout'
ke podfile Andasumber