Использование pointInside:withEvent: для разных жестов

У меня есть два представления A и B. B является частью A. Я хочу отслеживать действия двойного касания в A, в этом случае я перемещу B в положение касания.

Теперь я хочу сделать ту часть кодов внутри B, что позволит избежать кодирования в A.

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

Тем не менее, я по-прежнему хочу, чтобы другие жесты (включая одно касание) работали на A, поэтому я придумал два разных способа, как это сделать:

  1. Распознать внутри pointInside:, а для одиночных нажатий вернуть NO, для двойных нажатий∫ вернуть YES, однако, кажется, нет способа сделать это.
  2. Всегда возвращайте YES для pointInside: и фиксируйте как одиночные, так и двойные жесты. Для жестов с одним касанием отправьте его на A для обработки, однако до сих пор не нашли способа для этого.

Кто-нибудь может помочь мне в этом? Или сказать, если я смотрю в неправильном направлении?


person jeff wu    schedule 26.07.2013    source источник


Ответы (1)


Такой подход может работать, но он очень беспорядочный просто потому, что pointInside:withEvent: — очень примитивный вызов.

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

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

Проще говоря, распознаватели жестов — это очень удобные объекты, которые заключают в себе все сложности, связанные с необходимостью иметь дело с реальным временем UITouch самостоятельно.

В качестве решения, которое сохраняет код относительно чистым, вы можете добавить UITapGestureRecognizer к A, а затем передать селектор для B, вы даже можете сделать это в построителе интерфейса или через код:

UITapGestureRecognizer *tapGesture = [[UITapGestureRecognizer alloc] initWithTarget:B action:@selector(handleGesture:)];
tapGesture.numberOfTapsRequired = 2;

[A addGestureRecognizer:tapGesture];

(A и B – ваши взгляды)

person Can    schedule 26.07.2013
comment
Это работает, за исключением того, что в B нет представления для приема события, скажем, uiwebview может обрабатывать длительное нажатие, двойное нажатие и т. д. Наконец, я перезаписываю sendevent и делаю некоторый обработчик уведомлений. - person jeff wu; 31.07.2013
comment
Я не совсем уверен, что вы спрашиваете. B также является представлением, поэтому оно должно иметь возможность обрабатывать события. - person Can; 31.07.2013