Saya memiliki hierarki tampilan yang terlihat seperti ini:
UIView (A)
UIView > UIImageView
UIView > UIView (B)
UIView > UIView (B) > Rounded Rect Button
UIView > UIView (B) > UIImageView
UIView > UIView (B) > UILabel
Saya telah melampirkan pengenal isyarat ke UIView (B) saya. Masalah yang saya hadapi adalah bahwa saya tidak mendapatkan tindakan apa pun untuk Tombol Persegi Bulat yang ada di dalam UIView (B). Pengenal gerakan SingleTap menangkap / menimpa acara Touch Up Inside tombol.
Bagaimana cara membuatnya bekerja? Saya berpikir bahwa hierarki rantai responden akan memastikan bahwa peristiwa sentuhan tombol akan diberi preferensi, dan AKAN dipicu! Apa yang saya lewatkan?
Berikut beberapa kode terkait:
#pragma mark -
#pragma mark View lifecycle (Gesture recognizer setup)
- (void)viewDidLoad {
[super viewDidLoad];
// double tap gesture recognizer
UITapGestureRecognizer *dtapGestureRecognize = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(doubleTapGestureRecognizer:)];
dtapGestureRecognize.delegate = self;
dtapGestureRecognize.numberOfTapsRequired = 2;
[self.viewB addGestureRecognizer:dtapGestureRecognize];
// single tap gesture recognizer
UITapGestureRecognizer *tapGestureRecognize = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(singleTapGestureRecognizer:)];
tapGestureRecognize.delegate = self;
tapGestureRecognize.numberOfTapsRequired = 1;
[tapGestureRecognize requireGestureRecognizerToFail:dtapGestureRecognize];
[self.viewB addGestureRecognizer:tapGestureRecognize];
// add gesture recodgnizer to the grid view to start the edit mode
UILongPressGestureRecognizer *pahGestureRecognizer = [[UILongPressGestureRecognizer alloc] initWithTarget:self action:@selector(longPressGestureRecognizerStateChanged:)];
pahGestureRecognizer.delegate = self;
pahGestureRecognizer.minimumPressDuration = 0.5;
[self.viewB addGestureRecognizer:pahGestureRecognizer];
[dtapGestureRecognize release];
[tapGestureRecognize release];
[pahGestureRecognizer release];
}
#pragma mark -
#pragma mark Button actions
- (IBAction)buttonTouchUpInside:(id)sender {
NSLog(@"%s, %@", __FUNCTION__, sender);
}
#pragma mark -
#pragma mark Gesture recognizer actions
- (void)singleTapGestureRecognizer:(UIGestureRecognizer *)gestureRecognizer {
NSLog(@"%s", __FUNCTION__);
}
- (void)doubleTapGestureRecognizer:(UIGestureRecognizer *)gestureRecognizer {
NSLog(@"%s", __FUNCTION__);
}
- (void)longPressGestureRecognizerStateChanged:(UIGestureRecognizer *)gestureRecognizer {
switch (gestureRecognizer.state) {
case UIGestureRecognizerStateEnded: {
NSLog(@"%s", __FUNCTION__);
break;
}
default:
break;
}
}
Jawaban:
Dalam metode "shouldReceiveTouch", Anda harus menambahkan ketentuan yang akan mengembalikan NO jika tombol disentuh.
Ini dari contoh SimpleGestureRecognizers apel .
semoga membantu
Edit
Seperti yang dicatat Daniel, Anda harus menyesuaikan diri
UIGestureRecognizerDelegate
agar berfungsi.shani
sumber
if ( [touch.view isKindOfClass:[UIControl class]] || [[touch.view superview] isKindOfClass:[UITableViewCell class]] ) {
... Perhatikan bahwa sel tampilan tabel "disentuh" di contentView mereka, yang merupakan anggota kelas privat, jadi di sana kami memeriksa kelas superview sebagai gantinya.Saya juga mengalami masalah yang sama, lalu saya coba
Ini bekerja dengan sempurna sekarang .........
sumber
myGestureRecognizer.delegate = self;
Secara umum, kami menggunakan metode delegasi di bawah ini untuk menghindari sentuhan di semua jenis UIControls:
Catatan: JANGAN lakukan pemeriksaan ini (periksa jenis kelas pengenal.view) gestureRecognizerShouldBegin, itu tidak akan berfungsi.
sumber
Ini adalah versi Swift 3.0 :
Jangan lupa untuk:
Make your tapper object delegate to self (e.g: tapper.delegate = self)
sumber
Ini adalah versi Swift:
Jangan lupa untuk:
UIGestureRecognizerDelegate
tapper.delegate = self
)sumber
Solusi terbaik adalah menurut saya menggunakan cuplikan kode di bawah ini:
sumber