Заставить UITapGestureRecognizer распознавать прикосновения, когда они начинаются?

Есть ли способ заставить UITapGestureRecognizer запускаться при касании?

Я не могу использовать touchesBegan, потому что я использую UITableView, и суперпредставление по существу крадет событие.

Я просто хочу определить, когда экран впервые коснулся. Почему это так сложно? Может быть, мне нужно другое решение, чем использование tapgesturerecognizer?


person maxhud    schedule 18.11.2013    source источник


Ответы (3)


Вы можете использовать свойство state для UIGestureRecognizer для определения различных состояний любого жеста -

@property(nonatomic,readonly) UIGestureRecognizerState state;  // the current state of the gesture recognizer

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

if (gestureRecognizer.state == UIGestureRecognizerStateBegan) {
    // Do your stuff
}
person Ashok    schedule 18.11.2013
comment
Это не работает. По какой-то причине он возвращает false в 100% случаев, хотя его относительное stateEnded работает просто отлично. - person maxhud; 18.11.2013
comment
Это связано с тем, что UITapGestureRecognizer не является непрерывным распознавателем. Распознаватель для дискретных жестов переходит из UIGestureRecognizerStatePossible в UIGestureRecognizerStateFailed или UIGestureRecognizerStateRecognized. Это отличается от непрерывных распознавателей, таких как панорамирование или сжатие, в которых переход начался, изменился, закончился. Вы можете попытаться использовать состояние возможно, но будьте утомлены, так как это не обязательно означает, что пользователь нажал, он может начать другой жест. Я бы рекомендовал использовать UIControl с парой целевых действий состояния UIControlStateHighlighted. - person atreat; 18.11.2013

Вы можете добавить распознаватель жестов касания в tableView в viewDidLoad следующим образом:

UITapGestureRecognizer *tapGestureRecognizer = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(tapGestureRecognized:)];
[self.tableView addGestureRecognizer:tapGestureRecognizer];

Затем реализуйте этот метод:

- (void)tapGestureRecognized:(UITapGestureRecognizer *)tapGestureRecognizer {
    NSLog(@"tap gesture recognized");
}

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

person Leijonien    schedule 18.11.2013

Вам нужно установить delaysContentTouches = NO

person maxhud    schedule 18.11.2013