2017-01-03 4 views
0

Мое приложение использует вычисленный горизонтальный вид прокрутки. На каждой странице есть UIControls, к которому пользователь может нажать.Duplicate UIScrollView отменяет поведение с UIPanGestureRecognizer

UIScrollView отлично справляется с отменой прикосновений и ударов. Если пользователь начинает прокручивать достаточно быстро, это всегда салфетки. Если пользователь коснется достаточно долго, чтобы активировать выделенное состояние, прокрутка не пытается прокручиваться.

Я пытаюсь дублировать это поведение с подклассом UIPanGestureRecognizer, чтобы я мог реагировать на прокрутки вниз в моем scrollview. Однако я не могу заставить этот жест отменить в случае подсчета UIControls.

До сих пор я сделал следующее:

self.refreshGesture.cancelsTouchesInView = YES; 
self.refreshGesture.delaysTouchesBegan = NO; 
self.refreshGesture.delaysTouchesEnded = NO; 

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

Я пробовал установить делегата на мой жест, и это может быть путь. Но я не нашел комбинацию, которая работает. Например, просто проверка того, что касание начинается в UIControl, отменяется слишком часто. Я также попытался переопределить gestureRecognizerShouldBegin в своих элементах управления, но это похоже на взломать и имеет далеко идущие последствия (например, помехи от жестов UITextView).

В этом GIF вы можете видеть, что элемент управления активируется при касании, и scrollview отменяет прокрутку, если это произойдет. Но мой вниз пан жест не отменяется таким же образом:

enter image description here

ответ

0

Я не был в состоянии дублировать это точно, но есть две возможности, предложенные WWDC 2014 #235.

  1. Добавить прозрачный прокрутка над вашим основным контентом и переместить его распознаватель жестов на корневой режим. Вот что. Это позволило мне использовать UIScrollViewDelegate, который оказался достаточным.
  2. Используйте распознаватель жестов «тайм-аут». Видео предполагает, что жест тайм-аута терпит неудачу, но в моем случае лучше было использовать длинный жест нажатия и отменить мою панораму, если долгое нажатие нажимается. 0,1 секунды, казалось, работали лучше, чем их предлагаемые 0,15 секунды.
Смежные вопросы