Групповая анимация на нескольких объектах

Я пытаюсь оживить много пузырей, выходящих из машины. Я использую базовую анимацию, чтобы масштабировать пузыри от маленького к большому, и анимацию по ключевым кадрам, чтобы направить пузырек по кривой на экран. Они объединены в групповую анимацию.

Я прочитал почти все, что мог, чтобы попытаться заставить это работать, но у меня есть следующие две проблемы.

  1. Я не могу заставить анимацию масштаба работать вместе с анимацией ключевого кадра, когда пытаюсь анимировать каждый пузырь.
  2. Анимация происходит с ними всеми одновременно. Я бы хотел, чтобы они анимировались один за другим, но анимируются они все вместе.

вот код анимации у меня есть.

-(void)EmitBubbles:(UIButton*)bubblename :(CGRect)RectPassed
{
bubblename.hidden = NO;
 // Set position and size of each bubble to be at head of bubble machine and size (0,0)
CGPoint point = (RectPassed.origin);
CGRect ButtonFrame;
ButtonFrame = bubblename.bounds;
ButtonFrame.size = CGSizeMake(0, 0);
bubblename.bounds = ButtonFrame;
CGRect OldButtonBounds = bubblename.bounds;
CGRect NewButtonBounds = OldButtonBounds;
NewButtonBounds.size = RectPassed.size;

CGFloat animationDuration = 0.8f;

// Set up scaling
CABasicAnimation *resizeAnimation = [CABasicAnimation animationWithKeyPath:@"bounds.size"];
resizeAnimation.fillMode = kCAFillModeForwards;
resizeAnimation.duration = animationDuration;
resizeAnimation.fromValue = [NSValue valueWithCGSize:OldButtonBounds.size]; 
resizeAnimation.toValue = [NSValue valueWithCGSize:NewButtonBounds.size]; 

// Set Actual bubble size after animation 
bubblename.bounds = NewButtonBounds;

// Setup Path
CGPoint MidPoint = CGPointMake(500,50);
CGPoint EndPoint = CGPointMake(RectPassed.origin.x, RectPassed.origin.y); 
CAKeyframeAnimation *pathAnimation = [CAKeyframeAnimation animationWithKeyPath:@"position"];
pathAnimation.calculationMode = kCAAnimationPaced;
CGMutablePathRef curvedPath = CGPathCreateMutable();
CGPathMoveToPoint(curvedPath, nil, bubblename.bounds.origin.x, bubblename.bounds.origin.y);
CGPoint NewLoc = CGPointMake(745, 200);
CGPathMoveToPoint(curvedPath, NULL, NewLoc.x,NewLoc.y); 
CGPathAddCurveToPoint(curvedPath, NULL, 745,200,MidPoint.x,MidPoint.y, EndPoint.x, EndPoint.y);
pathAnimation.path = curvedPath;

// Set Bubble action position after animation
bubblename.layer.position = point;

// Add scale and path to animation group
CAAnimationGroup *group = [CAAnimationGroup animation];
group.removedOnCompletion = YES;
[group setAnimations:[NSArray arrayWithObjects:pathAnimation, resizeAnimation, nil]];
group.duration = animationDuration;

[bubblename.layer addAnimation:group forKey:@"nil"]; //savingAnimation


CGPathRelease(curvedPath);

}

Я вызываю анимацию для каждого пузыря, используя

[self EmitBubbles:btnbubble1 :CGRectMake(200, 500, 84, 88)];
[self EmitBubbles:btnbubble2 :CGRectMake(200, 500, 84, 88)];

У меня 20 пузырей на экране. Размер переданного прямоугольника - это окончательный размер, который я хочу, чтобы пузырьки были.

Могу ли я заставить каждый пузырь анимироваться отдельно, используя масштаб и путь ключевого кадра, без необходимости писать приведенный выше код для каждого пузыря?

Спасибо


person Matthew    schedule 10.08.2013    source источник
comment
Я решил масштабную анимацию, используя NSValue valueWithCATransform3D:CATransform3DMakeScale. и animationWithKeyPath настроены на преобразование. Я не уверен, почему это работает, а метод NSValue valueWithCGSize — нет.   -  person Matthew    schedule 18.08.2013
comment
Я до сих пор не смог решить проблему, когда все пузыри лопаются один за другим. Мне удалось заставить их появляться одновременно и перемещаться в разные позиции на экране, но я думаю, что было бы лучше, если бы они появлялись один за другим или с какой-то задержкой.   -  person Matthew    schedule 18.08.2013


Ответы (1)


В ПОРЯДКЕ. Я думаю, что у меня это получилось. После нескольких часов изучения Stackoverflow и других мест я обнаружил, что объекты должны анимироваться один за другим. Мне пришлось рассчитать время в соответствии со временем приложения. Я использовал.

group.beginTime = CACurrentMediaTime() + AnimationDelay

Чтобы остановить анимацию на мгновение, появляющуюся в ее конечной позиции, прежде чем продолжить анимацию. я должен был использовать

group.fillMode = kCAFillModeBackwards;

person Matthew    schedule 22.08.2013