私は単一のカスタムビューを所有するView Controllerを持っています。カスタムビューはCore Graphicsを使用してゲームボードを描画します。ゲームボードは、そのスーパーを埋めるように、(他のサブビューが関与していません。)私のSuperview-with-Subviewは、(自動レイアウトを使用して)モーダルに表示されたときに縮小されるのはなぜですか?
私は、自動レイアウトの制約を設定します。ビューコントローラをルートビューコントローラとして設定すると、私の意図と同じように、ゲームボード(およびスーパービュー)が画面に表示されます。しかし、私がビュー・コントローラーをモーダルに提示すると、ゲーム・ボード(およびスーパー・ビュー)は何も最小限に収縮し、自動レイアウト・トレースはレイアウトがあいまいであると報告します。
私は質問を説明するために単純化されたテストケースを書きました。
はここで緑の背景を持つトップレベルのビューを持っている私のBoardViewController
、ですが、赤の背景を持つ単一の広大なサブビューを作成します。
- (void)loadView
{
UIView *mainView = [[UIView alloc] init];
mainView.translatesAutoresizingMaskIntoConstraints = NO;
mainView.backgroundColor = [UIColor greenColor];
UIView *subView = [[UIView alloc] init];
subView.translatesAutoresizingMaskIntoConstraints = NO;
subView.backgroundColor = [UIColor redColor];
[mainView addSubview:subView];
self.view = mainView;
NSDictionary *viewsDictionary = NSDictionaryOfVariableBindings(subView);
NSArray *c1 = [NSLayoutConstraint constraintsWithVisualFormat:@"H:|[subView(>=10)]|"
options:0
metrics:nil
views:viewsDictionary];
NSArray *c2 = [NSLayoutConstraint constraintsWithVisualFormat:@"V:|[subView(>=10)]|"
options:0
metrics:nil
views:viewsDictionary];
[self.view addConstraints:c1];
[self.view addConstraints:c2];
}
私は私のルートビューコントローラとしてこれを設定した場合、私は私の素敵な赤のゲームボードが画面を埋め参照してください。私は、このビューコントローラが引き継ぐときにすべての赤の画面を見てみたいと思います。私は別のRootViewController
からBoardViewController
を提示するときしかし、ゲームボードは、最小10×10の正方形に縮小:
- (void)loadView
{
UIView *rootView = [[UIView alloc] init];
rootView.translatesAutoresizingMaskIntoConstraints = NO;
UIButton *presentButton = [UIButton buttonWithType:UIButtonTypeRoundedRect];
presentButton.translatesAutoresizingMaskIntoConstraints = NO;
[presentButton setTitle:@"Present" forState:UIControlStateNormal];
[presentButton addTarget:self
action:@selector(present:)
forControlEvents:UIControlEventTouchUpInside];
[rootView addSubview:presentButton];
self.view = rootView;
[rootView addConstraint:[NSLayoutConstraint constraintWithItem:presentButton
attribute:NSLayoutAttributeCenterX
relatedBy:NSLayoutRelationEqual
toItem:rootView
attribute:NSLayoutAttributeCenterX
multiplier:1.0
constant:0.0]];
[rootView addConstraint:[NSLayoutConstraint constraintWithItem:presentButton
attribute:NSLayoutAttributeCenterY
relatedBy:NSLayoutRelationEqual
toItem:rootView
attribute:NSLayoutAttributeCenterY
multiplier:1.0
constant:0.0]];
}
- (void)present:(id)sender
{
BoardViewController *bvc = [[BoardViewController alloc] init];
[self presentViewController:bvc animated:YES completion:NULL];
}
私は別の自動レイアウトルールをしようとし続けるが、関係なく、私は何をすべきか、私はゲームを取得することはできませんView Controllerがモーダル表示されているときに、ボードをスクリーンに塗りつぶします。 (私はこの質問を求めていると同時に、ここに私の質問したがって、私はそれがあいまいであると考えるものを私に伝えるためにランタイムを取得しようとしている。しかし、私はまだこのデバッグは非常に良いではないです。)
ブリリアント!ありがとうございました!それで、説明:私は間違って私のトップレベルのビューのレイアウトを間違っていました。誰が私をプレゼントしているのか分かりません。この場合、 'presentViewController:animate:completion:'はspringsとstrutsを使ってビューを追加するので、私はそれを壊しました。それは公正な方法でそれを述べていますか? –
私は、ウィンドウの 'rootViewController'が制約をバイパスする特殊なケースであるように見えます。'mainView.translatesAutoresizingMaskIntoConstraints = NO;'にして、いくつかの制約を手動で追加するために 'updateConstraints'を実装するとどうなるかを実験するのは興味深いでしょう... –
' [self.view translatesAutoresizingMaskIntoConstraints] 'の値をダンプしようとしました。モーダルプレゼンテーションとroot-view-controllerとして設定されている両方のための 'viewDidAppear:'にあります。どちらの場合も、それはYESを放棄した。ビューを設定すると、ルートコントローラは明示的にフレームを設定し、ビューコントローラは表示しないことがあります。 –