2013-05-28 51 views
7

我有一個視圖控制器擁有一個自定義視圖;自定義視圖使用Core Graphics繪製遊戲板。 (不涉及其他子視圖。)爲什麼我的超視圖與子視圖模式呈現時會縮小(使用自動佈局)?

我設置了自動佈局約束,以便遊戲板填充其超級視圖。當我將視圖控制器設置爲根視圖控制器時,遊戲板(和超級視圖)就像我的意圖一樣填滿屏幕。但是,當我以模態方式呈現視圖控制器時,遊戲板(和超級視圖)縮小到無/最小,並且自動佈局跟蹤報告佈局不明確。

我寫了一個簡化的測試用例來說明這個問題。

這是我的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]; 
} 

如果我設置爲我的根視圖控制器,然後我看到我漂亮的紅色遊戲板填充屏幕。不過,遊戲棋盤縮小到最小的10×10平方,當我從一個不同的RootViewController呈現BoardViewController

- (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]; 
} 

我一直在嘗試不同的自動佈局規則,但無論我做什麼,我不能讓遊戲當視圖控制器以模態方式呈現時,用於填充屏幕。 (與此同時,我正在問這個問題,我試圖讓運行時告訴我它認爲是什麼含糊不清,但我並沒有很好的調試,因此我的問題在這裏。)

回答

2

刪除:

mainView.translatesAutoresizingMaskIntoConstraints = NO;

有趣的是,這個工程。這意味着,當視圖被呈現模態使用presentViewController預計將它與它的父的限制,但是,當設置爲UIWindow它並不需要他們的rootViewController ...

+0

太棒了!謝謝!所以,解釋:我錯誤地搞亂了我頂級視圖的佈局,這是任何人給我的權限。在這種情況下,'presentViewController:animate:completion:'(我們假設)使用springs-and-struts添加視圖,所以我打破了它。這是公平的陳述方式嗎? –

+0

從我可以看到它似乎是一個窗口的'rootViewController'是一個繞過約束的特殊情況。這將是有趣的,如果你在'mainView.translatesAutoresizingMaskIntoConstraints = NO留下會發生什麼實驗;'和'落實到updateConstraints'手動添加一些約束... –

+0

我嘗試傾銷'[self.view translatesAutoresizingMaskIntoConstraints]值'在'viewDidAppear:'用於兩個模態呈現和被設置-AS-根 - 視圖 - 控制器。在這兩種情況下,它都拋出了YES。也許設置的視圖,作爲根視圖控制器顯式地設定它的幀,而呈現視圖控制器沒有。 –

2

經過一番調查後,它看起來例如當您將模式視圖控制器全屏顯示並且動畫完成時,呈現視圖控制器及其視圖將從視圖層次結構中移除。正如預期的那樣,視圖約束正在被刪除。一旦你關閉了模式視圖控制器,原來的視圖控制器及其視圖又回來了,但約束消失了,並沒有被系統保存和恢復。這是一個錯誤。即使在iOS7上。 使用NSAutoresizingConstraints工作的原因是視圖系統能夠自行重建約束。作爲一個方面說明:如果你有一個嵌套的viewControllers設置(例如一個外部viewcontroller嵌入導航控制器),那麼你可以使用子viewcontrollers模式鏈接這些。如果你這樣做了,最上面的viewController視圖正在被我上面描述的內容刪除。這意味着您只能將NSAutoresizingConstraints修補程序應用於最頂層的視圖控制器(通常是Windows根視圖控制器),並在任何中間位置使用標準約束。

相關問題