Точная начальная позиция для UIPanGestureRecognizer?

Я использую UIPanGestureRecogniser для реализации перетаскивания. Когда начинается перетаскивание, мне нужно определить объект, который перетаскивается. Однако объекты относительно небольшие. И если пользователь не нажмет объект прямо в центре объекта, он не будет перетаскиваться.

Проблема в том, что при первом вызове обработчика жестов с состоянием UIGestureRecognizerStateBegan палец уже переместился на несколько пикселей, и поэтому [UIPanGestureRecognizer locationInView:] возвращает ту точку, которая не находится там, где на самом деле начался жест. Это имеет смысл, так как он может распознать кастрюлю только после нескольких пикселей движения. Однако мне нужно абсолютное начало жеста, а не позиция после того, как жест был впервые распознан.

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


person Steve Waddicor    schedule 05.07.2014    source источник
comment
Думали ли вы о возможном использовании методов обработки событий touchesBegan: и touchesMoved: путем создания подкласса UIView?   -  person sooper    schedule 05.07.2014
comment
Насколько велики перетаскиваемые просмотры? В идеале они должны быть минимум 44x44 точки. Если они соответствуют этому требованию, то, возможно, мы сможем решить вашу проблему.   -  person duci9y    schedule 05.07.2014
comment
Прямо сейчас самый маленький объект имеет размер 44x46 точек. Это общая проблема, которая затрагивает любой перетаскиваемый объект любого размера. Это просто более очевидно с меньшими объектами, поскольку область в середине объекта, которую всегда можно перетаскивать, относительно меньше.   -  person Steve Waddicor    schedule 05.07.2014
comment
Отвечает ли это на ваш вопрос? начальная точка UIPanGestureRecognizer отключена   -  person Senseful    schedule 09.03.2020


Ответы (1)


Протокол UIGestureRecognizerDelegate предоставляет методы gestureRecognizerShouldBegin: и gestureRecognizer:shouldReceiveTouch:, которые могут помочь вам оценить касания до того, как панорамирование перейдет в состояние UIPanGestureRecognizerStateBegan.

person spassas    schedule 05.07.2014
comment
К сожалению, в gestureRecognizer:shouldReceiveTouch: locationInView: все еще есть место предыдущего панорамирования. А в gestureRecognizerShouldBegin: локация такая же, как я уже получаю в обычном обработчике. locationOfTouch:inView: также бесполезен во время любого из этих методов. - person Steve Waddicor; 05.07.2014
comment
Если вы вызовете gesture.locationInView, то да, вы получите неверное значение. Но если вы вызовете touch.locationInView, вы получите точное значение. Обратите внимание, что метод обратного вызова дает вам оба объекта (жест и прикосновение). Подробнее см. в этом ответе. - person Senseful; 09.03.2020