У меня было много проблем с анимацией в приложении для настольных игр для iPhone.я использую следующую функцию для анимации компьютерного игрока, перемещающего счетчик:
-(void)animateCounterMoveFor:(int)playerType counterId:(int)countId {
// set up the move to an end point
CABasicAnimation *move = [CABasicAnimation animationWithKeyPath:@"position"];
[move setDuration:3.5];
[move setToValue:[NSValue valueWithCGPoint:CGPointMake((xPos), (yPos))]];
[move setFillMode:kCAFillModeForwards];
[move setRemovedOnCompletion:NO];
CAMediaTimingFunction *tf = [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseInEaseOut];
[move setTimingFunction:tf];
// enable the animation stop to set layer to right position
[move setValue:[NSNumber numberWithInt:countId] forKey:@"counterId"];
[move setValue:[NSNumber numberWithInt:playerType] forKey:@"playerType"];
[move setDelegate:self];
// add move to the layer
[layer addAnimation:move forKey:@"moveAnimation"];
}
.. и затем делегат устанавливает позицию слоя и удаляет анимацию, когда она закончена (в противном случае счетчик перемещается обратно в свою начальную позицию).
-(void)animationDidStop:(CABasicAnimation *)anim finished:(BOOL)flag {
NSNumber *counterId = [anim valueForKey:@"counterImageId"];
NSNumber *playerId = [anim valueForKey:@"playerType"];
int countId = [counterId intValue];
int playId = [playerId intValue];
// code here gets position information using counter and player id
// set the final position of the layer when the anim stops, then remove the anim
[layer setPosition:CGPointMake(xPos, yPos)];
[layer removeAnimationForKey:@"moveAnimation"];
}
Все это прекрасно работает, когда один счетчик движется, но когда один счетчик берет другой, я использую один и тот же метод для перемещения обоих.Я подумал, что копия анимации была передана на слой, и я мог вызвать его, чтобы переместить первый контрольный слой, а затем снова вызвать его, чтобы он переместил второй.Я выхожу из объекта и создаю две разные анимации движения, но только второй счетчик движется.animationDidStop: вызывается дважды, и каждый раз передается правильная информация о счетчике.
Есть идеи о том, как заставить это работать?Я пролистал довольно много вопросов о CAAnimation / CALayer, так что, думаю, проблема не только в этом;)