2012-02-16 3 views
1

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

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

enter image description here

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

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

+0

Вам нужно использовать CA? CA лучше всего подходит для плавной анимации, потому что он легкий, и он легкий, потому что у него нет всего материала для обработки событий (отчасти это правда). Если вы каким-то образом должны были добавить к нему обработку событий, то вы можете уничтожить гладкие способности, способные к использованию на GPU. Я не уверен, что есть способ обойти это. Насколько это необходимо? Возможно, вам захочется оживить некоторые из других методов анимации, которые фактически перемещают модель с помощью процессора.Просто задумываясь вслух. – Vinnie

+0

@Vinnie - Проблема в том, что этот пример - очень простая анимация. Реальная проблема на самом деле включает в себя несколько ключевых кадров для анимации вида вдоль пути, а также некоторого вращения по мере продвижения по пути. Анимация также должна повторять ad-infinitum, поэтому использование блоков UIView на самом деле не похоже на хорошую подгонку. –

ответ

1

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

Создать класс MYAnimationContainerView (синий ящик).

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

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

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

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

Вы также можете реализовать его с помощью цели/селектора, но этот шаблон получил значение a bit of a hassle with ARC, и я склонен препятствовать его использованию сегодня.

+0

Мне нравится ваш подход намного лучше. Благодаря! –

0

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

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

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

+0

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

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

  • Нет связанных вопросов^_^