Использование логики hitTest только для touchesBegan, а НЕ для средств распознавания жестов

#objective-c #ios

#objective-c #iOS

Вопрос:

Я разрабатывал простую игру для iOS, которая включает перетаскивание и использование поворота — и других средств распознавания жестов. Перетаскивание осуществляется через touchesBegan/Moved/Ended , а поворот — через распознаватель.

Виды имеют неправильную форму, и границы вида иногда перекрываются, поэтому я внедрил UIImage ColorAtPixel от Ole Belgeman в моем режиме просмотра изображений и переопределил isPointInside метод в режиме просмотра основного элемента. isPointInside вызывает метод в режиме просмотра изображений, который проверяет альфа в точке касания и возвращает NO, если касались прозрачной секции. По сути, hitTest игнорирует эту ветку.

Но побочным эффектом этого является то, что hitTest игнорирует все касания в прозрачной секции, а средство распознавания поворота работает только в непрозрачной зоне. Для некоторых представлений, которые слишком малы по размеру, становится невозможным использовать жест поворота : (

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

Проверка прозрачности в touchesBegan работает, но когда вы касаетесь прозрачной секции, которая перекрывает непрозрачную секцию другого вида, последний не получает касания.

Я просто не могу понять, в чем фокус…

Заранее благодарю вас за любую помощь!

Ответ №1:

Я бы заставил перетаскивание использовать UIPanGestureRecognizer, чтобы вы могли реализовать метод делегирования -GestureRecognizer: shouldReceiveTouch: для возврата NO , когда ваш распознаватель панорамирования рассматривает касания в прозрачной области. Оставьте это невыполненным или вернитесь YES из вашего средства распознавания поворотов, чтобы получить все.

Кроме того, использование средств распознавания жестов для обоих видов действий имеет другие преимущества, такие как возможность указывать зависимости с помощью -requireGestureRecognizerToFail:.

Ответ №2:

Попробуйте проверить, отличается ли параметр UIEvent, который передается в pointInside:withEvent: когда он поступает из средства распознавания жестов, от параметра, переданного при вызове из touchBegan / Moved / Ended.

Если это отличается, то я предполагаю, что это решает вашу проблему.

Просто поместите точку останова или NSLog в pointInside, чтобы увидеть параметр события в каждом случае и посмотреть, сможете ли вы отличить.

Удачи!