Mac OS: CAAnimation - легко обновлять анимацию - PullRequest
0 голосов
/ 01 апреля 2019

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

Другими словами, когда я применяю новую анимацию, эта анимация начинается с позиции 0 (состояние), в то время как фактическое (видимое) состояние предыдущей анимации отличается.

Вот пример: ( ссылка )

<blockquote class="imgur-embed-pub" lang="en" data-id="a/q3NA31f"><a href="//imgur.com/q3NA31f"></a></blockquote><script async src="//s.imgur.com/min/embed.js" charset="utf-8"></script>

Код для анимации:

CABasicAnimation *anim = [CABasicAnimation animationWithKeyPath:@"transform.rotation"];
anim.duration = time;
anim.repeatCount = INFINITY;
anim.fromValue = from;
anim.byValue = by;

[self.myLayer addAnimation:anim forKey:kActivityAnimationKey];

Первая примененная анимация имеет другое время / от / по параметрам.

ЛЮБЫЕ советы будут высоко цениться, так как я придерживался их два дня и перепробовал все, что приходит в голову к этому времени.

1 Ответ

0 голосов
/ 09 апреля 2019

Мне удалось выполнить это задание, и я дам общий ответ на этот вопрос.

Если вы хотите обновить текущую текущую анимацию, но вы находитесь в середине, вам нужно заменить текущую анимацию анимацией, которая завершит текущую анимацию в нужном месте.

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

Чтобы исправить это поведение, нам нужно добавить анимацию, которая завершит нашу анимацию из текущего состояния вращения до fromValue. Чтобы получить текущее вращение или другое свойство, которое нужно анимировать, у нас есть presentationLayer CALayer. Мы можем установить значения от него до нашей "закрывающей" анимации.

Как мы можем узнать, когда закончится анимация закрытия? Ответ CAAnimationDelegate . Просто установите делегата на закрывающую анимацию, и когда это будет сделано, добавьте еще одну анимацию с другими параметрами. Теперь вы можете без проблем обновить анимацию.

Имейте в виду, что время закрытия анимации должно быть частью исходного времени анимации, чтобы все было гладко. Вы можете рассчитать это так: (end state - current state) * original duration.

...