2013-05-28 6 views
7

私は単一のカスタムビューを所有する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がモーダル表示されているときに、ボードをスクリーンに塗りつぶします。 (私はこの質問を求めていると同時に、ここに私の質問したがって、私はそれがあいまいであると考えるものを私に伝えるためにランタイムを取得しようとしている。しかし、私はまだこのデバッグは非常に良いではないです。)

答えて

2

削除:それは面白いです

mainView.translatesAutoresizingMaskIntoConstraints = NO;

これが機能すること。これは、ビューがpresentViewControllerを使用してモーダルモードで表示されたときには、そのスーパーにそれを関連する制約を持つことが期待されているが、それはそれらを必要としませんUIWindowrootViewController ...いくつかの調査の後

+0

ブリリアント!ありがとうございました!それで、説明:私は間違って私のトップレベルのビューのレイアウトを間違っていました。誰が私をプレゼントしているのか分かりません。この場合、 'presentViewController:animate:completion:'はspringsとstrutsを使ってビューを追加するので、私はそれを壊しました。それは公正な方法でそれを述べていますか? –

+0

私は、ウィンドウの 'rootViewController'が制約をバイパスする特殊なケースであるように見えます。'mainView.translatesAutoresizingMaskIntoConstraints = NO;'にして、いくつかの制約を手動で追加するために 'updateConstraints'を実装するとどうなるかを実験するのは興味深いでしょう... –

+0

' [self.view translatesAutoresizingMaskIntoConstraints] 'の値をダンプしようとしました。モーダルプレゼンテーションとroot-view-controllerとして設定されている両方のための 'viewDidAppear:'にあります。どちらの場合も、それはYESを放棄した。ビューを設定すると、ルートコントローラは明示的にフレームを設定し、ビューコントローラは表示しないことがあります。 –

2

として設定されたときに、それが見えることを意味しモーダルビューコントローラをフルスクリーンでプッシュし、アニメーションが完了すると、そのビューと共に提示されているビューコントローラがビュー階層から削除されます。予想通り、ビューの制約は削除されています。モーダルビューコントローラを閉じると、元のビューコントローラが再び表示されますが、制約はなくなり、システムによって保存および復元されませんでした。それはバグです。 iOS7でも NSAutoresizingConstraintsを使用すると、ビューシステムは、それ自体で制約を再構築することが可能であること、である働く理由。

注:ネストされたviewController(たとえば、外部ビューコントローラにナビゲーションコントローラが組み込まれている)を設定している場合は、子viewcontrollersパターンを使用してリンクできます。これを行った場合は、上で説明したviewControllerビューの一番上のビューが削除されます。これは、NSAutoresizingConstraintsパッチをその最上位のviewcontroller(通常はWindowsのroot viewcontroller)に適用するだけで、その間にどこでも標準の制約を使用する必要があることを意味します。

関連する問題