2012-09-20 2 views
14

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

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

В прошивкой 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; 
} 
+0

у вас есть uigesturerec ognizer на uiview, который имеет subview uibutton и хочет, чтобы распознаватель жестов получал касания вместо кнопки? – Ahti

+0

да. На самом деле это 'UITableView' с' UIButtons' внутри ячеек, и я хочу, чтобы распознаватель жестов был активирован вместо кнопок. – jturolla

+0

Разве iOS не сделал это до самого начала? У меня всегда были проблемы с нажатием кнопки. –

ответ

6

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

- (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]; 

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

0

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

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

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

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

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

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

+0

Это оказалось не очень хорошей идеей. – jturolla

+2

Не могли бы вы поделиться * почему? – Ahti

+0

У меня есть кнопка в «popup», которую я скрываю с помощью этого метода. Эта кнопка не будет работать. – jturolla

0

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

+0

Теперь это хороший путь. – jturolla

+0

Тогда вы могли бы отметить меня как правильно? – thebarcodeproject

+0

Мне очень жаль, я думаю, что это не хороший путь. – jturolla

Смежные вопросы