2013-09-05 9 views
10

Oto mój config:UIView animacja zatrzymuje się, gdy widok znika, nie wznowić, gdy pojawi się ponownie

Mam storyboard z ListViewController. ListViewController ma widok podrzędny UIView o nazwie EmptyListView. EmptyListView jest wyświetlany tylko wtedy, gdy nie ma żadnych elementów w UITableView, w przeciwnym razie jest ukryty.

EmptyListView ma subview UIImageView o nazwie emptyListViewArrow, który wizualnie wskazuje na przycisk, aby utworzyć nowy wpis w moim UITableView. Ta strzałka jest animowana w nieskończoność w górę w dół w stylu &.

Słucham EmptyListView, aby wysłać powiadomienie po zakończeniu układania jego subviews. Robię to, ponieważ jeśli nie, animacje, które mutują wiązania, zachowują się niepoprawnie.

- (void) layoutSubviews { 
    [super layoutSubviews]; 

    [[NSNotificationCenter defaultCenter] postNotificationName:@"EmptyViewDidLayoutSubviews" object:nil]; 
} 

Kiedy ListViewController zauważa to powiadomienie, zaczyna animację:

[UIView animateWithDuration:0.8f delay:0.0f options:(UIViewAnimationOptionRepeat | UIViewAnimationOptionAutoreverse) animations:^{ 
    self.emptyListViewArrowVerticalSpace.constant = 15.0f; 
    [emptyListView layoutIfNeeded]; 
} completion:nil]; 

Jeśli mogę umieścić aplikację w tle lub wcisnąć kolejny ViewController na stosie, gdy wrócę do aplikacji albo ListViewController, animacja jest zatrzymana/wstrzymana. Nie mogę zacząć od nowa.

Próbowałem:

  1. Listening do stosowania zrezygnuje/stają się aktywne. Podczas rezygnacji zrobiłem [self.view.layer removeAllAnimations], a następnie spróbowałem ponownie uruchomić animację, korzystając z powyższego kodu.
  2. Usunięcie animacji UIImageView i dodanie jej z powrotem do widoku macierzystego, a następnie próba uruchomienia animacji.

Żałuję, że tutaj nie ma ograniczeń, ale bardzo chciałbym dowiedzieć się, jaki może być problem.

Dziękujemy!

+0

Czy używasz swoich metod w 'viewDidLoad' lub' viewWillAppear'? – iOS

+0

viewDidAppear, ale nie z żadnego konkretnego powodu. – chrysb

Odpowiedz

9

Nie jestem pewien, co robisz z tym powiadomieniem. Zrobiłem wiele animacji z ograniczeniami i nigdy nie musiałem tego robić. Myślę, że problem polega na tym, że po opuszczeniu widoku stała wartość ograniczenia będzie wynosić 15 (zweryfikowałem to w dziennikach w viewWillDisappear), więc animacja, aby ustawić ją na 15, nie będzie działała. W aplikacji testu ustawić stałe z powrotem do wartości wyjściowej (wartość 0), w viewWillAppear i pracował prawidłowo:

-(void)viewWillAppear:(BOOL)animated { 
    [super viewWillAppear:animated]; 
    self.bottomCon.constant = 0; 
    [self.view layoutIfNeeded]; 
} 


-(void)viewDidAppear:(BOOL)animated { 
    [super viewDidAppear:animated]; 
    [UIView animateWithDuration:1 delay:0.0f options:UIViewAnimationOptionRepeat | UIViewAnimationOptionAutoreverse animations:^{ 
     self.bottomCon.constant = -40.0f; 
     [self.view layoutIfNeeded]; 
    } completion:nil]; 
} 
+0

Tak! To się udało. Dziękuję bardzo za twój wgląd. – chrysb

5

To wadą. Aby temu zaradzić, musisz ponownie wywołać metodę animacji.

Można to zrobić w następujący sposób:

Dodaj obserwatora w kontrolerze

[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(resumeAnimation:) name:UIApplicationDidBecomeActiveNotification object:nil]; 

ta będzie się powoływać po wznowieniu aplikacji.

Dodaj tę metodę:

- (void)resumeAnimation:(NSNotification *)iRecognizer { 
    // Restart Animation 
} 

nadzieję, że to pomoże.

Powiązane problemy