9

正確に何をしているのかわかりませんtransitionFromViewController:toViewController:duration:options:animation:completion:。それは単なる便利な方法ですか?

たとえば、これを行うことの違いは何ですか...

[self transitionFromViewController:fromViewController
                  toViewController:toViewController
                          duration:0.25
                           options:UIViewAnimationOptionCurveEaseInOut
                        animations:^{
                            fromViewController.view.alpha = 0;
                            toViewController.view.alpha = 1;
                        } completion:^(BOOL finished) {
                            [fromViewController removeFromParentViewController];
                            [toViewController didMoveToParentViewController:self];
                        }];

...この?

[self.view addSubview:toViewController.view];
[UIView animateWithDuration:0.25
                      delay:0
                    options:UIViewAnimationOptionCurveEaseOut
                 animations:^{
                     fromViewController.view.alpha = 0;
                     toViewController.view.alpha = 1;
                 } completion:^(BOOL finished){
                     [fromViewController.view removeFromSuperview];
                     [fromViewController removeFromParentViewController];
                     [toViewController didMoveToParentViewController:self];
                 }];

私が尋ねる理由は、場合によっては、子コントローラービューをコンテナーコントローラービューの特定のサブビューに追加する必要があるためです。使用transitionFromViewController:toViewController:duration:options:animation:completion:してもこのオプションはありません。

4

3 に答える 3

16

はい、私はあなたが正しいと思います: 機能的には同じように見えます (実装の詳細を知らずに便利なメソッドと呼ぶことができるかどうかはわかりませんが、そうかもしれません)。明らかに、transitionFromViewControllerビュー コントローラーのコンテインメント用に設計されておりanimateWithDuration、ビューの汎用アニメーションとして設計されています。

明らかに封じ込めを行っていることを考えると、おそらくtransitionFromViewControllerではなくを使用する必要がありますanimateWithDuration。これは明白であり、Apple が推奨する手法です。サブビューにがある場合はfromViewController.view、新しいtoViewController.viewが同じサブビューに追加されます。

また、欠落willMoveToParentViewControllerしている andを含めることをお勧めaddChildViewControllerします(簡潔にするために省略したと思いますが、完全を期すために含めています):

[fromViewController willMoveToParentViewController:nil];
[self addChildViewController:toViewController];

[self transitionFromViewController:fromViewController
                  toViewController:toViewController
                          duration:0.25
                           options:UIViewAnimationOptionCurveEaseInOut | UIViewAnimationOptionTransitionCrossDissolve
                        animations:^{}
                        completion:^(BOOL finished){
                            [fromViewController removeFromParentViewController];
                            [toViewController didMoveToParentViewController:self];
                        }];

を使用していることにも注意してくださいUIViewAnimationOptionTransitionCrossDissolve。アルファを手動で設定している場合は、忘れずに を初期化してくださいtoViewController.view.alpha。例:

[fromViewController willMoveToParentViewController:nil];
[self addChildViewController:toViewController];
toViewController.view.alpha = 0.0;

[self transitionFromViewController:fromViewController
                  toViewController:toViewController
                          duration:0.25
                           options:UIViewAnimationOptionCurveEaseInOut
                        animations:{
                            fromViewController.view.alpha = 0.0;
                            toViewController.view.alpha = 1.0;
                        }
                        completion:^(BOOL finished){
                            [fromViewController removeFromParentViewController];
                            [toViewController didMoveToParentViewController:self];
                        }];
于 2012-11-17T03:06:21.647 に答える
3

短い答え:
いいえ、両方の子コントローラーで呼び出されるappearance-methodが異なるため、単なる便利なメソッドではありません。

長い答え:
について -->

[self.view addSubview:toViewController.view];
[UIView animateWithDuration:0.25
                      delay:0
                    options:UIViewAnimationOptionCurveEaseOut
                 animations:^{
                     fromViewController.view.alpha = 0;
                     toViewController.view.alpha = 1;
                 } completion:^(BOOL finished){
                     [fromViewController.view removeFromSuperview];
                     [fromViewController removeFromParentViewController];
                     [toViewController didMoveToParentViewController:self];
                 }];

電話をかけると舞台裏で何が起こるか

[self.view addSubview:toViewController.view];

このようなものです(もちろんこれは完全ではありません)

[toViewController.view viewWillAppear:false]; <-- meaning not animated
//Add the view to the view hierarchy
//Layout the view
[toViewController.view viewDidAppear:false]; <-- meaning not animated

その後、アニメーション toViewController を実行すると、そのビューは既に表示されており、アニメーションなしで表示されていると「考え」ます。同じことが fromViewController にも当てはまります。アニメーション中、fromViewController はビューが閉じられることを認識しません。viewWill/DidDisappear は、アニメーションの後に呼び出しで呼び出されます。

[fromViewController.view removeFromSuperview];


一方で -->

[self transitionFromViewController:fromViewController
              toViewController:toViewController
                      duration:0.25
                       options:UIViewAnimationOptionCurveEaseInOut | UIViewAnimationOptionTransitionCrossDissolve
                    animations:^{}
                    completion:^(BOOL finished){
                        [fromViewController removeFromParentViewController];
                        [toViewController didMoveToParentViewController:self];
                    }];

このようなことをします

[UIView animateWithDuration:yourDuration
                      delay:yourDelay
                    options:yourOptions
                 animations:^{
                     [toViewController viewWillAppear:true];
                     [fromViewController viewWillDisappear:true];
                     //Add toViewcontroller.view to the view hierarchy
                     //Layout the toViewcontroller.view --> changes here are not animated. (There is no "previous state" as the view has just been added to the hierarchy)
                     //Call your animation-block
                 } completion:^(BOOL finished){
                     [toViewController viewDidAppear:true];
                     [fromViewController.view removeFromSuperview];
                     [fromViewController viewDidDisappear:true];
                     //Call your completion-block
                 }];

とても長い答えです:
viewWillAppear と viewWillDisappear はアニメーションブロック内で呼び出され、true に渡されます。これはアプリケーションにとって役立つ場合とそうでない場合があるため、2 つの方法に違いがある場合とない場合があります。

于 2015-03-14T12:26:40.497 に答える
0

ドキュメントが言うように、同じ子View Controllerの2つのビューではなく、2つの子View Controller間の遷移に使用することを目的としています。

最初のコード スニペットではtoViewController、最初の 2 つのパラメーターと同じものを渡しています。これは、同じものではなく、2 つの異なるビュー コントローラーであることを意図しています。

同じView Controllerのビューを切り替えるだけの場合は、2番目の例がより適切です。

于 2012-11-16T23:53:33.887 に答える