8

親と子の2つのView Controllerがあります。

したがって、viewDidLoadメソッドでは次のことを行います。

ChildViewController* childViewController = [[ChildViewController alloc] init];

[self addChildViewController:childViewController];

// ChildViewController sets his own constraints in viewDidLoad
[self.view addSubview:childViewController.view];

[childViewController didMoveToParentViewController:self];

//
// setup constraints to expand childViewController.view to 
// fill the size of parent view controller
//

したがって、基本的には、updateViewConstraints親コントローラーの制約が適用される前に ChildViewController で呼び出されるため、実際には のカスタムメソッドでself.view.frame == CGRectZero指定したものとまったく同じです。loadViewChildViewController

translatesAutoresizingMaskIntoConstraintsすべてのビューに対して all を設定しNOます。

この場合、制約を設定する適切な方法は何ChildViewControllerですか?親の後に制約を更新しますか?

両方のコントローラーからの現在のログはかなりイライラします。viewWillLayoutSubviews の前に updateViewConstraints を呼び出す方法がわかりません。

App[47933:c07] ChildViewController::updateViewConstraints. RECT: {{0, 0}, {0, 0}}
App[47933:c07] ParentViewController::updateViewConstraints
App[47933:c07] ChildViewController:viewWillLayoutSubviews. RECT: {{0, 0}, {984, 454}}
App[47933:c07] ChildViewController:viewDidLayoutSubviews. RECT: {{0, 0}, {984, 454}}
4

5 に答える 5

5

子コントローラーを可視コントローラー (ポップアップ) に追加する同様の状況があります。

インターフェイス ビルダーで子ビュー コントローラーを定義します。viewDidLoad メソッドは setTranslatesAutoresizingMaskIntoConstraints:NO を呼び出すだけです

次に、親である UIViewController パラメーターを受け取る子コントローラーでこのメソッドを定義します。このメソッドは、指定された親ビュー コントローラーに自身を追加し、独自の制約を定義します。

- (void) addPopupToController:(UIViewController *)parent {
    UIView *view = [self view];
    [self willMoveToParentViewController:parent];
    [parent addChildViewController:self];
    [parent.view addSubview:view];
    [self didMoveToParentViewController:parent];

    NSArray *horizontalConstraints = [NSLayoutConstraint constraintsWithVisualFormat:@"H:|-0-[view]-0-|"
                                                                             options:0
                                                                             metrics:nil
                                                                               views:NSDictionaryOfVariableBindings(view)];
    [parent.view addConstraints:horizontalConstraints];

    NSArray *verticalConstraints = [NSLayoutConstraint constraintsWithVisualFormat:@"V:|-0-[view]-0-|"
                                                                           options:0
                                                                           metrics:nil
                                                                             views:NSDictionaryOfVariableBindings(view)];
    [parent.view addConstraints:verticalConstraints];
}

次に、親 UIViewController (既に表示されているもの) 内で、子のポップアップ ビュー コントローラーを表示するときに、次のように呼び出します。

PopUpNotificationViewController *popup = [[self storyboard] instantiateViewControllerWithIdentifier:@"NotificationPopup"];
[popup addPopupToController:self];

親コントローラーのビューに追加するときに、子コントローラーのビューに必要な制約を定義できます。

于 2014-01-23T12:49:47.657 に答える
2

次のリンクに従って、制約の作成を に移動しましたviewWillLayoutSubviews。これは、ビューの境界が適切に設定されている場所です。この回答は、子ビュー コントローラーの updateViewConstraints が親ビュー コントローラーの前に呼び出された理由について説明を欠いていると感じています。または、コードのバグにすぎない可能性がありますが、この回避策で問題が解決します...

于 2013-07-29T22:04:13.757 に答える