2013-09-05 7 views
10

Ecco la mia configurazione:UIView animazione si ferma quando vista scompare, non riprende quando appare di

ho uno storyboard con un ListViewController. ListViewController ha una sottoview UIView chiamata EmptyListView. EmptyListView viene mostrato solo quando non ci sono elementi in UITableView, altrimenti è nascosto.

EmptyListView ha una vista secondaria UIImageView chiamata emptyListViewArrow che punta visivamente verso il pulsante per creare una nuova voce nel mio UITableView. Questa freccia è animata all'infinito in uno stile up &.

Ascolto per EmptyListView per inviare una notifica quando ha terminato la visualizzazione delle sottoview. Lo faccio perché altrimenti le animazioni che mutano i vincoli si comportano in modo errato.

- (void) layoutSubviews { 
    [super layoutSubviews]; 

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

Quando ListViewController osserva questa notifica, inizia l'animazione:

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

Se metto l'applicazione in background o spingere un altro ViewController in pila, una volta che torno al app o il ListViewController, l'animazione viene arrestata/sospesa. Non riesco a farlo ripartire.

ho provato:

  1. Ascolto per l'applicazione darà le dimissioni/diventano attive. Quando mi sono dimesso, ho fatto [self.view.layer removeAllAnimations] e poi ho provato ad avviare nuovamente l'animazione usando il codice sopra.
  2. Rimozione di UIImageView in corso di animazione e aggiunta alla vista padre, quindi tentativo di avviare l'animazione.

Sono rammaricato di utilizzare i vincoli qui, ma mi piacerebbe avere qualche idea su quale potrebbe essere il problema.

Grazie!

+0

Stai utilizzando i tuoi metodi in 'viewDidLoad' o' viewWillAppear'? – iOS

+0

viewDidAppear, ma non per alcun motivo particolare. – chrysb

risposta

9

Non sono sicuro di quello che stai facendo con quella notifica. Ho fatto molte animazioni con vincoli e non ho mai dovuto farlo. Penso che il problema è che quando lasci la vista, il valore costante del vincolo sarà 15 (ho verificato che con logs in viewWillDisappear), quindi l'animazione per impostarlo su 15 non farà nulla. In un'applicazione di test, ho impostato la costante al suo valore iniziale (0) in viewWillAppear, e ha funzionato bene:

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

Sì! Ha funzionato. Grazie mille per la tua comprensione. – chrysb

5

Questa è la inconveniente. Per superare questo devi chiamare di nuovo il metodo di animazione.

Si può fare come segue:

Aggiungi Observer nel controller

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

Questa andranno invocato una volta che si riprende l'applicazione.

Aggiungi questo metodo:

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

Spero che questo vi aiuterà.