Прерывание прокрутки/анимации UIScrollView с помощью UIGestureRecognizer

У меня есть UIScrollView и UITapGestureRecognizer, оба довольно простые, и я заставил их работать вместе всеми способами, которые мне нужны, кроме одного. UIScrollView не использует масштабирование, а UITapGestureRecognizer пока просто пишет в консоль.

Я могу заставить UITapGestureRecognizer писать в консоль, когда нажимается UIScrollView, либо в стационарном состоянии, либо при анимации через setContentOffset, но я не могу заставить его работать, когда UIScrollView движется из-за смахивания. Когда UIScrollView прокручивается и все еще находится в движении, первое нажатие после пролистывания остановит его движение, а затем UITapGestureRecognizer улавливает только второе нажатие. Я надеюсь получить первый тап, чтобы остановить прокрутку UIScrollView, а также записать в консоль через UITapGestureRecognizer.

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

Изменить: спасибо за предложения, см. ниже

Извините, я не думаю, что я очень хорошо объяснил. Я понимаю, что первое движение на стационарном UIScrollView — это смахивание (которое в моем случае просто обрабатывается UIScrollView кстати, а не распознавателем жестов).

Проблема заключается в том, что после смахивания и отпускания, если вы нажмете во время движения (и никаких других касаний не происходит), UITapGestureRecognizer не улавливает его, а только улавливает UIScrollView и останавливает движение UIScrollView. Если вы позволите ему замедлиться, а затем нажмите, это работает нормально. Кроме того, если он движется из-за анимации, а не смахивания, нажатие также работает нормально.

То же самое и при использовании `UILongPressGestureRecognizer', который я хочу использовать в идеале, но подумал, что если я не смогу заставить его работать одним касанием, у меня нет шансов!


person user728159    schedule 27.04.2011    source источник


Ответы (2)


Похоже, вам нужно реализовать

- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldRecognizeSimultaneouslyWithGestureRecognizer:(UIGestureRecognizer *)otherGestureRecognizer

делегируйте метод для вашего UITapGestureRecognizer и возвращайте YES для UIGestureRecognizers, с которым вы хотите интерпретировать жесты касания синхронно.

e.x.

// Somewhere in your code...
UIGestureRecognizer *tap = [[UITapGestureRecognizer alloc] init];
tap.delegate = self;
[self.view addGestureRecognizer:tap];
[tap release];

// And the delegate method...
- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldRecognizeSimultaneouslyWithGestureRecognizer:(UIGestureRecognizer *)otherGestureRecognizer {
        return YES;
}

н.б. Возможно, вы захотите более разборчиво решить, с каким UIGestureRecognizer(s) вы хотите работать синхронно. Пример будет работать с любым другим распознавателем жестов.

person Sam    schedule 27.04.2011

Проблема в том, что когда пользователь нажимает в первый раз, чтобы прокрутить UIScrollView, это не нажатие, а пролистывание. Это будет считаться нажатием только тогда, когда пользователь нажимает и отпускает палец почти в одном и том же месте (не проводя пальцем по экрану).

Что вы можете сделать, чтобы решить вашу проблему: используйте метод UIScrollView делегата scrollViewWillBeginDragging, и тогда вы узнаете, когда пользователь только что нажал и начнет перетаскивать прокрутку, а также добавить UITapGestureRecognizer для этих реальных нажатий.

person Felipe Sabino    schedule 28.04.2011