iOS5 UITapRecognizer для UIScrollView, мешающий кнопкам. Как исправить? - PullRequest
8 голосов
/ 24 ноября 2011

У меня есть группа UIButton в пределах UIView в пределах UIScrollView.Я пытаюсь добавить распознавание касаний к представлению прокрутки.Распознаватель касаний срабатывает, но теперь ни одна из моих кнопок не работает.

Я знаю, что в iOS5 UIScrollView может каким-то образом передать событие касания в иерархию элементов управления после того, как с ним покончено.Кто-нибудь может помочь мне понять, как это сделать?

Ответы [ 3 ]

15 голосов
/ 24 ноября 2011

Установите для свойства UIGestureRecognizer cancelsTouchesInView значение NO.

UITapGestureRecognizer *singleTapGestureRecognizer = [[UITapGestureRecognizer alloc] initWithTarget:self 
                                                                                             action:@selector(singleTap:)];
singleTapGestureRecognizer.numberOfTapsRequired = 1;
singleTapGestureRecognizer.enabled = YES;
singleTapGestureRecognizer.cancelsTouchesInView = NO;
[tapableView addGestureRecognizer:singleTapGestureRecognizer];
[singleTapGestureRecognizer release];

С UIGestureRecognizer Reference Class

Логическое значение, влияющее на то, касаются лидоставляется в представление при распознавании жеста.

Когда это свойство имеет значение YES (по умолчанию) и получатель распознает его жест, ожидающие касания этого жеста не доставляются в представление, а ранее доставленные касанияотменяются через касания Отменено: withEvent: сообщение отправлено на просмотр.Если распознаватель жестов не распознает его жест или значение этого свойства равно NO, представление получает все касания в последовательности мультитач.

2 голосов
/ 07 февраля 2013

Для меня комбо из приведенных ответов сработало

UITapGestureRecognizer *tapRecognizer = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(userDidTap:)];
tapRecognizer.cancelsTouchesInView = YES;
tapRecognizer.delegate = self;
[tapRecognizer requireGestureRecognizersToFail:self.scrollView.gestureRecognizers];
[self.view addGestureRecognizer:tapRecognizer];

-

- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceiveTouch:(UITouch *)touch
{
    if ([touch.view.superview isKindOfClass:[UIButton class]] || [touch.view isKindOfClass:[UIButton class]])
    {
        return NO;
    }
    return YES;
}
0 голосов
/ 24 ноября 2011

Вы также можете использовать gestureRecognizer:shouldReceiveTouch: метод UIGestureRecognizerDelegate, который задокументирован здесь , чтобы выполнить то же самое.Он предлагает немного больше гибкости, например, если вы хотите отменить некоторые касания, но не другие.Вот пример,

- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceiveTouch:(UITouch *)touch
{
    if ([touch.view.superview isKindOfClass:[UIButton class]]) return NO;

    return YES;
}
...