Saya menggunakan UICollectionView
pertama kali di aplikasi iPad saya. Saya telah mengatur UICollectionView
sedemikian rupa sehingga ukuran dan ukuran selnya sama, artinya hanya sekali sel ditampilkan dalam satu waktu.
Masalah: Sekarang ketika pengguna menggulir UICollectionView, saya perlu tahu sel mana yang terlihat, saya harus memperbarui elemen UI lainnya saat diubah. Saya tidak menemukan metode delegasi untuk ini. Bagaimana saya bisa mencapai ini?
Kode:
[self.mainImageCollection setTag:MAIN_IMAGE_COLLECTION_VIEW];
[self.mainImageCollection registerClass:[InspirationMainImageCollectionCell class] forCellWithReuseIdentifier:@"cellIdentifier"];
[self.mainImageFlowLayout setScrollDirection:UICollectionViewScrollDirectionHorizontal];
[self.mainImageFlowLayout setMinimumInteritemSpacing:0.0f];
[self.mainImageFlowLayout setMinimumLineSpacing:0.0f];
self.mainImageFlowLayout.minimumLineSpacing = 0;
[self.mainImageCollection setPagingEnabled:YES];
[self.mainImageCollection setShowsHorizontalScrollIndicator:NO];
[self.mainImageCollection setCollectionViewLayout:self.mainImageFlowLayout];
Apa yang telah saya coba:
Sebagai UICollectionView
sesuai dengan UIScrollView
, saya mendapat ketika pengguna scroll berakhir dengan UIScrollViewDelegate
metode
-(void)scrollViewDidEndDecelerating:(UIScrollView *)scrollView
Tetapi di dalam fungsi di atas bagaimana saya bisa mendapatkan indeks sel yang terlihat saat ini UICollectionView
???
ios
objective-c
ipad
uicollectionview
Irfan DANISH
sumber
sumber
Jawaban:
Metode [collectionView visibleCells] memberi Anda semua array visibleCells yang Anda inginkan. Gunakan saat Anda ingin mendapatkannya
Perbarui ke Swift 5:
sumber
scrollViewDidScroll:
metode delegasi memberikan pandangan update gulir setiap kali ada selesai scroll (dan mungkin pilihan yang lebih baik di sini). Berbeda denganscrollViewDidEndDecelerating:
metode delegasi yang hanya dipanggil ketika tampilan gulir " terhenti [dari gulir besar] " (lihat header UIScrollView)...DidScroll
dipanggil berkali-kali, bahkan selama scroll singkat. Mungkin atau mungkin tidak menjadi hal yang baik, tergantung pada apa yang ingin dilakukan.indexPathsForVisibleItems
mungkin berfungsi untuk sebagian besar situasi, tetapi terkadang ia mengembalikan larik dengan lebih dari satu jalur indeks dan bisa jadi rumit untuk mencari tahu yang Anda inginkan. Dalam situasi tersebut, Anda dapat melakukan sesuatu seperti ini:Ini bekerja sangat baik ketika setiap item dalam tampilan koleksi Anda memenuhi seluruh layar.
Versi cepat
sumber
visibleIndexPath
kadang-kadang akan menjadi nol, Jadiif (visibleIndexPath) == nil { let cells = collectionView.visibleCells() let visibleIndexPath = collectionView.indexPathForCell(cells[0] as! UICollectionViewCell)! as NSIndexPath }
Cepat 5 :
Jawaban Kerja Dikombinasikan Dalam Swift 2.2:
sumber
Demi kelengkapan, inilah metode yang akhirnya berhasil untuk saya. Itu adalah kombinasi dari metode @Anthony & @ iAn.
sumber
Mungkin akan lebih baik menggunakan metode UICollectionViewDelegate: (Swift 3)
sumber
didEndDisplaying
, dari dokumen: Memberi tahu delegasi bahwa sel yang ditentukan telah dihapus dari tampilan koleksi. Gunakan metode ini untuk mendeteksi saat sel dihapus dari tampilan koleksi, bukan memantau tampilan itu sendiri untuk melihat kapan sel tersebut menghilang. Jadi saya tidak berpikirdidEndDisplaying
dipanggil saat sel ditampilkan.Hanya ingin menambahkan untuk yang lain: untuk beberapa alasan, saya tidak mendapatkan sel yang terlihat oleh pengguna saat saya menggulir ke sel sebelumnya di collectionView dengan pagingEnabled.
Jadi saya memasukkan kode di dalam dispatch_async untuk memberinya "udara" dan ini berfungsi untuk saya.
sumber
DispatchQueue.main.async {
ketika panggilan dimulai dari sesuatu sepertifunc tableView(_ tableView: UITableView, willDisplay cell: UITableViewCell, forRowAt indexPath: IndexPath) {
willDisplay cell
seperti yang disebutkan di atas. Saya pikir masalahnya, di suatu tempat di UIKit, dalam kasus saya benar-benar sama dengan jawaban ini.sumber
Swift 3.0.0
Solusi paling sederhana yang akan memberi Anda indexPath untuk sel yang terlihat ..
akan mengembalikan array dari jalur indeks.
Ambil saja objek pertama dari array seperti ini.
Kurasa itu akan bekerja dengan baik dengan Objective - C juga.
sumber
UICollectionView indeks sel yang terlihat saat ini: Swift 3
sumber
mengonversi jawaban @ Anthony ke Swift 3.0 bekerja dengan sempurna untuk saya:
sumber
Anda dapat menggunakan
scrollViewDidEndDecelerating
: untuk inisumber
Ini pertanyaan lama tapi dalam kasus saya ...
sumber
Periksa juga cuplikan ini
sumber
Di utas ini, Ada begitu banyak solusi yang berfungsi dengan baik jika sel mengambil layar penuh tetapi mereka menggunakan batas tampilan kumpulan dan titik tengah dari terlihat persegi Namun ada solusi sederhana untuk masalah ini
dengan ini, Anda bisa mendapatkan indexPath dari sel yang terlihat. Saya telah menambahkan DispatchQueue karena ketika Anda menggesek lebih cepat dan jika sesaat sel berikutnya ditampilkan maka tanpa dispactchQueue Anda akan mendapatkan indexPath sel yang ditampilkan secara singkat bukan sel yang ditampilkan di layar.
sumber
coba ini, berhasil. (dalam contoh di bawah ini saya memiliki 3 sel misalnya.)
sumber
Swift 3 & Swift 4:
Jika Anda ingin menunjukkan nomor sebenarnya daripada Anda dapat menambahkan +1
sumber