У меня есть простая CABasicAnimation, подключенная как бесконечная анимация (у меня есть колесо, которое я продолжаю вращать вечно). Вот метод, где я устанавливаю эту явную анимацию:
-(void)perform360rotation:(UIImageView*) imageView {
CABasicAnimation* anim = [CABasicAnimation animationWithKeyPath:@"transform.rotation"];
// to rotate around a specific axis, specify it in the KeyPath parameter like below
//CABasicAnimation* anim = [CABasicAnimation animationWithKeyPath:@"transform.rotation.x"];
[anim setDuration:self.speed]; // Animation duration
[anim setAutoreverses:NO];
[anim setRepeatCount:HUGE_VALF]; // Perfrom animation large number of times
[anim setFromValue:[NSNumber numberWithDouble:0.0f]];
[anim setToValue:[NSNumber numberWithDouble:(M_PI * 2.0f)]];
[[imageView layer] addAnimation:anim forKey:@"wheeloRotation"];
}
Я вызываю этот метод анимации из моего метода viewWillAppear. Когда приложение входит в фоновый режим, а затем снова появляется, анимация больше не работает.
По поиску, я придумал это от Apple. Все отлично, я реализовал рекомендации Apple, подобные этой, в том же файле viewcontroller.m, в котором есть метод execute360rotation для поворота представления.
-(void)pauseLayer:(CALayer*)layer
{
CFTimeInterval pausedTime = [layer convertTime:CACurrentMediaTime() fromLayer:[self.wheelView layer]];
layer.speed = 0.0;
layer.timeOffset = pausedTime;
NSLog(@"pauseLayer:paused time = %f",pausedTime);
}
-(void)resumeLayer:(CALayer*)layer
{
CFTimeInterval pausedTime = [layer timeOffset];
NSLog(@"resumeLayer:paused time = %f",pausedTime);
layer.speed = 1.0;
layer.timeOffset = 0.0;
layer.beginTime = 0.0;
CFTimeInterval timeSincePause = [layer convertTime:CACurrentMediaTime() fromLayer:[self.wheelView layer]] - pausedTime;
layer.beginTime = timeSincePause;
}
Опять же, по поиску в Google, я увидел, что общее согласие состояло в том, что я вызываю методы паузы и возобновления из AppDelegate. Поэтому я сделал это следующим образом (lVC - это класс viewcontroller.m, о котором я упоминал в начале этого вопроса. Методы pauseLayer и resumeLayer вызываются из его методов viewWillAppear и viewWillDisappear):
- (void)applicationDidEnterBackground:(UIApplication *)application
{
[lVC viewWillDisappear:YES];
}
- (void)applicationWillEnterForeground:(UIApplication *)application
{
[lVC viewWillAppear:YES];
}
Кости еще нет. Анимация по-прежнему не возобновляется, когда приложение возвращается на передний план. Есть ли что-то, что я делаю не так?