Обработка распознавателей жестов в iOS6 - программирование
Подтвердить что ты не робот

Обработка распознавателей жестов в iOS6

Очевидно, что iOS 6 пытается автоматически обрабатывать ситуацию, когда у вас есть распознаватель жестов и UIButton в том же месте, который активируется для того же жеста.

Эта новая автоматическая обработка решает проблему, если вы хотите нажать кнопку вместо активации распознавателя жестов, но создает новую проблему, когда вы хотите, чтобы распознаватель жестов действовал.

В iOS 5 вы можете реализовать:

-(BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceiveTouch:(UITouch *)touch

чтобы передать действие в UIButton в конфликте.

Это не работает в iOS 6. Кроме того, инвертирование поведения этого метода (потому что теперь UIButton имеет приоритет вместо распознавателя жестов) не будет работать.


Полный метод:

- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceiveTouch:(UITouch *)touch {
    if ([touch.view isKindOfClass:[UIControl class]]){
        return NO;
    }
    return YES;
}
4b9b3361

Ответ 1

Я сделал это, чтобы решить эту проблему, изменив ее по своему усмотрению:

- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceiveTouch:(UITouch *)touch {
      [self MyCommonSelector];// this will work for ios 5
      return Yes;
 }

Добавить цель в кнопку, где вы объявляете так, что это вызовет iOS 6:

[self.myButton addTarget:self action:@selector(MyCommonSelector)
  forControlEvents:UIControlEventTouchUpInside];

Сделайте свой материал в этом методе, который также будет вызываться при нажатии кнопки и из жестов, который вам нужно вызвать:

-(void)MyCommonSelector
 {
    //Do your stuff here what you want to do with Gesture too.
 }

Ответ 2

Хотя я не знаю, почему вы бы поставили UIButtons там, если вы не хотите, чтобы их прослушивали, вы можете запретить получателям получать сообщения от переопределения метода -hitTest:withEvent: вашего содержащего представления.

-hitTest:withEvent: по умолчанию возвращает "самый дальний потомок получателя в иерархии представлений (включая себя), который содержит указанную точку", поэтому по умолчанию при нажатии одной из кнопок ваш отображаемый вид возвращает кнопку.

Ваша реализация должна выглядеть примерно так:

- (UIView *)hitTest:(CGPoint)aPoint withEvent:(UIEvent *)event {
    if ([self pointInside:aPoint]) {
        return self;
    } else {
        return nil;
    }
}

Итак, если ваш контейнерный просмотр, на который он вызывается, содержит точку касания, он возвращается сам, и распознающий жест, привязанный к нему, будет на ощупь.

Поскольку эта реализация никогда не возвращает какого-либо подзаголовка, ни один из UIButtons никогда не получит возможность ответить на прикосновения.

Ответ 3

Я знаю, что это кажется упрощенным, но считаете ли вы, что свойство UIButton userInteractionEnabled равно "НЕТ"? Это должно удалить его автоматически из системы тестирования ударов и распознавания жестов.