3

カードアプリにいくつかの簡単なアニメーションを実装しています。

これまでのところすべてがうまく機能していますが、完了したと言える前に、修正する必要のある詳細がもう1つあります。

シナリオは非常に単純です。

セグエがモーダルに新しい画面を表示する前に、3枚のカードがアニメーションで画面を終了する必要があります。

これまで、彼はアニメーションを実行して新しいビューをロードしましたが、私が理解できなかった詳細は、「アニメーションが終了するまで待ってから、新しいビューを表示する」ことです。

これが私がやっている方法です:

1)この方法で終了アニメーションを設定します

- (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)「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;
         }         
     }];    
}

前に言ったように、すべてが機能しますが、アニメーションが終了する前にモーダルウィンドウが表示されます。

私が欠けているものについて何か考えはありますか?

4

1 に答える 1

3

メソッドでアニメーションをトリガーする代わりに、アニメーション プロセスを開始するときにprepareForSeque呼び出しを試みてから、最終的なアニメーションの完了ブロックでメソッド[self performExitAnimationWithCompletionBlock]を使用して手動でシークをトリガーする必要があります。[self performSegueWithIdentifier]

あなたの続編が現在、ストーリーボードのボタンタッチに接続されていると仮定します。その場合は、ストーリーボードで切断する必要があります。おそらく、ストーリーボードの非表示のボタンに接続して、シークが自動的に起動されないようにすることで、シークを存続させることができます。

代わりに、次のようにボタン コードを記述します。

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

必要な機能を取得するための別の (そしておそらくより良い?) ソリューションは、シークをまったく使用せず、代わりに手動で画面を遷移させることです。この場合、ストーリーボードからシークを完全に削除します。また、ストーリーボードで OptionsViewController の識別子を指定してください。アニメーション/遷移を引き起こすアクションで次のコードを実行します。

-(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];
     }];    
}
于 2012-08-01T13:28:19.233 に答える