1

我有代码:

NSMutableArray * pathArray = [[NSMutableArray alloc]init];
CGPoint currentPoint = CGPointMake(xp, yp);
[pathArray addObject:[NSValue valueWithCGPoint: currentPoint]];

NSMutableArray * pathArray = [algorithm CreatePath];
CGMutablePathRef path = CGPathCreateMutable();

CAKeyframeAnimation *pathAnimation = [CAKeyframeAnimation animationWithKeyPath:@"position"];
pathAnimation.values = pathArray;
pathAnimation.path = path;
pathAnimation.duration = 1.0;
[self.firstBall.ballLayer addAnimation:pathAnimation forKey:@"position"];

在路径数组中,我有几个 CGPoints 包裹在 NSValue 中。但是当动画开始时,它唯一的移动是从第一个坐标到最后一个坐标?为什么它不使用其他点?

新代码:

-(void)MoveBallWithAlgorithm:(CGPoint)start end:(CGPoint)end;
{
    FindWayAlgorithm *algorithm = [[FindWayAlgorithm alloc]init];
    algorithm.LX = algorithm.LY = self.columns;

    [algorithm CreateBoard:self.fieldsArray];
    [algorithm FindWay:start end:end];
    CGMutablePathRef path = CGPathCreateMutable();
    NSMutableArray * pathArray = [algorithm CreatePath];

       @try
    {
        CGPathMoveToPoint(path, NULL, self.firstBall.ballCoordinates.x, self.firstBall.ballCoordinates.y);
        for (NSValue * pointValue in pathArray) {
            CGPoint point = [pointValue CGPointValue];
            Field* field = [self FindFieldWithPoint:point];
            CGPathAddLineToPoint(path, NULL, field.ballCoordinates.x, field.ballCoordinates.y);
        }
    }
    @catch(NSException* ex)
    {
        NSLog(@"Bug captured when move ball with algorithm: %@ %@",ex, [NSThread callStackSymbols]);
    }
    CAKeyframeAnimation *pathAnimation = [CAKeyframeAnimation animationWithKeyPath:@"position"];
    pathAnimation.duration = 2.0;
    pathAnimation.path = path;
    [pathAnimation setDelegate:self];
    [self.firstBall.ballLayer addAnimation:pathAnimation forKey:@"position"];
}

- (void)animationDidStop:(CAAnimation *)theAnimation finished:(BOOL)flag{

    NSInteger firstBallIndex = [self.fieldsArray indexOfObject:self.firstBall];
    NSInteger secondBallIndex = [self.fieldsArray indexOfObject:self.secondBall];
    self.ballFrom = [self.fieldsArray objectAtIndex:firstBallIndex];
    self.ballTo = [self.fieldsArray objectAtIndex:secondBallIndex];
    self.ballTo.ballLayer = self.ballFrom.ballLayer;
    CGPoint endPt = CGPointMake(self.secondBall.ballCoordinates.x,self.secondBall.ballCoordinates.y);

    self.ballTo.ballLayer.frame = CGRectMake(endPt.x, endPt.y, self.ballSize, self.ballSize);
    self.ballFrom.ballLayer = nil;
    [self.fieldsArray replaceObjectAtIndex:firstBallIndex withObject:self.ballFrom];
    [self.fieldsArray replaceObjectAtIndex:secondBallIndex withObject:self.ballTo];
    self.firstBall = nil;
    self.secondBall = nil;
}
4

2 回答 2

4

我的问题解决了。我加:

pathAnimation.fillMode = kCAFillModeForwards;
pathAnimation.removedOnCompletion = NO;

现在我的图层没有回到第一个位置;)

于 2013-05-05T19:05:05.143 回答
2

CAKeyframeAnimation文档指出:

指定 apath会覆盖该values属性。

pathAnimation.path因此,如果要使用 . 设置关键帧值,则 不应设置pathAnimation.values = pathArray

我用一个简单的标签和以下代码对其进行了测试:

NSArray * pathArray = @[
    [NSValue valueWithCGPoint:CGPointMake(10., 10.)],
    [NSValue valueWithCGPoint:CGPointMake(100., 10.)],
    [NSValue valueWithCGPoint:CGPointMake(10., 100.)],
    [NSValue valueWithCGPoint:CGPointMake(10., 10.)],
];

CAKeyframeAnimation *pathAnimation = [CAKeyframeAnimation animationWithKeyPath:@"position"];
pathAnimation.values = pathArray;
pathAnimation.duration = 5.0;
[self.label.layer addAnimation:pathAnimation forKey:@"position"];
于 2013-05-03T21:49:00.157 回答