为多次运行的iOS制作CABasicAnimation

时间:2017-09-06 03:28:37

标签: ios xcode uiimageview cabasicanimation

我正在构建一个应用程序,它将使用简单的CABasicAnimation在屏幕上“行走”一个图像的动画。我设置它在一段时间内走一定距离,然后停止,直到用户给它更多的命令,其中它将继续步行相同的距离和持续时间。我遇到的问题是,在第一次之后,图像会停在它应该的位置,但它不会继续行走,它会跳回原来的位置并重新开始。我以为我在原点上设置正确,但我猜不是。

CABasicAnimation *hover = [CABasicAnimation animationWithKeyPath:@"position"];
    hover.fillMode = kCAFillModeForwards;
    hover.removedOnCompletion = NO;
    hover.additive = YES; // fromValue and toValue will be relative instead of absolute values
    hover.fromValue = [NSValue valueWithCGPoint:CGPointZero];
    hover.toValue = [NSValue valueWithCGPoint:CGPointMake(110.0, -50.0)]; // y increases downwards on iOS
    hover.autoreverses = FALSE; // Animate back to normal afterwards
    hover.duration = 10.0; // The duration for one part of the animation (0.2 up and 0.2 down)
    hover.repeatCount = 0; // The number of times the animation should repeat
    [theDude.layer addAnimation:hover forKey:@"myHoverAnimation"];

1 个答案:

答案 0 :(得分:1)

您的from value设置为零,并且没有更新。

hover.fromValue = [NSValue valueWithCGPoint:CGPointZero];

您每次都必须使用您的值更新此值。

在这里,我将您的代码放在一个可以更新起点和终点的函数中。

- (void)moveFromPoint:(CGPoint)fromPoint toPoint:(CGPoint)toPoint {
    CABasicAnimation *hover = [CABasicAnimation animationWithKeyPath:@"position"];
    hover.fillMode = kCAFillModeForwards;
    hover.removedOnCompletion = NO;
    hover.additive = YES; // fromValue and toValue will be relative instead of absolute values
    hover.fromValue = [NSValue valueWithCGPoint:fromPoint];
    hover.toValue = [NSValue valueWithCGPoint:toPoint]; // y increases downwards on iOS
    hover.autoreverses = FALSE; // Animate back to normal afterwards
    hover.duration = 10.0; // The duration for one part of the animation (0.2 up and 0.2 down)
    hover.repeatCount = 0; // The number of times the animation should repeat
    [theDude.layer addAnimation:hover forKey:@"myHoverAnimation"];
}

你可以通过每次使用新点调用此函数来进一步移动这个人。

[self moveFromPoint:CGPointZero toPoint:CGPointMake(110.0, -50.0)]

[self moveFromPoint:CGPointMake(110.0, -50.0) toPoint:CGPointMake(160.0, -50.0)]

修改

我看到你想要以相同的比例移动这个家伙,但每次都要以不同的长度移动。

在@interface后面添加此变量:

@property (nonatomic) CGPoint oldPointOfTheGuy;

在上一个函数之后添加这个新函数:

- (void)moveByDistance:(CGFloat)distance {
    CGPoint newPointOfTheGuy = CGPointMake(self.oldPointOfTheGuy.x + 2.2*distance, self.oldPointOfTheGuy.y + distance);
    [self moveFromPoint:self.oldPointOfTheGuy toPoint:newPointOfTheGuy];
    self.oldPointOfTheGuy = newPointOfTheGuy;
}

并为viewDidLoad中的人设置一个起点:

self.oldPointOfTheGuy = CGPointMake(110.0, -50)

现在我们已经把这个家伙的旧位置设置为我们知道他第一次产生的位置。

从现在开始,每次我们想要移动他,我们都会这样称呼:

[self moveByDistance:20];

这个功能的作用是,因为它已经知道你的x / y比率是2.2,它只是你的旧y位置加20,并且你的旧x位置增加了2.2 * 20。每次设置新位置时,旧位置都会更新。

希望这有帮助。