UIView removeFromSuperView задержка анимации - PullRequest
4 голосов
/ 16 апреля 2010

У меня есть метод, который анимирует одно из подпредставлений UIWindow, а затем удаляет его из UIWindow, используя removeFromSuperview. Но когда я ставлю removeFromSuperview после блока анимации, анимация не отображается, потому что removeFromSuperview удаляет UIView из UIWindow до воспроизведения анимации :-( Как я могу задержать removeFromSuperview, чтобы анимация воспроизводилась первой, и затем подпредставление удалено? Я пробовал [NSThread sleepForTimeInterval:1]; после анимации, но это не дало желаемого эффекта, потому что анимация тоже спит по какой-то причине.

Мой код для этого метода:

  - (void) animateAndRemove
    {
     NSObject *mainWindow = [[UIApplication sharedApplication] keyWindow];

     [UIView beginAnimations:nil context:nil];
        [UIView setAnimationDuration:0.8]; 
     UIView *theView = nil;
     for (UIView *currentView in [mainWindow subviews])
     {
      if (currentView.tag == 666)
      {
       currentView.backgroundColor = [UIColor colorWithRed:0.8 green:0.8 blue:0.8 alpha:0.0];
       theView = currentView;
       }
     }
     [UIView setAnimationTransition:  UIViewAnimationTransitionNone forView:theView cache:YES];
      [UIView commitAnimations]; 



 //[NSThread sleepForTimeInterval:1];

 [theView removeFromSuperview];


    }

Ответы [ 2 ]

16 голосов
/ 16 апреля 2010

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

[UIView beginAnimations:nil context:nil];
[UIView setAnimationDelegate:theView];
[UIView setAnimationDidStopSelector:@selector(removeFromSuperview)];
 ....

Это гарантирует, что [theView removeFromSuperview] будет вызвано после завершения анимации.

7 голосов
/ 28 апреля 2011

Если вы ориентируетесь на iOS 4.0 и выше, вы можете использовать блоки анимации:

[UIView animateWithDuration:0.2
     animations:^{view.alpha = 0.0;}
     completion:^(BOOL finished){ [view removeFromSuperview]; }];

(приведенный выше код взят из документации Apple по UIView)

...