2013-05-04 3 views
1

В первый пошевелить слой от точки к точке я использую этот код:Переместить слой с CAKeyframeAnimation - слой обратно в первое положение

 CABasicAnimation *anim = [CABasicAnimation animationWithKeyPath:@"position"]; 
     anim.timingFunction = [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionLinear]; 
     anim.fromValue = [NSValue valueWithCGPoint:startPt]; 
     anim.toValue = [NSValue valueWithCGPoint:endPt]; 
     anim.repeatCount = 0; 
     anim.duration = 1.0; 
     [self.firstBall.ballLayer addAnimation:anim forKey:@"position"]; 

И это после того, как анимация прозрачного первого слоя и перерисовать его в другом месте.

NSInteger firstBallIndex = [self.fieldsArray indexOfObject:self.firstBall]; 
      NSInteger secondBallIndex = [self.fieldsArray indexOfObject:self.secondBall]; 
      Field* ballFrom = [self.fieldsArray objectAtIndex:firstBallIndex]; 
      Field* ballTo = [self.fieldsArray objectAtIndex:secondBallIndex]; 
      ballTo.ballLayer = ballFrom.ballLayer; 
      CGPoint startPt = CGPointMake(self.firstBall.ballCoordinates.x,self.firstBall.ballCoordinates.y); 
    CGPoint endPt = CGPointMake(self.secondBall.ballCoordinates.x,self.secondBall.ballCoordinates.y); 
    ballTo.ballLayer.frame = CGRectMake(endPt.x, endPt.y, self.ballSize, self.ballSize); 
      ballFrom.ballLayer = nil; 
      [self.fieldsArray replaceObjectAtIndex:firstBallIndex withObject:ballFrom]; 
      [self.fieldsArray replaceObjectAtIndex:secondBallIndex withObject:ballTo]; 

Но затем я пытаюсь анимировать слой, чтобы перемещать несколько раз. Поэтому я использую этот код:

CGMutablePathRef path = CGPathCreateMutable(); 
    NSMutableArray * pathArray = [algorithm CreatePath]; 
    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); 
     } 
CAKeyframeAnimation *pathAnimation = [CAKeyframeAnimation animationWithKeyPath:@"position"]; 
pathAnimation.duration = 2.0; 
pathAnimation.path = path; 
[UIView animateWithDuration:5 
         delay:5 
        options:UIViewAnimationOptionAllowUserInteraction 
       animations:^{ 
        [self.firstBall.ballLayer addAnimation:pathAnimation forKey:@"position"]; 
       } 
       completion:^ (BOOL finished) 
{ 
    if (finished) { 


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

Сейчас:

  1. Когда я комментирую код «закончил»: мой слой одушевленные нормально, перейти от точки к точке, но в конце концов его обратно первые координаты

  2. Когда я раскомментировать код «закончил»: мой слой переход от первых координат до последнего, как он не знает места между:/

ответ

3

Это неправильно:

[UIView animateWithDuration:5 // and so on 

Не пытайтесь совместить слой анимации с видом анимации таким образом. Просто добавьте анимацию в слой и отступите. :)

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

и установить окончательную позицию немедленно предотвратить прыжок защитник позже:

ballTo.ballLayer.frame = 
    CGRectMake(endPt.x, endPt.y, self.ballSize, self.ballSize); 

Если вам все еще нужно, чтобы услышать о том, когда анимация заканчивается, а затем установить делегата на ваш pathAnimation.

+0

сразу означает, что набор кадров перед addAnimation? У меня проблема с заданием делегата на путь анимации, это не работает: /: [pathAnimation setDelegate: self]; - (void) moveAnimationDone: (NSString *) анимацияID завершена: (NSNumber *) законченный контекст: (void *) context { } – netmajor

+0

Основная проблема заключается в том, почему, когда я раскомментирую ballTo.ballLayer.frame = CGRectMake (endPt.x, endPt .y, self.ballSize, self.ballSize); мой слой перемещается непосредственно в последнюю точку? Я только надеюсь, что когда я использую en animation delegate, эта проблема разрешила его самостоятельно ... – netmajor

+0

Немедленно означает немедленно. Добавьте анимацию в слой и установите конечную позицию слоя. Вместе. – matt

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