2012-08-01 14 views
5

Estoy usando animateWithDuration:animations:completion: para mover varios elementos de mi interfaz de usuario (unos 4 elementos) antes de llamar al removeFromSuperview:.¿Cómo saber si varios bloques han completado la ejecución antes de tomar medidas?

Mi pregunta es, ¿cómo puedo saber que todas esas animaciones se han completado antes de llamar al removeFromSuperview:?

+0

¿No podría animarlos todos a la vez en la sección de animaciones en lugar de crear múltiples bloques? –

+0

No si las animaciones tienen diferentes duraciones y estilos – Goles

+0

posible duplicado de [cómo invocar un solo bloque de finalización para un grupo anidado de UIView animateWithDuration llamadas?] (Http://stackoverflow.com/questions/8421441/how-to-invoke -a-single-completion-block-for-a-anidado-group-of-uiview-animatewith) –

Respuesta

9

Ok, para responder a mi propia pregunta.

terminé hacer algo como esto:

// 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); 

espero que esto puede servir de ejemplo para otra persona.

+2

Agregando esto como una respuesta normal. –

0

Cree una cola de distribución, córtelo por la cantidad de animaciones que esté haciendo. Agregue un bloque a la cola que elimine de superview. En el bloque de finalización de cada animación reanudar la cola suspendida. Cuando se complete el último, se ejecutará el bloque en cola.

+0

¿Podría elaborar con algún código? – Goles

1

También puede usar CATransaction. Se captura las animaciones embebidas:

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

Esto le permitiría no tener que llevar un registro de las animaciones usted mismo.

Cuestiones relacionadas