Как я могу перезапустить мою блочную анимацию, когда приложение выходит на передний план? - PullRequest
6 голосов
/ 06 октября 2011

У меня есть следующая блочная анимация:

[UIView animateWithDuration:0.5f delay:0.0f 
                    options:UIViewAnimationOptionRepeat|UIViewAnimationOptionAutoreverse|UIViewAnimationOptionAllowUserInteraction|UIViewAnimationOptionCurveEaseInOut
                    animations:^{
                [view.layer setTransform:CATransform3DMakeScale(1.3f, 1.3f, 1.0f)];
                NSLog(@"animating");
                    }completion:^(BOOL finished){
                        NSLog(@"Completed");
                    }];

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

- (void)applicationWillEnterForeground:(UIApplication *)application
{
    /*
     Called as part of the transition from the background to the active state; here you can undo many of the changes made on entering the background.
     */
    [[self viewController] animate];
    ......
}

, но это не сработало для восстановления анимации.

Точно так же я пробовал подходыв ответах на эти вопросы:

, но ни одно из предложенных здесь предложений не сработало для меня.Есть ли другой способ возобновить анимацию UIView на основе блоков, когда приложение вернулось из фона?

Ответы [ 2 ]

5 голосов
/ 07 октября 2011

Друг выяснил проблему, необходимую для включения анимации в представлении, когда он возвращается из фона

- (void)applicationWillEnterForeground:(UIApplication *)application
{
    /*
     Called as part of the transition from the background to the active state; here you can undo many of the changes made on entering the background.
     */
    [UIView enableAnimations:YES];
    [[self viewController] animate];
    ......
}

, затем в анимации перед блоком необходимо удалитьAllAnimations и установить layer.transform в Identity

hasStarted = YES;
    for(UIButton * button in goldenBreakOutButtons){
        for (UIView* view in button.subviews) {
            if (wasStarted) {
                [view.layer removeAllAnimations];
                view.layer.transform = CATransform3DIdentity;
            }
            if ([view isKindOfClass:[UIImageView class]]) {
                [UIView animateWithDuration:0.5f delay:0.0f 
                        options:UIViewAnimationOptionAutoreverse|UIViewAnimationOptionAllowUserInteraction|UIViewAnimationOptionCurveEaseInOut|UIViewAnimationOptionRepeat
                        animations:^ {
                            [view.layer setTransform:CATransform3DMakeScale(1.3f, 1.3f, 1.0f)];
                            NSLog(@"animating");
                        }
                        completion:^(BOOL finished){
                            if (finished) {
                                NSLog(@"Completed");
                            }

                        }];
            }
        }
    }
2 голосов
/ 19 октября 2011

Пожалуйста, попробуйте подписаться / отписаться в ViewController длястандартное ( UIApplicationWillEnterForegroundNotification ) уведомлениеот NSNotificationCenter :



    -(void) loadView
    {
    .....
    [[NSNotificationCenter defaultCenter] addObserver:self 
                                             selector:@selector(restartAnimation)    
                                                 name:UIApplicationWillEnterForegroundNotification 
                                               object:nil];      
    ....
    }

    - (void) viewDidUnload
    {
    ...
      [[NSNotificationCenter defaultCenter] removeObserver:self 
                                                      name:UIApplicationWillEnterForegroundNotification 
                                                    object:nil];
    ....
    }

    -(void) dealloc
    {
      [[NSNotificationCenter defaultCenter] removeObserver:self];
      [super dealloc];
    }

    - (void) restartAnimation
    {
        if(self.logoImageView)
        {
            [logoImageView.layer removeAllAnimations];

            CABasicAnimation *animation = [CABasicAnimation animationWithKeyPath:@"opacity"];

            animation.fromValue       = [NSNumber numberWithFloat:1.0];
            animation.toValue         = [NSNumber numberWithFloat:0.6];
            animation.duration        = 1.5f;
            animation.timingFunction  = [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionLinear];
            animation.autoreverses    = YES;
            animation.repeatCount     = HUGE_VALF;

            [[logoImageView layer] addAnimation:animation forKey:@"hidden"];
        }
    }

 
...