5

カスタムセグエでは、次の単純な遷移があります。

- (void) perform {
    UIViewController *src = (UIViewController *) self.sourceViewController;
    UIViewController *dst = (UIViewController *) self.destinationViewController;
    [UIView transitionWithView:src.navigationController.view duration:1
                       options:UIViewAnimationOptionTransitionFlipFromBottom
                    animations:^{
                        [src.navigationController pushViewController:dst animated:NO];
                    }
                    completion:NULL];
}

コンテンツビューは正常にアニメーション化されます。ただし、アニメーションを実行すると、上部のナビゲーションバーのレイアウトが乱雑になり(ボタンはすべて左上隅に詰め込まれ、タイトルは表示されません)、アニメーションが終了したときにのみ所定の位置に表示されます。誰かが私が間違ったこととそれを修正する方法を知っていますか?ありがとう!

4

2 に答える 2

6

私の問題を理解しました。UINavigationControllerがどのように機能し、管理するUIViewControllerと相互作用するかを考えると、元のコードは確かに正しくありません。(私がOPで行ったことのような厄介なことは、古いSO投稿の解決策として見つけることができます。)

これが私のために働くコードです(1つのマイナーなクイズがあります):

- (void) perform {
    UIViewController *src = (UIViewController *) self.sourceViewController;
    UIViewController *dst = (UIViewController *) self.destinationViewController;
    [UIView transitionFromView:src.view
                        toView:dst.view
                      duration:1
                       options:UIViewAnimationOptionTransitionFlipFromBottom
                    completion:nil];
    [UIView transitionFromView:src.navigationItem.titleView
                        toView:dst.navigationItem.titleView
                      duration:1
                       options:UIViewAnimationOptionTransitionFlipFromBottom
                    completion:nil];
    [src.navigationController pushViewController:dst animated:NO];
}

Quibble:これにより、コンテンツビューとは別にナビゲーションバーがアニメーション化されるため、画面全体ではなく2つの部分が反転します。私はもともとやろうとしていました:

    [UIView transitionFromView:src.navigationController.view
                        toView:dst.navigationController.view

しかし、1)宛先のnavigationControllerプロパティは、navコントローラーにプッシュされるまでまだ設定されていないため、2)同じビューを参照している場合でも、失敗します。忘れた

ナビゲーションコントローラーのビューは、ナビゲーションバー、オプションのツールバー、カスタムコンテンツを含むビューなど、他のいくつかのビューの単なるコンテナーです...ナビゲーションバーとツールバービューのコンテンツは変更されますが、ビュー自体は変更されます。そうではありません...ナビゲーションコントローラーオブジェクトは、ナビゲーションスタック上のビューコントローラーに関連付けられたナビゲーションアイテム(UINavigationItemクラスのインスタンス)を使用して、ナビゲーションバーのコンテンツを動的に構築します。したがって、ナビゲーションバーの内容を変更するには、カスタムViewControllerのナビゲーション項目を構成する必要があります。(ドキュメント)

于 2012-06-25T19:55:22.207 に答える
0

別の「クイブル」?置いた

[src.navigationController pushViewController:dst animated:YES];

 [UIView transitionFromView ...  

ナビゲーションコントローラーが宛先のviewDidLoadメソッド内で到達可能になるようにします。

于 2012-08-22T22:36:56.400 に答える