Saya hanya memiliki UIScrollView
dengan pengguliran horizontal yang diizinkan, dan saya ingin tahu ke arah mana (kiri, kanan) yang digulirkan pengguna. Apa yang saya lakukan adalah untuk subclass UIScrollView
dan menimpa touchesMoved
metode:
- (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event
{
[super touchesMoved:touches withEvent:event];
UITouch *touch = [touches anyObject];
float now = [touch locationInView:self].x;
float before = [touch previousLocationInView:self].x;
NSLog(@"%f %f", before, now);
if (now > before){
right = NO;
NSLog(@"LEFT");
}
else{
right = YES;
NSLog(@"RIGHT");
}
}
Tetapi metode ini terkadang tidak dipanggil sama sekali ketika saya pindah. Bagaimana menurut anda?
iphone
ios
cocoa-touch
uiscrollview
Alex1987
sumber
sumber
Jawaban:
Menentukan arah cukup mudah, tetapi perlu diingat bahwa arah dapat berubah beberapa kali selama gerakan. Misalnya, jika Anda memiliki tampilan gulir dengan paging dihidupkan dan pengguna menggesek untuk pergi ke halaman berikutnya, arah awal bisa ke kanan, tetapi jika Anda telah bouncing dihidupkan, sebentar akan pergi ke arah tidak sama sekali dan maka sebentar akan ke kiri.
Untuk menentukan arah, Anda harus menggunakan
UIScrollView scrollViewDidScroll
delegasi. Dalam sampel ini, saya membuat variabel bernamalastContentOffset
yang saya gunakan untuk membandingkan konten saat ini dengan yang sebelumnya. Jika lebih besar, maka scrollView sedang bergulir ke kanan. Jika kurang dari itu maka scrollView sedang bergulir ke kiri:Saya menggunakan enum berikut untuk menentukan arah. Menyetel nilai pertama ke ScrollDirectionNone memiliki manfaat tambahan menjadikan arah itu sebagai default saat menginisialisasi variabel:
sumber
lastContentOffset = scrollView.contentOffset.x;
lastContentOffset
tipenya. Mengenai variabel properti vs statis: salah satu solusi adalah pilihan yang baik. Saya tidak punya preferensi nyata. Ini poin yang bagus.Dalam hal itu, di iOS 5 dan di atasnya, gunakan
UIScrollViewDelegate
untuk menentukan arah gerakan pan pengguna:sumber
Menggunakan
scrollViewDidScroll:
adalah cara yang baik untuk menemukan arah saat ini.Jika Anda ingin mengetahui arah setelah pengguna selesai menggulir, gunakan yang berikut ini:
sumber
Tidak perlu menambahkan variabel tambahan untuk melacak hal ini. Hanya menggunakan
UIScrollView
'spanGestureRecognizer
properti seperti ini. Sayangnya, ini hanya berfungsi jika kecepatannya tidak 0:Anda dapat menggunakan kombinasi komponen x dan y untuk mendeteksi atas, bawah, kiri dan kanan.
sumber
Solusinya
sumber
velocityInView
bukantranslationInView
. Ini memecahkan masalah yang muncul saat mengubah arah dalam gerakan yang sama.Swift 4:
Untuk pengguliran horizontal, Anda cukup melakukan:
Untuk perubahan gulir vertikal
.x
dengan.y
sumber
Di iOS8 Swift saya menggunakan metode ini:
Saya memiliki tampilan dinamis yang mengubah lokasi saat pengguna menggulir sehingga tampilan tersebut tampak seperti berada di tempat yang sama di layar. Saya juga melacak ketika pengguna naik atau turun.
Ini juga cara alternatif:
sumber
crollViewDidEndDecelerating
benar?Inilah yang berhasil bagi saya (dalam Objective-C):
sumber
sumber
Atau, dimungkinkan untuk mengamati jalur utama "contentOffset". Ini berguna ketika tidak mungkin bagi Anda untuk mengatur / mengubah delegasi dari tampilan gulir.
Setelah menambahkan pengamat, Anda sekarang dapat:
Ingat untuk menghapus pengamat saat dibutuhkan. mis. Anda bisa menambahkan pengamat di viewWillAppear dan menghapusnya di viewWillDisappear
sumber
Dengan cepat:
Anda dapat melakukannya juga di scrollViewDidScroll.
sumber
Berikut ini adalah solusi saya untuk perilaku seperti pada jawaban @followben, tetapi tanpa kehilangan dengan awal yang lambat (ketika dy adalah 0)
sumber
Saya memeriksa beberapa jawaban dan menguraikan jawaban AnswerBot dengan membungkus semuanya dalam setetes dalam kategori UIScrollView. "LastContentOffset" disimpan di dalam uiscrollview dan hanya masalah panggilan:
Kode sumber di https://github.com/tehjord/UIScrollViewScrollingDirection
sumber
Saya lebih suka melakukan penyaringan, berdasarkan jawaban @memmons
Dalam Objective-C:
Saat diuji dalam
- (void)scrollViewDidScroll:(UIScrollView *)scrollView
:self.lastContentOffset
perubahan sangat cepat, kesenjangan nilai hampir 0,5 f.Itu tidak perlu.
Dan terkadang, ketika ditangani dalam kondisi akurat, orientasi Anda mungkin hilang. (kadang-kadang pernyataan implementasi dilewati)
seperti :
Dalam Swift 4:
sumber
Saat paging dihidupkan, Anda bisa menggunakan kode ini.
sumber
Saya kira kode menjelaskan sendiri. CGFloat difference1 dan difference2 dideklarasikan dalam antarmuka pribadi kelas yang sama. Bagus jika contentSize tetap sama.
sumber
Ok jadi bagi saya implementasi ini bekerja sangat baik:
Jadi ini akan memecat textView untuk mengabaikan setelah drag berakhir
sumber
Gunakan metode delegasi ini pada scrollview.
Jika Anda mengkoordinasikan kecepatan adalah + ve scroll view scroll ke bawah dan jika itu -ve scrollview scroll ke atas. Demikian pula gulir kiri dan kanan dapat dideteksi menggunakan koordinat x.
sumber
Pendek & Mudah adalah, cukup periksa nilai kecepatan, jika lebih besar dari nol maka gulir ke kiri kanan:
sumber
Jika Anda bekerja dengan UIScrollView dan UIPageControl, metode ini juga akan mengubah tampilan halaman PageControl.
Terima kasih kode Swift @Esq.
sumber
Swift 2.2 Solusi sederhana yang melacak arah tunggal dan banyak arah tanpa kehilangan.
sumber
Dalam semua jawaban atas, dua cara utama untuk menyelesaikan masalah adalah menggunakan
panGestureRecognizer
ataucontentOffset
. Kedua metode memiliki kekurangan dan kelebihan.Metode 1: panGestureRecognizer
Saat Anda menggunakan
panGestureRecognizer
seperti yang disarankan @followben, jika Anda tidak ingin secara terprogram menggulir tampilan gulir Anda, itu berfungsi dengan baik.Cons
Tetapi jika Anda memindahkan tampilan gulir dengan kode berikut, kode atas tidak dapat mengenalinya:
Metode 2: contentOffset
Cons
Jika Anda ingin mengubah contentOffset secara terprogram, selama gulir (seperti ketika Anda ingin membuat gulir yang tak terbatas), metode ini membuat masalah, karena Anda dapat berubah
contentOffset
selama mengubah tempat tampilan konten dan saat ini, lompatan kode atas yang Anda gulir ke kanan atau kiri.sumber
Jawaban dari Mos6y https://medium.com/@Mos6yCanSwift/swift-ios-determine-scroll-direction-d48a2327a004
sumber