CABasicAnimation не меняет своего свойства позиции после завершения анимации - PullRequest
6 голосов
/ 01 апреля 2010

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

Ответы [ 5 ]

15 голосов
/ 23 марта 2011

Есть несколько способов решить эту проблему. Мое любимое - установить объект в конце анимации и использовать fromValue вместо toValue для создания анимации. Вы также можете установить и fromValue, и toValue, чтобы создать этот эффект. т.е.

CABasicAnimation *animation = [CABasicAnimation animationWithKeyPath:@"position"];
animation.duration = 1.0;
animation.fromValue = [NSValue valueWithCGPoint:startPoint];
animation.timingFunction = [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseIn];

viewToAnimate.center = endPoint;
[viewToAnimate.layer addAnimation:animation forKey:@"slide"];

Другой способ сделать это - установить себя в качестве делегата и реализовать:

-(void)animationDidStop:(id)sender finished:(BOOL)finished {
     viewToAnimate.center = endPoint;
}
8 голосов
/ 27 марта 2011

Вам необходимо установить конечную позицию. Если вы используете только анимацию fromValue и toValue, она вернется к исходной начальной точке. Анимация использует копию вида / слоя, когда он «проигрывает», а затем анимация покажет исходный вид / слой после его завершения.

Если вы не установите его явно, он, похоже, вернется назад, даже если вид / слой никогда не перемещались.

startPoint и endPoint - это CGPoints, а myView - это анимированный UIView.

    CABasicAnimation *animation = [CABasicAnimation animationWithKeyPath:@"position"];
    animation.duration = .3;
    animation.fromValue = [NSValue valueWithCGPoint:startPoint];
    animation.toValue = [NSValue valueWithCGPoint:endPoint];
    animation.timingFunction = [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseOut];
    [myView.layer addAnimation:animation forKey:@"position"];   
    myView.layer.position = endPoint;   // Must set end position, otherwise it jumps back
3 голосов
/ 09 мая 2013

Чтобы установить объект в конце анимации, просто напишите код, подобный этому

#import <QuartzCore/QuartzCore.h>

CABasicAnimation *animation = [CABasicAnimation animationWithKeyPath:@"position"];
animation.duration = 1.0;
animation.fromValue = [NSValue valueWithCGPoint:startPoint];
animation.timingFunction = [CAMediaTimingFunction functionWithName:easing];
animation.fillMode = kCAFillModeForwards;  // This line will stop the animation at the end position of animation
animation.autoreverses = NO;

viewToAnimate.center = endPoint;
[viewToAnimate.layer addAnimation:animation forKey:@"slide"];
1 голос
/ 27 октября 2016

Вы можете просто установить removeOnCompletion в NO, если хотите сохранить окончательное значение. И не забудьте установить fillMode.

animation.fillMode = kCAFillModeForwards;  //The receiver remains visible in its final state when the animation is completed.
animation.removedOnCompletion = NO;
0 голосов
/ 12 марта 2013

Если вы посмотрите документы для addAnimation: forKey:, там будет написано: «Обычно это вызывается неявно». Другими словами, вы не должны называть это напрямую. Вместо этого вы должны сделать следующее, что даже проще, чем устанавливать значения из и в значения: вы просто устанавливаете значения непосредственно на слое:

CABasicAnimation *animation = [CABasicAnimation animationWithKeyPath:@"opacity"];
animation.duration = .3;

myLayer.actions = @{@"opacity": animation};
myLayer.opacity = 0;

Это приведет к исчезновению слоя до нулевой непрозрачности.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...