Лучший шаблон для обработки прикосновений в анимированном UIView / CALayer? - PullRequest
1 голос
/ 16 февраля 2012

У меня есть UIView экземпляр, который я анимирую, используя CAKeyframeAnimation. Это цикличная анимация, которая будет постоянно в движении. Однако мне нужно разрешить взаимодействие пользователя с элементом (точнее, реагирование на нажатия). Поскольку CoreAnimation перемещает только уровень представления, а не модель, я не могу использовать экземпляр UIButton, например, чтобы по существу получить события touchUpInside.

Рассмотрим следующий базовый пример макета:

enter image description here

Я использую синее поле для сенсорных событий, переопределяя метод touchesEnded:withEvent: в подклассе UIView. Затем я передаю это событие через NSNotification (я действительно не хочу вводить много связей для обработки этого события) в содержащий контроллер представления, который затем выполняет анимацию hitTest: на красном прямоугольнике *. 1016 *

Все это выглядит довольно глупо, если просто прикоснуться к анимированному UIView. Каковы некоторые из лучших шаблонов для обработки касаний для анимированных UIView / CALayer экземпляров?

Ответы [ 2 ]

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

Отслеживание касания в суперпредставлении - это правильно, я считаю. Но я бы предпочел провести тестирование в суперпредставлении, а не публиковать уведомление на контроллере представления. Примерно так:

Создайте класс MYAnimationContainerView (синее поле).

Дайте ему обратный вызов делегата или блока, который устанавливает контроллер представления. Например:

__weak id weakSelf = self;
MYAnimationContainerView *view = [[MYAnimationContainerView alloc] initWithTouchCallback:^(UIView *touchedView){
  [weakSelf handleTouchToView:touchedView];
}];

В MYAnimationContainerView переопределите значения touchesBegan:withEvent: и touchesEnded:withEvent:. В began выполните проверку попадания на уровне представления движущихся видов. Следите за тем, какой из них (если есть) был затронут. В ended выполните еще один тест на попадание. Если это тот же самый вид, тогда перезвоните.

Вышесказанное можно легко реализовать с помощью протокола delegate, а не блока. Я просто привык к тому, что блоки предпочтительнее протоколов делегатов с одним методом.

Вы также можете реализовать его с помощью target / selector, но этот паттерн стал немного сложным с ARC , и я склонен препятствовать его использованию сегодня.

0 голосов
/ 16 февраля 2012

Если вы хотите обработать прикосновение к определенному объекту в представлении, скажем, красное поле на синем, лучше создать отдельный класс, скажем, подкласс UIview, и обрабатывать в нем события касания.Это чисто и абстрактно.

В случае многих таких объектов сенсорные события обрабатываются сами собой.

Я не уверен, что это то, что вы ожидали.

...