2012-08-01 3 views
5

Sto utilizzando animateWithDuration:animations:completion: per spostare diversi elementi dell'interfaccia utente (circa 4 elementi) prima che venga chiamato removeFromSuperview:.Come sapere se diversi blocchi hanno completato l'esecuzione prima di agire?

La mia domanda è, come posso sapere che tutte quelle animazioni sono state completate prima di chiamare removeFromSuperview:?

+0

Non è possibile animarli tutti contemporaneamente nella sezione animazioni anziché creare più blocchi? –

+0

Non se le animazioni hanno durate e stili diversi – Goles

+0

possibile duplicato di [come richiamare un singolo blocco di completamento per un gruppo annidato di chiamate animateWithDuration UIView?] (Http://stackoverflow.com/questions/8421441/how-to-invoke -a-single-completion-block-for-a-nested-group-of-uiview-animatewith) –

risposta

9

Ok, per rispondere alla mia stessa domanda.

ho finito per fare qualcosa di simile:

// Create dispatch queue & group 
    dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0); 
    dispatch_group_t group = dispatch_group_create(); 

    // Two group enters 
    dispatch_group_enter(group); 
    dispatch_group_enter(group); 

    // (notice the group parameter in dispatch_group_leave) 
    [UIView animateWithDuration:0.3 animations:^{ 
     self.pickerView.frame = CGRectMake(self.pickerView.frame.origin.x 
              , self.view.bounds.size.height + self.pickerView.frame.size.height/2 
              , self.pickerView.frame.size.width 
              , self.pickerView.frame.size.height); 
    } completion:^(BOOL finished){ 
     dispatch_group_leave(group); 
    }]; 


    [UIView animateWithDuration:0.3 animations:^{ 
     self.navigationBar.frame = CGRectMake(self.navigationBar.frame.origin.x 
               , -self.navigationBar.frame.size.height 
               , self.navigationBar.frame.size.width 
               , self.navigationBar.frame.size.height); 
    } completion:^(BOOL finished){ 
     dispatch_group_leave(group); 
    }]; 

    // Finishing callback 
    dispatch_group_notify(group, queue, ^{ 
     [self.view removeFromSuperview]; 
    }); 

    // Release the group 
    dispatch_release(group); 

Spero che questo possa servire da esempio per qualcun altro.

+2

Aggiungendo questo come una risposta regolare. –

0

Creare una coda di invio, sospenderla per il numero di animazioni che si stanno facendo. Aggiungi un blocco alla coda che rimuove la superview. Nel blocco di completamento di ogni animazione riprendi la coda sospesa. Al termine dell'ultimo, verrà eseguito il blocco in coda.

+0

Potresti elaborare un codice? – Goles

1

È anche possibile utilizzare CATransaction. Sarà raccogliere eventuali animazioni incorporati:

[CATransaction begin]; 
[CATransaction setCompletionBlock:^{ // all animations finished here }]; 
[UIView animateWithDuration... 
[UIView animateWithDuration... 
... 
[CATransaction commit]; 

Questo permetterebbe di non dover tenere traccia delle animazioni da soli.