Настройка iPhoneSDK CALayer.transform не работает после завершения анимации - PullRequest
0 голосов
/ 25 августа 2010

У меня есть объект CALayer.В viewDidLoad: я установил для него преобразование, используя layer.transform = CATransform3DRotate(CATransform3DIdentity, M_PI/8.0, 0, 0, 1); Это работает.

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

animation.removedOnCompletion = NO;
animation.fillMode = kCAFillModeForwards;

Все это прекрасно работает.Но проблема возникает, когда я пытаюсь изменить преобразование снова (без анимации) layer.transform = CATransform3DRotate(CATransform3DIdentity, M_PI/8.0, 0, 0, 1);.Ничего не произошло.Слой не меняет своего преобразования на то, что я указал.Если я снова запустите анимацию, анимация произойдет.Но нельзя изменить свойство transform без анимации.

Любая помощь приветствуется.

Ответы [ 2 ]

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

Прежде всего, почему вы избегаете удаления анимации после завершения?Вам не нужны эти две строки,

animation.removedOnCompletion = NO;
animation.fillMode = kCAFillModeForwards;

, так как вы фактически устанавливаете свойство transform слоя.Эти две строки - то, что вы бы использовали, если бы все, что вам нужно, было конечным визуальным состоянием после анимации, сохраняя преобразование таким же, как и в оригинале (который, честно говоря, я никогда не использовал).

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

Я не пробовал, но думаю, что вы могли бы взять первое преобразование и объединить новое.Что-то вроде:

layer.transform = CATransform3DRotate(layer.transform, M_PI/8.0, 0, 0, 1);

Обратите внимание, что я начинаю с текущего преобразования на слое (первый параметр CATransform3DRotate) вместо идентификации.Дайте это попробовать.Если это не работает, попробуйте что-то вроде:

layer.transform = CATransform3DConcat(layer.transform, 
                             CATransform3DMakeRotation(M_PI/8.0, 0, 0, 1));
0 голосов
/ 07 сентября 2010

ОК, мне удалось заставить это работать.Я установил layer.tranform сразу после вызова [layer addAnimation:].Таким образом, после завершения анимации слой останется в нужном положении как есть.Вот мой код:

CABasicAnimation *animation = [CABasicAnimation animationWithKeyPath:@"transform.rotation.z"];
animation.repeatCount = 1;
animation.duration = 3.0;
animation.fromValue = [NSNumber numberWithDouble:currentRotationAngle];
animation.toValue = [NSNumber numberWithDouble:newRotationAngle];

[layer addAnimation:animation forKey:@"rotationAnimation"];
[layer setAffineTransform:CGAffineTransformMakeRotation(newRotationAngle)];

Проблема, с которой я столкнулся при использовании layer.removedOnCompletion и layer.fillemode.Я не должен их использовать.По-новому слой отобразит слой, используя layer.transform после завершения анимации.CAAnimations обновляет слой presentationLayer (который поддерживает визуальное состояние слоя) во время анимации.Когда анимация закончится, она вернет визуальное состояние слоя к состоянию, наложенному layer.transform.

...