У меня есть иерархия представлений, которая выглядит примерно так:
UIView (A)
UIView > UIImageView
UIView > UIView (B)
UIView > UIView (B) > Rounded Rect Button
UIView > UIView (B) > UIImageView
UIView > UIView (B) > UILabel
Я прикрепил распознаватели жестов к своему UIView (B). Проблема, с которой я столкнулся, заключается в том, что я не получаю никаких действий для кнопки Rounded Rect, которая находится внутри UIView (B). Распознаватель жестов singleTap фиксирует / отменяет событие Touch Up Inside для кнопки.
Как заставить его работать? Я думал, что иерархия цепочки респондентов будет гарантировать, что событию касания кнопки будет отдано предпочтение, и оно БУДЕТ запускаться! Что мне не хватает?
Вот какой-то связанный код:
#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;
}
}
Ответы:
В методе shouldReceiveTouch вы должны добавить условие, которое вернет NO, если касание находится в кнопке.
Это из примера Apple SimpleGestureRecognizers .
надеюсь, это поможет
редактировать
Как заметил Дэниел, вы должны соответствовать, чтобы
UIGestureRecognizerDelegate
это работало.Шани
источник
if ( [touch.view isKindOfClass:[UIControl class]] || [[touch.view superview] isKindOfClass:[UITableViewCell class]] ) {
... Обратите внимание, что ячейки tableview "касаются" в их contentView, который является членом частного класса, поэтому вместо этого мы проверяем класс суперпредставления.У меня тоже была такая же проблема, потом я попробовал с
Теперь он работает отлично .........
источник
myGestureRecognizer.delegate = self;
Вообще говоря, мы используем нижеприведенный метод делегата, чтобы избежать касания во всех видах UIControls:
Примечание: НЕ выполняйте эту проверку (проверьте тип класса распознавателя .view) gestureRecognizerShouldBegin, это не сработает.
источник
Вот версия Swift 3.0 :
Не забудьте:
Make your tapper object delegate to self (e.g: tapper.delegate = self)
источник
Вот версия Swift:
Не забудьте:
UIGestureRecognizerDelegate
tapper.delegate = self
)источник
На мой взгляд, лучшим решением является использование фрагмента кода ниже:
источник