Ios 为什么我的带有子视图的superview在以模式显示(使用自动布局)时会收缩?

Ios 为什么我的带有子视图的superview在以模式显示(使用自动布局)时会收缩?,ios,autolayout,Ios,Autolayout,我有一个拥有单个自定义视图的视图控制器;自定义视图使用核心图形绘制游戏板。(不涉及其他子视图。) 我设置了自动布局约束,以便游戏板填充其superview。当我将视图控制器设置为根视图控制器时,游戏板(和superview)将填充屏幕,这是我的意图。但是,当我以模式呈现视图控制器时,游戏板(和superview)会收缩到零/最小,并且自动布局跟踪报告布局不明确 我写了一个简化的测试用例来说明这个问题 这是我的BoardViewController,它有一个绿色背景的顶层视图,但创建了一个红色背景

我有一个拥有单个自定义视图的视图控制器;自定义视图使用核心图形绘制游戏板。(不涉及其他子视图。)

我设置了自动布局约束,以便游戏板填充其superview。当我将视图控制器设置为根视图控制器时,游戏板(和superview)将填充屏幕,这是我的意图。但是,当我以模式呈现视图控制器时,游戏板(和superview)会收缩到零/最小,并且自动布局跟踪报告布局不明确

我写了一个简化的测试用例来说明这个问题

这是我的
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]
的值,用于模式演示和设置为根视图控制器。在这两种情况下都是这样。可能将视图设置为根视图控制器会显式设置其框架,而显示视图控制器则不会。