0

我正在使用 iOS 核心动画“CABasicAnimation”为 UIImageView 设置动画,对我来说一切正常,但唯一的问题是当我动画到该位置时,在完成动画后它会回到原来的位置。我该如何克服呢?我需要将 UIImageView 保持在移动位置。

注意:我见过很少有关于这个问题的成功答案,但我不知道为什么我的不像他们说的那样工作。

使用 CABasicAnimation 旋转 CALayer 后,图层跳回未旋转的位置

这是我的示例代码,

    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];

顺便说一句[imgRef.layer setPosition:CGPointMake(160, 53)];,因为我将动画延迟了 4 毫秒,所以对我没有帮助。

4

2 回答 2

3

根本原因是动画只是在两个值之间转换属性,它实际上并没有改变结束值。您需要在动画完成时更改结束值,有三种方法可以做到这一点。1) 使用 CAAnimation 超类的委托属性来通知动画何时完成。此时,您可以将属性设置为其最终值。请参阅:https ://developer.apple.com/library/mac/#documentation/GraphicsImaging/Reference/CAAnimation_class/Introduction/Introduction.html#//apple_ref/occ/cl/CAAnimationanimationDidStop:finished: 是您需要在委托上实现的方法。2) 在周围的 CATransaction 上设置一个完成块。您需要手动启动 CATransaction 而不是让 CABasicAnimation 自动为您执行此操作。请参阅:Objective-C - CABasicAnimation 在动画后应用更改? 3)见下面OMZ的评论......

于 2013-04-01T12:56:23.253 回答
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)];
}

注意到我已经从动画中删除了你的开始时间,因为延迟发生在执行选择器调用中。

于 2013-04-01T16:35:08.583 回答