我正在构建一个应用程序,该应用程序将使用简单的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"];

最佳答案

您的from值设置为零,并且不会被更新。

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,因此只需将20加到您的旧y位置上,并将2.2 * 20加到您的旧x位置上。并且每次设置新位置时,都会更新旧位置。

希望这可以帮助。

关于ios - 使CABasicAnimation for iOS多次运行,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/46066324/

10-09 13:13