Ios 为什么我的带有子视图的superview在以模式显示(使用自动布局)时会收缩?
我有一个拥有单个自定义视图的视图控制器;自定义视图使用核心图形绘制游戏板。(不涉及其他子视图。) 我设置了自动布局约束,以便游戏板填充其superview。当我将视图控制器设置为根视图控制器时,游戏板(和superview)将填充屏幕,这是我的意图。但是,当我以模式呈现视图控制器时,游戏板(和superview)会收缩到零/最小,并且自动布局跟踪报告布局不明确 我写了一个简化的测试用例来说明这个问题 这是我的Ios 为什么我的带有子视图的superview在以模式显示(使用自动布局)时会收缩?,ios,autolayout,Ios,Autolayout,我有一个拥有单个自定义视图的视图控制器;自定义视图使用核心图形绘制游戏板。(不涉及其他子视图。) 我设置了自动布局约束,以便游戏板填充其superview。当我将视图控制器设置为根视图控制器时,游戏板(和superview)将填充屏幕,这是我的意图。但是,当我以模式呈现视图控制器时,游戏板(和superview)会收缩到零/最小,并且自动布局跟踪报告布局不明确 我写了一个简化的测试用例来说明这个问题 这是我的BoardViewController,它有一个绿色背景的顶层视图,但创建了一个红色背景
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
时,游戏板缩小到最小10x10平方米:
- (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];
}
我一直在尝试不同的自动布局规则,但无论我做什么,当视图控制器以模式显示时,我都无法让游戏板填满屏幕。(同时我问这个问题,我试图让运行时告诉我它认为什么是不明确的。但是我还不太擅长这个调试,因此我的问题在这里。)删除:
mainView.translatesAutoResizengMaskintoConstraints=否代码>
很有意思的是,这是可行的。这意味着,当使用presentViewController
以模式显示视图时,它应该具有与其超级视图相关的约束,但当设置为UIWindow
的rootViewController
时,它不需要这些约束…经过一些调查,当您将模式视图控制器推到全屏时,动画完成,显示视图控制器及其视图将从视图层次中删除。正如预期的那样,此时将删除视图约束。关闭模态视图控制器后,原始视图控制器及其视图将再次返回,但约束已消失,并且系统尚未保存和恢复。这是一个错误。即使在iOS7上。
使用NSAutoresizingConstraints有效的原因是视图系统能够自行重建约束
作为旁注:如果您有嵌套viewcontroller的设置(例如,外部viewcontroller嵌入导航控制器),则可以使用子viewcontroller模式链接这些设置。如果您这样做了,最上面的viewController视图将被我上面描述的内容删除。这意味着您必须仅将NSAutoResizengConstraints修补程序应用于最顶层的viewcontroller(通常是windows根viewcontroller),并在两者之间的任何位置使用标准约束。!非常感谢。所以,解释:我错误地弄乱了我的顶层视图的布局,而这正是呈现给我的人的权限。在本例中,presentViewController:animate:completion:
(我们假设)使用弹簧和支柱添加视图,因此我将其破坏。这是一个公平的说法吗?从我所看到的,作为一个窗口的rootViewController
是一个绕过约束的特例。如果您在mainView.translatesAutoResizezingMaskintoConstraints=NO编码>并实现updateConstraints
以手动添加一些约束…我尝试在视图中转储[self.view translates自动调整大小gmaskintoConstraints]
的值,用于模式演示和设置为根视图控制器。在这两种情况下都是这样。可能将视图设置为根视图控制器会显式设置其框架,而显示视图控制器则不会。