Явные анимации CALayer не работают должным образом

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

Прежде всего, я попробовал использовать CATransaction. Затем я перешел на CAAnimationGroup. Оба, похоже, не получают того, что я хочу.

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

Что я вижу? Вот один пример ...

При выполнении транзакции begin / commit перевод кажется правильным, но непрозрачность - нет. Моя начальная непрозрачность равна 0, а целевая непрозрачность - 0,5. Однако, когда я запускаю анимацию, она смешивается до 0,5, но затем «привязывается» к 1,0 (полностью непрозрачная).

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

Может ли кто-нибудь объяснить это и, возможно, то, что я вижу в отношении странности моей анимации?

Спасибо!


person AlvinfromDiaspar    schedule 27.08.2009    source источник
comment
Вы должны иметь возможность неявно анимировать эти свойства, задав значение альфа-канала и свойство положения слоя. Похоже, вы на правильном пути. Сложите их вместе в CATransaction begin / commit, и они будут анимироваться атомарно. Опубликуйте свой код, если он не работает должным образом.   -  person Joe Ricioppo    schedule 27.08.2009
comment
Неявные анимации работают, но id любит создавать их явно, могу ли я обработать завершенное событие, когда анимация завершится сама.   -  person AlvinfromDiaspar    schedule 28.08.2009


Ответы (2)


Хорошо, у меня не работает явная анимация. Я пробовал создать базовую анимацию для непрозрачности (слоя). Я поместил это в группу анимации. Когда я выполняю, ничего не происходит. Для простоты я вынул анимацию перевода. Это всего лишь попытка сделать анимацию непрозрачности.

CAAnimationGroup *group = [CAAnimationGroup animation];

CABasicAnimation *opacityAnimation;     
opacityAnimation = [CABasicAnimation animationWithKeyPath:@"opacity"];  
opacityAnimation.fromValue = [NSNumber numberWithDouble:fromalpha];     
opacityAnimation.toValue = [NSNumber numberWithDouble:toalpha];     
opacityAnimation.timingFunction = [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseIn];
opacityAnimation.delegate = self;
opacityAnimation.duration = 2.7;        

opacityAnimation.removedOnCompletion = NO;

group.animations = [NSArray arrayWithObjects: opacityAnimation, nil];
[baseLayer addAnimation:group forKey:@"groupAnim"];
person AlvinfromDiaspar    schedule 28.08.2009
comment
Попробуйте добавить это: opacityAnimation.fillMode = kCAFillModeForwards; Кроме того, если вы выберете свой код и щелкните виджет кода на панели инструментов, он будет правильно отформатирован. - person Joe Ricioppo; 05.09.2009

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

layer.opacity=0.0f;
person Pascalius    schedule 30.03.2012