2013-05-03 1 views
1

У меня есть код:Переместить в несколько точки с CAKeyframeAnimation

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; 
} 
+0

Исправьте форматирование кода в вашем вопросе, и добавить код, который добавляет линии или кривые пути. –

+0

Какой из методов я должен использовать для моей анимации, переходя от нескольких точек, один к другому? Я начинаю в анимации:/ – netmajor

ответ

2

В CAKeyframeAnimation документации говорится:

Указание path отменяет 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"]; 
+0

Спасибо за совет, но это не решит мою проблему. – netmajor

+0

@netmajor: я попробовал ваш код и после удаления 'pathAnimation.path = path' он анимировал объект через все позиции в' pathArray'. –

+0

Я добавляю код для добавления объекта в массив, может быть, проблема? – netmajor

4

Моя проблема решена. Я добавляю:

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

Теперь мой слой не обратно в первое положение;)

+0

Эй, я просто должен сказать, что я всегда искал этот ответ. Спасибо вам большое за размещение этого. –

Смежные вопросы