3 Stimmen

Warten, bis der Animationsblock beendet ist, bevor der Übergang erfolgt

Ich implementiere einige einfache Animationen in meine Karten-App.

Bis jetzt funktioniert alles prima, aber ich muss noch ein Detail ausbessern, bevor ich sagen kann, dass es fertig ist.

Das Szenario ist ziemlich einfach:

Drei Karten müssen den Bildschirm mit einer Animation verlassen, bevor Segue modal den neuen Bildschirm aufruft.

Bis jetzt wird die Animation ausgeführt und die neue Ansicht geladen, aber das Detail, das ich nicht lösen konnte, ist das "Warten, bis die Animation beendet ist, bevor die neue Ansicht angezeigt wird".

Ich gehe folgendermaßen vor:

1) Mit dieser Methode die Ausstiegsanimation einstellen

- (void)performExitAnimationWithCompletionBlock:(void (^)(BOOL))block
{    
    [UIView animateWithDuration:0.1f
                          delay:0.0f
                        options:UIViewAnimationOptionCurveEaseOut
                     animations:^
     {
         self.optionOneFront.center = self.optionOneBack.center = self.optionTwoFront.center;
         self.optionOneFront.transform = self.optionOneBack.transform = self.optionTwoFront.transform;

         self.optionThreeFront.center = self.optionThreeBack.center = self.optionTwoFront.center;
         self.optionThreeFront.transform = self.optionThreeBack.transform = self.optionTwoFront.transform;
     }
                     completion:^(BOOL finished)
     {
         CGPoint point = CGPointMake(self.optionTwoFront.center.x, self.view.frame.size.height * -2.0f);

         [UIView animateWithDuration:1.0f
                               delay:0.0f
                             options:UIViewAnimationOptionCurveEaseOut
                          animations:^
          {
              self.optionOneFront.center   = point;
              self.optionOneBack.center    = point;
              self.optionTwoFront.center   = point;
              self.optionTwoBack.center    = point;
              self.optionThreeFront.center = point;
              self.optionThreeBack.center  = point;
          }
                          completion:block];
     }];
}

2) Versuchen Sie, den Segue-Code in die Animation einzubinden, bevor Sie die "AddOptions" VC

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
{
    [self performExitAnimationWithCompletionBlock:^(BOOL finished)
     {
         // Executes the following "if" statement if the user wants to add new options
         if ([segue.identifier isEqualToString:@"AddOptions"])
         {
             UINavigationController *navigationController = segue.destinationViewController;
             OptionsViewController *controller = (OptionsViewController *)navigationController.topViewController;
             controller.delegate = self;
         }         
     }];    
}

Wie ich bereits sagte, funktioniert alles, aber das modale Fenster erscheint, bevor die Animation beendet ist.

Haben Sie eine Idee, was ich übersehen habe?

3voto

pdriegen Punkte 2009

Anstelle der Auslösung der Animation in der prepareForSeque Methode, sollten Sie versuchen, die [self performExitAnimationWithCompletionBlock] wenn Sie den Animationsprozess starten wollen, und lösen Sie den Vorgang dann manuell mit dem Befehl [self performSegueWithIdentifier] Methode im Abschlussblock der endgültigen Animation.

Ich gehe davon aus, dass Ihr Seque derzeit mit einem Button Touch in Ihrem Storyboard verbunden ist. Wenn das der Fall ist, müssen Sie die Verbindung im Storyboard trennen. Vielleicht können Sie die Seque lebendig halten, indem Sie eine Verbindung zu einer unsichtbaren Schaltfläche auf Ihrem Storyboard, so dass es nie automatisch ausgelöst werden kann.

Schreiben Sie stattdessen den Schaltflächencode wie folgt:

-(void)btnStartSeque:(id)sender{

      //trigger animations

      [self performExitAnimationWithCompletionBlock:^(BOOL finished){
         [self performSegueWithIdentifer:@"AddOptions" sender:self];
     }];    
}

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender{

   // Executes the following "if" statement if the user wants to add new options
    if ([segue.identifier isEqualToString:@"AddOptions"])
    {
      UINavigationController *navigationController = segue.destinationViewController;
      OptionsViewController *controller = (OptionsViewController *)navigationController.topViewController;
      controller.delegate = self;
    }               
}

Eine alternative (und vielleicht bessere?) Lösung, um die gewünschte Funktionalität zu erhalten, besteht darin, überhaupt keine Seque zu verwenden, sondern stattdessen den Bildschirm manuell zu überblenden. In diesem Fall löschen Sie die Seque vollständig aus dem Storyboard. Stellen Sie außerdem sicher, dass Sie einen Bezeichner für OptionsViewController im Storyboard bereitstellen. Führen Sie den folgenden Code für die Aktion aus, die die Animation/den Übergang verursacht:

-(void)btnStartModalTransition:(id)sender{

      //trigger animations

      [self performExitAnimationWithCompletionBlock:^(BOOL finished){

          //load the storyboard (sub in the name of your storyboard)
          UIStoryBoard* storyBoard = [UIStoryBoard storyBoardWithName:@"MyStoryBoard" bundle:nil]
          //load optionsviewcontroller from storyboard
          OptionsViewController *controller = (OptionsViewController *)[storyBoard instantiateViewControllerWithIdentifier:@"OptionsViewControllerIdentifier"];
          UINavigationController *navigationController = [[UINavigationController alloc] initWithRootViewController:controller];

         controller.delegate = self;
         [self presentModalViewController:navigationController animated:YES];
     }];    
}

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X