Saya ingin menambahkan pengenalan gerakan gesek sederhana ke proyek iPhone berbasis tampilan saya. Gerakan di semua arah (kanan, bawah, kiri, atas) harus dikenali.
Itu dinyatakan dalam dokumen untuk UISwipeGestureRecognizer:
Anda dapat menentukan beberapa arah dengan menetapkan beberapa konstanta UISwipeGestureRecognizerDirection menggunakan bitwise-OR operan. Arah default adalah UISwipeGestureRecognizerDirectionRight.
Namun bagi saya itu tidak berhasil. Ketika keempat arah di OR'ed hanya geseran ke kiri dan kanan yang dikenali.
- (void)viewDidLoad {
UISwipeGestureRecognizer *recognizer;
recognizer = [[UISwipeGestureRecognizer alloc] initWithTarget:self action:@selector(handleSwipeFrom:)];
[recognizer setDirection:(UISwipeGestureRecognizerDirectionRight | UISwipeGestureRecognizerDirectionDown | UISwipeGestureRecognizerDirectionLeft | UISwipeGestureRecognizerDirectionUp)];
[[self view] addGestureRecognizer:recognizer];
[recognizer release];
[super viewDidLoad];
}
-(void)handleSwipeFrom:(UISwipeGestureRecognizer *)recognizer {
NSLog(@"Swipe received.");
}
Saya memperbaikinya dengan menambahkan empat pengenal pada tampilan, tetapi saya ingin tahu mengapa tidak berfungsi seperti yang diiklankan dalam dokumen?
- (void)viewDidLoad {
UISwipeGestureRecognizer *recognizer;
recognizer = [[UISwipeGestureRecognizer alloc] initWithTarget:self action:@selector(handleSwipeFrom:)];
[recognizer setDirection:(UISwipeGestureRecognizerDirectionRight)];
[[self view] addGestureRecognizer:recognizer];
[recognizer release];
recognizer = [[UISwipeGestureRecognizer alloc] initWithTarget:self action:@selector(handleSwipeFrom:)];
[recognizer setDirection:(UISwipeGestureRecognizerDirectionUp)];
[[self view] addGestureRecognizer:recognizer];
[recognizer release];
recognizer = [[UISwipeGestureRecognizer alloc] initWithTarget:self action:@selector(handleSwipeFrom:)];
[recognizer setDirection:(UISwipeGestureRecognizerDirectionDown)];
[[self view] addGestureRecognizer:recognizer];
[recognizer release];
recognizer = [[UISwipeGestureRecognizer alloc] initWithTarget:self action:@selector(handleSwipeFrom:)];
[recognizer setDirection:(UISwipeGestureRecognizerDirectionLeft)];
[[self view] addGestureRecognizer:recognizer];
[recognizer release];
[super viewDidLoad];
}
-(void)handleSwipeFrom:(UISwipeGestureRecognizer *)recognizer {
NSLog(@"Swipe received.");
}
ios
iphone
swipe
uiswipegesturerecognizer
Sandisn
sumber
sumber
Jawaban:
Sepertinya ada bug. Anda dapat menentukan arah yang diizinkan seperti yang Anda lakukan. Tetapi ketika Anda mencoba mengakses arah aktual yang memicu gesekan dalam metode pemilih tindakan Anda masih mendapatkan topeng bit yang Anda atur awalnya (untuk arah yang diizinkan).
Ini berarti bahwa pemeriksaan untuk arah aktual akan selalu gagal ketika lebih dari 1 arah diizinkan. Anda dapat melihatnya sendiri dengan mudah ketika Anda menampilkan nilai 'arah' dalam metode pemilih (yaitu
-(void)scrollViewSwiped:(UISwipeGestureRecognizer *)recognizer
).Mengajukan laporan bug (# 8276386) ke Apple.
[Pembaruan] Saya mendapat jawaban dari Apple yang mengatakan bahwa perilakunya berfungsi sebagaimana mestinya.
Jadi misalnya dalam tampilan tabel Anda dapat menggesek ke kiri atau ke kanan dalam sel tampilan tabel untuk memicu 'hapus' (ini akan memiliki arah gerakan swipe diatur ke kiri dan kanan)
Ini berarti bahwa solusi asli adalah cara yang seharusnya digunakan. Properti arah hanya dapat digunakan untuk membuat gerakan dikenali dengan benar, tetapi tidak dalam metode yang dilakukan pada pengakuan yang berhasil untuk membandingkan untuk arah aktual yang memicu pengakuan.
sumber
Saya perhatikan bahwa gerakan kiri / kanan dan atas / bawah bekerja bersama secara berpasangan, jadi Anda hanya perlu menentukan dua pengenal isyarat. Dan dokumen itu tampaknya salah.
sumber
Nah itu menyebalkan, saya memecahkan masalah dengan menambahkan 2 gerakan seperti yang disebutkan Lars dan itu bekerja dengan sempurna ...
1) Kiri / Kanan 2) Atas / Bawah
sumber
Sekarang ini adalah fungsi didSwipe
sumber
Jika Anda menggunakan Xcode 4.2, Anda dapat menambahkan Gesture Recognizers @ storyboard dan kemudian menautkan GUI Gesture Recognizers ke IBActions.
Anda dapat menemukan Pengenal Gerakan di Perpustakaan Objek pada Panel Utilitas (Bagian bawah panel Kanan).
Maka itu hanya masalah Kontrol-menyeret ke tindakan yang sesuai.
sumber
Jika Anda ingin mendeteksi keempat arah, Anda harus membuat empat instance, seperti yang Anda lakukan di sekitar.
Inilah Alasannya : Contoh yang sama dari UISwipeGestureRecognizer yang Anda buat adalah contoh yang akan diteruskan ke pemilih sebagai pengirim. Jadi jika Anda mengaturnya untuk mengenali keempat arah, itu akan mengembalikan true untuk di
sgr.direction == xxx
mana xxx adalah salah satu dari empat arah.Berikut ini penyelesaian alternatif yang melibatkan lebih sedikit kode (mengasumsikan penggunaan ARC):
sumber
Berikut adalah contoh kode untuk penggunaan UISwipeGestureRecognizer. Catat komentar.
swipeRight dan swipeLeft adalah metode yang Anda gunakan untuk melakukan aktivitas tertentu berdasarkan swiping kiri atau kanan. Sebagai contoh:
sumber
sumber
Cepat 2.1
Saya harus menggunakan yang berikut ini
sumber
hmm, aneh, itu berfungsi sempurna untuk saya, saya melakukan hal yang persis sama
pikir kamu harus coba lihat
Metode UIGestureRecognizerDelegate
dalam log Anda harus melihat sesuatu seperti:
harus mulai gerakan; target = <(action = actionForUpDownSwipeGestureRecognizer :, target =)>; arah = atas, bawah, kiri, kanan>
sumber
gunakan ini, itu harus operasi bit
sumber
Ini membuatku gila. Saya akhirnya menemukan cara yang dapat diandalkan untuk memiliki beberapa swipeGestureRecognizers.
Tampaknya ada bug di iOS jika nama pemilih "action" Anda sama di beberapa swipeGestureRecognizers. Jika Anda hanya menamainya secara berbeda, mis. HandleLeftSwipeFrom dan handleRightSwipeFrom, semuanya berfungsi.
sumber