2012-08-01 8 views
5

Ich verwende animateWithDuration:animations:completion:, um mehrere Elemente meiner Benutzeroberfläche (etwa 4 Elemente) zu verschieben, bevor removeFromSuperview: aufgerufen wird.Wie können Sie wissen, ob mehrere Blöcke die Ausführung abgeschlossen haben, bevor Sie Maßnahmen ergreifen?

Meine Frage ist, wie kann ich wissen, dass alle diese Animationen vor dem Aufruf removeFromSuperview: abgeschlossen haben?

+0

Konnten Sie sie nicht alle gleichzeitig im Animationsbereich animieren, anstatt mehrere Blöcke zu erstellen? –

+0

Nicht, wenn die Animationen verschiedene Dauern und Stile haben – Goles

+0

mögliche Duplikate von [wie ein einzelner Vervollständigungsblock für eine verschachtelte Gruppe von UIView animateWithDuration Aufrufen aufgerufen wird?] (Http://stackoverflow.com/questions/8421441/how-to-invoke -a-single-completion-block-for-a-nested-gruppe-of-uiview-animatewith) –

Antwort

9

Ok, um meine eigene Frage zu beantworten.

landete ich so etwas wie dies zu tun:

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

Ich hoffe, das sonst als ein Beispiel für jemanden dienen kann.

+2

Hinzufügen dieser als eine normale Antwort. –

0

Erstellen Sie eine Dispatch-Warteschlange, indem Sie sie um die Anzahl der Animationen verschieben, die Sie gerade ausführen. Fügen Sie einen Block zu der Warteschlange hinzu, die das Entfernen aus Superview durchführt. Nehmen Sie im Beendigungsblock jeder Animation die angehaltene Warteschlange wieder auf. Wenn der letzte abgeschlossen ist, wird der blockierte Block ausgeführt.

+0

Können Sie mit etwas Code ausarbeiten? – Goles

1

Sie können auch CATransaction verwenden. Es fängt alle eingebetteten Animationen ab:

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

Dies würde ermöglichen, dass Sie nicht selbst die Animationen verfolgen müssen.

Verwandte Themen