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

StackOverflow https://stackoverflow.com/questions/418419

  •  03-07-2019
  •  | 
  •  

Вопрос

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

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

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

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

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

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

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

Это было полезно?

Решение

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

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

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

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

Другие советы

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

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top