UIScrollViewDelegate telah mendapatkan dua metode pendelegasian scrollViewDidScroll:
dan scrollViewDidEndScrollingAnimation:
tetapi tidak satupun dari ini yang memberi tahu Anda ketika gulir telah selesai. scrollViewDidScroll
hanya memberi tahu Anda bahwa tampilan gulir tidak gulir yang belum selesai bergulir.
Metode lain scrollViewDidEndScrollingAnimation
sepertinya hanya menyala jika Anda secara terprogram memindahkan tampilan gulir bukan jika pengguna menggulir.
Adakah yang tahu skema untuk mendeteksi ketika tampilan gulir telah selesai menggulir?
ios
iphone
uiscrollview
Michael Gaylord
sumber
sumber
Jawaban:
sumber
The 320 implementasi jauh lebih baik - di sini adalah patch untuk mendapatkan konsisten mulai / ujung gulungan itu.
sumber
Saya pikir scrollViewDidEndDecelerating adalah yang Anda inginkan. Metode opsional UIScrollViewDelegates:
Memberitahu delegasi bahwa tampilan gulir telah berakhir memperlambat gerakan gulir.
Dokumentasi UIScrollViewDelegate
sumber
Untuk semua gulungan yang terkait dengan interaksi seret, ini sudah cukup:
Sekarang, jika gulir Anda disebabkan oleh setContentOffset / scrollRectVisible terprogram (dengan
animated
= YA atau Anda jelas tahu kapan gulir berakhir):Jika gulir Anda disebabkan oleh sesuatu yang lain (seperti pembukaan keyboard atau penutupan keyboard), sepertinya Anda harus mendeteksi acara tersebut dengan peretasan karena
scrollViewDidEndScrollingAnimation
juga tidak berguna.Kasus tampilan gulir PAGINASI :
Karena, saya kira, Apple menerapkan kurva akselerasi,
scrollViewDidEndDecelerating
dipanggil untuk setiap hambatan sehingga tidak perlu digunakanscrollViewDidEndDragging
dalam kasus ini.sumber
scrollViewDidEndDecelerating
tidak akan dipanggilIni telah dijelaskan dalam beberapa jawaban lain, tetapi inilah (dalam kode) cara menggabungkan
scrollViewDidEndDecelerating
danscrollViewDidEndDragging:willDecelerate
melakukan beberapa operasi ketika pengguliran telah selesai:sumber
Saya baru saja menemukan pertanyaan ini, yang hampir sama dengan yang saya tanyakan: Bagaimana cara mengetahui dengan tepat kapan pengguliran UIScrollView telah berhenti?
Meskipun didEndDecelerating berfungsi saat menggulir, panning dengan rilis stasioner tidak mendaftar.
Saya akhirnya menemukan solusi. didEndDragging memiliki parameter WillDecelerate, yang salah dalam situasi rilis stasioner.
Dengan memeriksa! Decelerate di DidEndDragging, dikombinasikan dengan didEndDecelerating, Anda mendapatkan kedua situasi yang merupakan akhir dari pengguliran.
sumber
Jika Anda menyukai Rx, Anda dapat memperluas UIScrollView seperti ini:
yang akan memungkinkan Anda untuk melakukan seperti ini:
Ini akan mempertimbangkan seret dan perlambatan.
sumber
sumber
Saya sudah mencoba jawaban Ashley Smart dan itu berfungsi seperti pesona. Ini ide lain, dengan hanya menggunakan scrollViewDidScroll
Saya hanya punya dua halaman sehingga itu berhasil untuk saya. Namun, jika Anda memiliki lebih dari satu halaman, itu bisa bermasalah (Anda bisa memeriksa apakah offset saat ini merupakan kelipatan dari lebar tetapi kemudian Anda tidak akan tahu apakah pengguna berhenti di halaman ke-2 atau sedang menuju ke halaman ke-3 atau lebih)
sumber
Versi cepat dari jawaban yang diterima:
sumber
Jika seseorang membutuhkan, inilah jawaban Ashley Smart di Swift
sumber
Baru saja mengembangkan solusi untuk mendeteksi ketika menggulir selesai di seluruh aplikasi: https://gist.github.com/k06a/731654e3168277fb1fd0e64abc7d899e
Ini didasarkan pada ide pelacakan perubahan mode runloop. Dan melakukan blok setidaknya setelah 0,2 detik setelah bergulir.
Ini adalah ide inti untuk melacak perubahan mode runloop iOS10 +:
Dan solusi untuk target penyebaran rendah seperti iOS2 +:
sumber
Untuk rekap (dan untuk pemula). Itu tidak menyakitkan. Cukup tambahkan protokol, lalu tambahkan fungsi yang Anda butuhkan untuk deteksi.
Dalam tampilan (kelas) yang berisi UIScrolView, tambahkan protokol, lalu tambahkan fungsi apa pun dari sini ke tampilan (kelas) Anda.
sumber
Saya memiliki kasus tindakan mengetuk dan menyeret dan saya menemukan bahwa menyeret memanggil scrollViewDidEndDecelerating
Dan perubahan diimbangi secara manual dengan kode ([_scrollView setContentOffset: contentOffset animated: YES];) memanggil scrollViewDidEndScrollingAnimation.
sumber
Alternatifnya adalah menggunakan
scrollViewWillEndDragging:withVelocity:targetContentOffset
yang dipanggil setiap kali pengguna mengangkat jari dan berisi offset konten target di mana gulir akan berhenti. Menggunakan konten ini diimbangiscrollViewDidScroll:
dengan benar mengidentifikasi ketika tampilan gulir telah berhenti menggulir.sumber
UIScrollview memiliki metode pendelegasian
Tambahkan baris kode di bawah ini dalam metode delegasi
sumber
Ada metode
UIScrollViewDelegate
yang dapat digunakan untuk mendeteksi (atau lebih baik mengatakan 'prediksi') ketika pengguliran telah benar-benar selesai:dari
UIScrollViewDelegate
yang dapat digunakan untuk mendeteksi (atau lebih baik untuk mengatakan 'memprediksi') ketika bergulir telah benar-benar selesai.Dalam kasus saya, saya menggunakannya dengan pengguliran horizontal sebagai berikut (dalam Swift 3 ):
sumber
Menggunakan logika Ashley Smart dan sedang dikonversi ke Swift 4.0 dan lebih tinggi.
Logika di atas menyelesaikan masalah seperti ketika pengguna menggulir tampilan tabel. Tanpa logika, ketika Anda menggulir tampilan tabel,
didEnd
akan dipanggil tetapi tidak akan menjalankan apa pun. Saat ini menggunakannya pada tahun 2020.sumber
Pada beberapa versi iOS sebelumnya (seperti iOS 9, 10),
scrollViewDidEndDecelerating
tidak akan dipicu jika scrollView tiba-tiba dihentikan dengan menyentuh.Tetapi dalam versi saat ini (iOS 13),
scrollViewDidEndDecelerating
akan dipicu pasti (Sejauh yang saya tahu).Jadi, jika Aplikasi Anda menargetkan versi sebelumnya juga, Anda mungkin memerlukan solusi seperti yang disebutkan oleh Ashley Smart, atau Anda dapat yang berikutnya.
Penjelasan
UIScrollView akan dihentikan dengan tiga cara:
- digulir dengan cepat dan dihentikan dengan sendirinya
- digulir dan dihentikan dengan cepat dengan sentuhan jari (seperti rem Darurat)
- perlahan digulir dan dihentikan
Yang pertama dapat dideteksi oleh
scrollViewDidEndDecelerating
dan metode serupa lainnya sementara dua lainnya tidak.Untungnya,
UIScrollView
memiliki tiga status yang dapat kita gunakan untuk mengidentifikasi mereka, yang digunakan dalam dua baris yang dikomentari oleh "// 1" dan "// 2".sumber