Базовая структура кода анимации / соглашения - PullRequest
2 голосов
/ 17 мая 2009

Изучая Core Animation, я очень быстро понял, что, если вы не сделаете это правильно, вы получите действительно странное неопределенное поведение. Для этого у меня есть несколько вопросов, которые помогут мне лучше понять это.

  • Мой подкласс NSView объявляет следующее в своем init. Это представление является подпредставлением представления с нормальным слоем.

    [self setLayer:[CALayer layer]];
    [self setWantsLayer:NO];
    

    После этого, когда и в каких ситуациях я должен ссылаться на себя, а не на слой себя? Я управлял слоем ТОЛЬКО явными и неявными анимациями, избегая [self setFrame:] и т. Д. И используя [[self layer] setPosition] и т. Д.

  • Проблема с этим подходом состоит в том, что фактический кадр вида остается в одном месте на протяжении всех примененных анимаций. Что если мой взгляд должен получать события мыши? Например, у меня есть представление, которое использует базовую анимацию и перемещается мышью. Можно ли каким-то образом синхронизировать рамку просмотра с текущим состоянием уровня представления, чтобы получать правильные события мыши?

  • Что касается уровня представления, то, очевидно, он доступен только во время выполнения реальной анимации. Есть ли какое-либо свойство слоя, которое может сказать мне, где он на самом деле визуально, даже когда анимация не выполняется?

Ответы [ 2 ]

1 голос
/ 20 августа 2010

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

  • presentationLayer предоставляет информацию о текущем состоянии слоя в режиме "в полете".

  • Когда анимация не происходит, информация presentationLayer и layer будет идентична. Запрос границ, фрейма или позиции слоя , чтобы узнать, где он находится в родительском координатном пространстве.

  • Для просмотра анимации в NSView должна быть включена поддержка слоев.

  • Убедитесь, что вы не просто анимируете с помощью явной анимации и не устанавливаете значение слоя, которое вы анимируете. Анимации не изменяют автоматически свойства слоев, которые они анимируют. Вы должны изменить свойство на конечное значение самостоятельно, или оно просто «вернется» к начальному значению.

  • Если вы хотите анимировать вид, в отличие от слоя, вы можете использовать прокси аниматора, например [[view animator] setFrame:newFrame];

  • Обернуть вызовы аниматора в CATrasaction, чтобы изменить такие вещи, как продолжительность анимации.

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

1 голос
/ 17 мая 2009

Во-первых, вы хотите использовать [self setWantsLayer: YES]. Кроме того, важно вызывать -setLayer: до -setWantsLayer:, если вы хотите предоставить определенный подкласс CALayer (такой как CAScrollLayer); если вам нужен обычный CALayer, просто позвоните -setWantsLayer:, и он будет создан для вас. Еще лучше, просто отметьте опцию «хочет слой» в Интерфейсном Разработчике.

Во-вторых, весь смысл использования представления со слоем заключается в том, что вы можете продолжать использовать обычные методы NSView и получать бесплатные эффекты анимации анимации CoreAnimation. Если вы хотите использовать CoreAnimation в качестве единственного средства перемещения элементов, то правильный способ сделать это - создать представление на основе слоев, которое содержит иерархию представления в чистом CALayer.

Я не смотрел ни одного свободно доступного учебного пособия по CoreAnimation, но определенно могу порекомендовать книгу Прагматических программистов на эту тему . У них также есть скринкаст , доступный автору книги.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...