Используя Core Animation, есть ли способ сгруппировать анимации для нескольких слоев CALay? - PullRequest
5 голосов
/ 07 января 2009

У меня есть ситуация, когда у меня есть много CALayers, которые анимируются «пошаговым» способом. Я анимирую позицию на каждом из этих CALayers, но они имеют одинаковую продолжительность. Как только все эти CALayers заканчивают анимацию, начинается новый «поворот», и они снова анимируют меняющиеся позиции.

В целом идея заключается в том, что при линейной интерполяции между позициями и с постоянной скоростью переход от состояния к состоянию по очереди выглядит как анимация в реальном времени. Это, однако, трудно достичь с помощью множества разных слоев CALay.

CAAnimationGroup используется для группировки анимаций на одном CALayer. Но мне было интересно, есть ли простое решение для группирования анимаций, которые должны иметь одинаковую продолжительность, на нескольких CALayers вместе?

Отредактировано, чтобы включить ответ на вопрос Кевина Балларда

Моя проблема заключается в этом. Я создаю анимацию для каждого из моих CALayers, затем помещаю те, в NSArray. Как только я получаю обратный вызов, что индивидуальная анимация закончилась, я удаляю его из NSArray. Когда он опустеет, я снова создаю для них анимацию.

При наличии нескольких слоев заметная задержка между окончанием всех анимаций и началом новых.

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

Ответы [ 4 ]

5 голосов
/ 09 января 2009

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

Я анимирую до 60 CALay за один раз и не испытываю никаких задержек между этапами анимации, но я не кэширую анимации в каком-либо массиве, я не уверен в том, что у вас там есть издержки .

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

В некоторых случаях есть несколько анимаций, которые я могу создавать с разным временем запуска (используя beginTime), я связываю их с CAAnimationGroup - но вы не сможете предварительно рассчитать последующие анимации.

2 голосов
/ 22 апреля 2009

Если вы оберните свои анимации в CATransaction, CG позаботится о том, чтобы все они выполнялись во время одной и той же итерации основного цикла.

[CATransaction begin]; // все ваши анимации [CATransaction commit];

0 голосов
/ 08 сентября 2009

cp21yos: можете ли вы уточнить свой метод? Я пытаюсь сделать что-то подобное, что включает в себя анимацию нескольких слоев одновременно, более одного раза. Вы сказали: «В конце анимации я прикрепляю следующий этап анимации». Вы можете это объяснить? Когда я пытаюсь поместить логику для выполнения дополнительных анимаций в событие animationDidStop, происходит только последняя анимация, а не вся последовательность анимаций.

0 голосов
/ 07 января 2009

Если вы добавите 3 анимации к 3 разным слоям одновременно и они будут иметь одинаковую продолжительность, я ожидаю, что все они будут анимированы вместе. Какое поведение вы видите?

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