19

次のコードを使用して、UIViewControllerに含まれるに子ビュー コントローラーを追加しようとしています。UINavigationController

- (void)buttonTapped:(id)sender
{
    MyChildController *viewController = [self.storyboard instantiateViewControllerWithIdentifier:@"MyChild"];
    [self addChildViewController:viewController];
    [self.view addSubview:viewController.view];
    [viewController didMoveToParentViewController:self];


    viewController.view.alpha = 0.0f;
    [UIView animateWithDuration:0.4 animations:^{
        viewController.view.alpha = 1.0f;
    }];
}

しかし、これは結果です:

画像結果

ご覧のとおり、UINavigatioBarUIToolbarはまだ子ビュー コントローラーの上にあります。子View Controllerをすべての上に置くにはどうすればよいですか? 私はすでにコードを次のものに置き換えようとしました:

[self.navigationController addChildViewController:viewController];
    [self.navigationController.view addSubview:viewController.view];
    [viewController didMoveToParentViewController:self.navigationController];

しかし、この方法でviewDidAppear:animatedは のviewControllerは呼び出されません。どうしてか分かりません。

4

3 に答える 3

34

@Samのコメントは正しいです。トリガーするにはbeginApperanceTransition:animated:、 and endAppearanceTransitionforを呼び出す必要があります。子ビュー コントローラーを追加するときに が呼び出されないviewDidAppear理由は、コンテナー構成メソッドをオーバーライドして、プログラマーが子ビュー コントローラーを奇妙な場所に追加できないようにするためです。あなたの場合、子ビューがナビゲーション バーを覆い隠すことは望ましくありません。ナビゲーション コントローラーの正しい使い方は、ナビゲーション バーの下に子を表示することです。とはいえ、この非標準 UI を、いつ表示され、いつ表示が終了したかを手動で子に伝えることで、強制することができます。UINavigationControllerviewDidAppear

UINavigationController に子を追加する

MyChildViewController* child = [[MyChildViewController alloc] init];
[self.navigationController addChildViewController:child];
child.view.frame = self.navigationController.view.bounds;
[self.navigationController.view addSubview:child.view];
child.view.alpha = 0.0;
[child beginAppearanceTransition:YES animated:YES];
[UIView
    animateWithDuration:0.3
    delay:0.0
    options:UIViewAnimationOptionCurveEaseOut
    animations:^(void){
        child.view.alpha = 1.0;
    }
    completion:^(BOOL finished) {
        [child endAppearanceTransition];
        [child didMoveToParentViewController:self.navigationController];
    }
];

UINavigationController から子を削除します

[child willMoveToParentViewController:nil];
[child beginAppearanceTransition:NO animated:YES];
[UIView
    animateWithDuration:0.3
    delay:0.0
     options:UIViewAnimationOptionCurveEaseOut
    animations:^(void){
        child.view.alpha = 0.0;
    }
    completion:^(BOOL finished) {
        [child endAppearanceTransition];
        [child.view removeFromSuperview];
        [child removeFromParentViewController];
    }
];
于 2014-03-25T21:19:28.763 に答える