UITouch & UIEvents: борьба с рамками? - PullRequest
1 голос
/ 07 февраля 2012

Представьте себе представление, скажем, с 4 подпредставлениями, расположенными рядом друг с другом, но не перекрывающимися.Давайте назовем их view # 1 ... view # 4

Все 5 таких представлений являются моими собственными подклассами UIView (да, я читал: Обработка событий , а также iOSРуководство по событиям и этот SO вопрос и этот один , еще не отвеченный)

Когда пользователь касается одного из них, UIKit "hiTests" его и доставляетпоследующие события для этого представления: представление # 1

Даже когда палец выходит за пределы представления # 1, более, скажем, представление # 3.

Даже если это «перетаскивание» теперь над представлением № 3,представление # 1 все еще получает touchchesMoved, но представление # 3 ничего не получает.

Я хочу, чтобы представление # 3 начало отвечать на прикосновения.Может быть, с моим собственным «touchedEntered» и, возможно, с «touchesExited» на представлении №1.

Как бы я поступил об этом?

Я вижу два подхода.

  1. обходите проблему и выполняйте всю обработку прикосновений в родительском представлении всякий раз, когда я обнаруживаю прикосновения, перемещенные за пределы границ вида # 1, или
  2. переходим в родительское представление, сообщая ему «redispatch»,Не очень понятно, как будет работать такая повторная отправка.

Для решения № 2, где я запутался, речь идет не о пересылке как таковой, , а о том, как найти UIVIew Iхочу переслать на. Я, очевидно, могу циклически просматривать родительские подпредставления, пока не найду тот, чьи границы / фрейм содержат касание, но мне интересно, если я что-то упустил, то Apple бы уже предоставила, но я не могуотносятся к этой проблеме.

Есть идеи?

Ответы [ 2 ]

1 голос
/ 30 марта 2012

Вы можете захотеть прочитать Обработка событий еще раз, так как это очень близко к , отвечая на ваш вопрос :

Сенсорный объект ... isсвязан с его тестом на попадание в течение его срока службы, даже если касание, представленное объектом, впоследствии перемещается за пределы вида.

Учитывая это, если вы хотите достичь своей цели, чтобы различные виды реагировали напользователь пересекает их пальцем, и если вы хотите сделать это с помощью механизма обработки касаний, предоставляемого UIView, вам следует придерживаться первого подхода: родительский вид обрабатывает касание.Родитель может использовать -hitTest:withEvent: или -pointInside:withEvent:, поскольку он отслеживает касание, чтобы определить, находится ли касание в одном из подпредставлений, и, если да, может отправить соответствующее сообщение.

1 голос
/ 07 февраля 2012

Я сделал это, но я использовал CALayers вместо sub-UIViews.Таким образом, можно не беспокоиться о том, что подпредставления перехватывают / переотправляют события в родительский UIView.Возможно, вы не сможете сделать это, но это упрощает вещи.Мое решение имело тенденцию использовать CGRectContainsPoint() много.

...