приостановка и возобновление основной анимации, когда приложение входит и выходит из фона

У меня есть простая 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. Когда приложение переходит в фоновый режим, а затем снова появляется, анимация больше не работает. После поиска в Google я нашел это от Apple. Хорошо, я реализовал подобные рекомендации Apple в том же файле viewcontroller.m, в котором есть метод perform360rotation для поворота вида.

-(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];

}

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


person Himanshu Singh    schedule 31.01.2012    source источник


Ответы (1)


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

person overboming    schedule 23.02.2012
comment
@overborming Знаете ли вы, почему основная анимация удаляется также, когда соответствующее представление исчезает из-за смены вкладки - person Ilker Baltaci; 06.12.2012
comment
@Ilker Baltaci Скорее всего, из-за оптимизации производительности. Прекратите анимировать что-либо, если этого точно нет на экране. - person overboming; 17.12.2012