我有一個視圖控制器擁有一個自定義視圖;自定義視圖使用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];
}
我一直在嘗試不同的自動佈局規則,但無論我做什麼,我不能讓遊戲當視圖控制器以模態方式呈現時,用於填充屏幕。 (與此同時,我正在問這個問題,我試圖讓運行時告訴我它認爲是什麼含糊不清,但我並沒有很好的調試,因此我的問題在這裏。)
太棒了!謝謝!所以,解釋:我錯誤地搞亂了我頂級視圖的佈局,這是任何人給我的權限。在這種情況下,'presentViewController:animate:completion:'(我們假設)使用springs-and-struts添加視圖,所以我打破了它。這是公平的陳述方式嗎? –
從我可以看到它似乎是一個窗口的'rootViewController'是一個繞過約束的特殊情況。這將是有趣的,如果你在'mainView.translatesAutoresizingMaskIntoConstraints = NO留下會發生什麼實驗;'和'落實到updateConstraints'手動添加一些約束... –
我嘗試傾銷'[self.view translatesAutoresizingMaskIntoConstraints]值'在'viewDidAppear:'用於兩個模態呈現和被設置-AS-根 - 視圖 - 控制器。在這兩種情況下,它都拋出了YES。也許設置的視圖,作爲根視圖控制器顯式地設定它的幀,而呈現視圖控制器沒有。 –