8

loadViewUIViewControllerメソッドを上書きしてビューを作成します。

- (void)loadView {
    UIView *view = [[UIView alloc] init];
    view.autoresizingMask = UIViewAutoresizingFlexibleHeight|UIViewAutoresizingFlexibleWidth;
    self.view = view;
}

今、私は AutoLayout に切り替えたいので、

view.translatesAutoresizingMaskIntoConstraints = NO;

loadView メソッドに。ここで、以前に自動生成されたのと同じ制約を指定する必要があります。私のアプローチは、 updateViewConstraints を上書きすることでした

- (void)updateViewConstraints {
    if (0 == [[self.view constraints] count]) {
        NSDictionary* views = @{@"view" : self.view};

        [self.view addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"H:|[view]|" options:0 metrics:0 views:views]];
        [self.view addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"V:|[view]|" options:0 metrics:0 views:views]];
     }

    [super updateViewConstraints];
}

ただし、この種の制約はスーパー ビューに適用する必要があると思うため、例外が発生します。

*** Terminating app due to uncaught exception 'NSGenericException', reason: 'Unable to install constraint on view.  Does the constraint reference something from outside the subtree of the view?  That's illegal.

では、正しい制約はどのように見える必要があるのでしょうか?

4

4 に答える 4

5

Matt Neuburgが彼の本 Programming iOS 6 の第 19 章のセクション Manual Layout で説明しているように、ルート ビューに制約を設定する必要はありません。

(self.view)私たちは、私たちの見解に合理的な枠組みを与えることを気にしませんでした. これは、ビューを適切に構成するために他の誰かに依存しているためです。この場合、「他の誰か」はウィンドウでありrootViewController、サブビューとしてウィンドウに配置する前に、ビュー コントローラーのビューをルート ビューとして適切にフレーミングすることによって、そのプロパティをビュー コントローラーに設定することに応答します。

于 2013-05-26T10:27:52.023 に答える
5

CEarwood のアプローチの問題は、これが ViewController であり、そのビューが他のビューのサブビューではないことです。そのため、self.view.subview を呼び出すと単に nil になります。Apple のドキュメントとガイドラインでは、UIViewController が多かれ少なかれ画面全体 (ナビゲーション バーやタブ バーなどを除く) を占有することを強く示唆していることに注意してください。

Palimondo の答えは基本的に正しいものです。UIViewController は loadView でビューを初期化する必要がありますが、ウィンドウのフレームと制約に自動的に設定されるため、フレームまたは制約を指定する必要はありません。自分で loadView を実装しない場合、これはまさにデフォルトで行われることです。

于 2013-06-20T16:42:26.703 に答える
1

ウィンドウのルート ビューに制約を設定する必要があるかどうかはわかりません。

そうは言っても、あなたの制約は正しいように見えますが、例外は次の理由によるものだと思います:

    [self.view addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"H:|[view]|" options:0 metrics:0 views:views]];

| を使用します。ビューのスーパービューを表す表記。ルート レベルのビューであるため、スーパービューはありません。このようなものがうまくいくかもしれません:

- (void)loadView {
    UIView *customView = [[UIView alloc] init];
    [self.view addSubview:customView];
    NSDictionary* views = @{@"customView" : customView};

    [customView addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"H:|[customView]|" options:0 metrics:0 views:views]];
    [customView addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"V:|[customView]|" options:0 metrics:0 views:views]];
}
于 2013-04-30T01:53:46.800 に答える