В настоящее время я реализую CABasicAnimation
, который анимирует свойство CALayer
transform
.
Теперь, хотя я новичок в Core Animation, мне удалось собрать через различные блоги и статьи, такие как objc.io, что очень плохая идея использовать часто (неправильно) рекомендованный метод для того, чтобы анимации могли использоваться, используя fillMode
и removedOnCompletion
свойства анимации. Этот метод считается плохой практикой для многих, поскольку он создает несоответствие между слоем модели и уровнем представления, поэтому будущие запросы к одному из этих слоев могут не совпадать с тем, что видит пользователь.
Вместо этого рекомендуемым способом создания анимации является обновление слоя модели одновременно с добавлением анимации к анимированному слою. Однако мне трудно понять, как это работает. Моя анимация проста и выглядит следующим образом:
CATransform3D updatedTransform = [self newTransformWithCurrentTransform];
// Location 1
CABasicAnimation *transformAnimation = [CABasicAnimation animationWithKeyPath:@"transform"];
transformAnimation.duration = 1;
transformAnimation.fromValue = [NSValue valueWithCATransform3D:self.layerBeingAnimated.transform]; // Does not work without this.
transformAnimation.toValue = [NSValue valueWithCATransform3D:updatedTransform];
// Location 2
[self.layerBeingAnimated addAnimation:transformAnimation forKey:kTransformAnimationKey];
// Location 3
Я обозначил три местоположения, где я попытался обновить уровень модели, используя код
self.layerBeingAnimated.transform = updatedTransform;
В местоположении 1 слой скачет прямо к newTransform
и не оживляет.
В местоположении 2 слой анимируется точно так, как я хочу, чтобы он от текущего преобразования до newTransform
.
В местоположении 3 слой переходит вправо до newTransform
, возвращается к старому преобразованию, анимируется правильно из fromValue в newTransform и затем остается на newTransform
.
Какая сделка здесь? Какое правильное место для обновления слоя модели и почему эти три местоположения производят такие разные результаты?
Спасибо!