我使用iOS核心动画“CABasicAnimation”动画UIImageView,对我来说都很好,但唯一的问题是当我动画到位置时,在完成动画后它会回到原来的位置。我怎么能克服这个?我需要将UIImageView保持在移动位置。
注意:我已经看到几个关于此的成功答案的问题,但我不知道为什么我的工作不像他们说的那样。
After rotating a CALayer using CABasicAnimation the layer jumps back to it's unrotated position
这是我的示例代码,
CGPoint endPt = CGPointMake(160, 53);
CABasicAnimation *anim5 = [CABasicAnimation animationWithKeyPath:@"position"];
[anim5 setBeginTime:CACurrentMediaTime()+0.4];
anim5.timingFunction = [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseOut];
anim5.fromValue = [NSValue valueWithCGPoint:imgRef.layer.position];
anim5.toValue = [NSValue valueWithCGPoint:endPt];
anim5.duration = 1.5;
anim5.speed = 2;
[imgRef.layer addAnimation:anim5 forKey:@"position"];
//this is what other answers ask to do
[anim5 setFillMode:kCAFillModeForwards];
[anim5 setRemovedOnCompletion:NO];
BTW [imgRef.layer setPosition:CGPointMake(160, 53)];
对我没有帮助,因为我用4毫秒推迟动画。
答案 0 :(得分:3)
根本原因是动画只是在两个值之间转换属性,它实际上不会更改结束值。您需要在动画完成时更改结束值,有三种方法可以做到这一点。 1)使用CAAnimation超类上的delegate属性通知动画何时完成。此时,您可以将属性设置为它的结束值。请参阅:https://developer.apple.com/library/mac/#documentation/GraphicsImaging/Reference/CAAnimation_class/Introduction/Introduction.html#//apple_ref/occ/cl/CAAnimation animationDidStop:finished:是您需要在委托上实现的方法。 2)在周围的CATransaction上设置完成块。您需要手动启动CATransaction,而不是让CABasicAnimation自动为您执行此操作。请参阅:Objective-C - CABasicAnimation applying changes after animation? 3)见下面的OMZ评论......
答案 1 :(得分:1)
正确的答案是设置图层的位置属性,但正如您所指出的那样,这使得它变得更加困难,因为您需要在位置更改之前延迟0.4秒。有什么理由你不能先执行延迟然后再做动画吗?像这样:
- (IBAction)didTapMove:(id)sender
{
[self performSelector:@selector(animate) withObject:nil afterDelay:0.4];
}
- (void)animate
{
CGPoint endPt = CGPointMake(160, 53);
CABasicAnimation *anim5 = [CABasicAnimation animationWithKeyPath:@"position"];
anim5.timingFunction = [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseOut];
anim5.fromValue = [NSValue valueWithCGPoint:_imageView.layer.position];
anim5.toValue = [NSValue valueWithCGPoint:endPt];
anim5.duration = 1.5;
anim5.speed = 2;
[_imageView.layer addAnimation:anim5 forKey:@"position"];
[_imageView.layer setPosition:CGPointMake(160, 53)];
}
注意到我已经从动画中删除了你的开始时间,因为在执行选择器调用中发生了延迟。