приостановка и возобновление основной анимации, когда приложение входит и выходит из фона - PullRequest
4 голосов
/ 01 февраля 2012

У меня есть простая 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];

}

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

1 Ответ

1 голос
/ 23 февраля 2012

Вызов viewWillAppear может вызвать другие побочные эффекты и, как правило, не подходит для запуска анимации, попробуйте прослушать UIApplicationWillEnterForegroundNotification и добавить свой resumeLayer: в обработчик.

...