Я столкнулся с подобной проблемой. Я использовал слои вместо видов для анимации. Вы можете попробовать что-то вроде этого.
- Нарисуйте каждый элемент в виде CALayer и включите их в качестве подслоев для слоя вашего контейнера UIVIew. UIViews легче анимировать, но у вас будет меньше контроля. Обратите внимание, что для любого вида вы можете получить его слой с помощью [view layer];
- Создайте пользовательский подслой для вашего четырехугольника. Этот слой должен иметь свойство или несколько свойств, которые вы хотите анимировать для этого слоя. Давайте назовем это свойство «customprop». Поскольку это пользовательский слой, вы хотите перерисовать каждый кадр анимации. Для свойств, которые вы планируете анимировать, ваш пользовательский класс слоя должен возвращать YES needsDisplayForKey :. Таким образом вы гарантируете, что - (void) drawInContext: (CGContextRef) theContext вызывается в каждом кадре.
- Поместите все анимации (и круги, и квад) в одну транзакцию;
Для кругов вы, вероятно, можете использовать CALayers и установить контент, если это изображение, стандартным способом:
layer.contents = [UIImage imageNamed:@"circle_image.png"].CGImage;
Теперь для четверного слоя создайте подкласс CALayer и реализуйте его следующим образом:
- (void)drawInContext:(CGContextRef)theContext{
//Custom draw code here
}
+ (BOOL)needsDisplayForKey:(NSString *)key{
if ([key isEqualToString:@"customprop"])
return YES;
return [super needsDisplayForKey:key];
}
Транзакция будет выглядеть так:
[CATransaction begin];
CABasicAnimation *theAnimation=[CABasicAnimation animationWithKeyPath:@"customprop"];
theAnimation.toValue = [NSValue valueWithCGPoint:CGPointMake(1000, 1000)];
theAnimation.duration=1.0;
theAnimation.repeatCount=4;
theAnimation.autoreverses=YES;
theAnimation.timingFunction = [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseIn];
theAnimation.delegate = self;
[lay addAnimation:theAnimation forKey:@"selecting"];
[CATransaction setValue:[NSNumber numberWithFloat:10.0f]
forKey:kCATransactionAnimationDuration];
circ1.position=CGPointMake(1000, 1000);
circ2.position=CGPointMake(1000, 1000);
[CATransaction commit];
Теперь все процедуры розыгрыша будут происходить одновременно. Убедитесь, что ваш drawInContext: реализация быстрая. В противном случае анимация будет отставать.
После добавления каждого подслоя в слой UIViews не забудьте вызвать [layer setNeedsDisplay]. Он не вызывается автоматически.
Я знаю, это немного сложно. Однако полученная анимация лучше, чем использование NSTimer и перерисовка при каждом вызове.