2014-11-08 2 views
1

я создаю пользовательский элемент управления * с помощью подклассов UIControl и опрокинув следующие методы:подклассов UIControl для мультитач

  • - beginTrackingWithTouch:withEvent:
  • - continueTrackingWithTouch:withEvent:
  • - endTrackingWithTouch:withEvent:
  • - cancelTrackingWithEvent:

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

Моя проблема возникает в конце этих событий мультитач, в endTrackingWithTouch:withEvent:. Система называет этот метод на моем контроле ровно один раз на последовательность мультитач, и он вызывается при первом касании, которое происходит. Это означает, что второе касание, которое все еще можно перетаскивать, больше не будет отслеживаться.

Эта последовательность действий служит примером для этого явления:

  1. Палец приземляется. beginTracking называется.
  2. Finger A таскает вокруг. continueTracking неоднократно вызывается для обновления моего элемента управления.
  3. Finger B Прикосновение вниз. beginTracking называется.
  4. Пальцы A и B перетащить. continueTracking неоднократно вызывается для обновления моего элемента управления.
  5. Finger B касается. endTracking называется.
  6. Finger A таскает вокруг. Никакие методы не вызываются.
  7. Finger A касается вверх. Никакие методы не вызываются.

Проблема заключается в последних трех шагах в этой последовательности. The documentation for UIControl говорит следующее из endTrackingWithTouch:withEvent::

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

Тем не менее, мне кажется, что после того, как палец B прикасается в пункте 5, выше, последний штрих к данному событию еще не полностью закончился. Последнее касание пальцем A!


* Ползунок диапазона, если вы должны спросить. Но уже есть много ползунков с открытым исходным кодом, вы говорите. Да, правда, но этот будет поддерживать мультитач и автоматический макет.

ответ

1

У меня была та же проблема в пользовательском управлении с мультитач.
Поскольку UIControl является подклассом UIView, который наследует от UIResponder, так что не стесняйтесь использовать:

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event; 
- (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event; 
- (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event; 
- (void)touchesCancelled:(NSSet *)touches withEvent:(UIEvent *)event; 

методы.

Эти методы отлично работают в подклассе UIControl.

+0

Это подход, который я сейчас рассматриваю. Однако это означает, что мне нужно переопределить переменную 'tracking', а также переменную' touchInside', так как я полностью закрываю сенсорную обработку 'UIControl'. Кроме того, я должен переопределить 'hitTest: withEvent:', чтобы убедиться, что любые касания, которые делают его «touchhesBegan: withEvent:» - это те, которые я хочу обработать, потому что я не могу называть 'super' в этой точке. – ravron

+0

Документы говорят: Переопределить beginTrackingWithTouch: withEvent :, continueTrackingWithTouch: withEvent :, endTrackingWithTouch: withEvent :, and cancelTrackingWithEvent: методы отслеживания событий касания, происходящих в элементе управления. Вы можете использовать информацию отслеживания для выполнения дополнительных действий. ** Всегда используйте эти методы для отслеживания событий касания вместо методов, определенных классом UIResponder. ** –

Смежные вопросы