В первый пошевелить слой от точки к точке я использую этот код:Переместить слой с 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];
}
}];
Сейчас:
Когда я комментирую код «закончил»: мой слой одушевленные нормально, перейти от точки к точке, но в конце концов его обратно первые координаты
Когда я раскомментировать код «закончил»: мой слой переход от первых координат до последнего, как он не знает места между:/
сразу означает, что набор кадров перед addAnimation? У меня проблема с заданием делегата на путь анимации, это не работает: /: [pathAnimation setDelegate: self]; - (void) moveAnimationDone: (NSString *) анимацияID завершена: (NSNumber *) законченный контекст: (void *) context { } – netmajor
Основная проблема заключается в том, почему, когда я раскомментирую ballTo.ballLayer.frame = CGRectMake (endPt.x, endPt .y, self.ballSize, self.ballSize); мой слой перемещается непосредственно в последнюю точку? Я только надеюсь, что когда я использую en animation delegate, эта проблема разрешила его самостоятельно ... – netmajor
Немедленно означает немедленно. Добавьте анимацию в слой и установите конечную позицию слоя. Вместе. – matt