呈现视图控制器后自动布局无效(和许多情况)

背景:

我有一个自定义的容器控制器,就像UITabBarController,但与切换animation。 我使用自动布局来实现。
由于子控制器之间的切换是dynamic的,当子视图控制器的视图添加到容器的视图中时,正确的约束被添加到子视图控制器,而不是在IB中预先设置。 (约束被添加到当然超视图)

http://d.pr/i/q6NF容器控制器笔尖设置

PS:约束的细节
H:| [Child](将约束的常量从左/右改为左/右)
H:[儿童(==超级)]
五:| [儿童] |

哪里有问题:

其中一个子控制器是一个导航控制器,当导航控制器呈现一个模式视图控制器(使用presentViewController:animated:completion:时,出现错误,并且在出现/closures帧之后closures它(使用dismissViewControllerAnimated:completion:导航控制器成为(x,y,0,0), 似乎自动布局变得无效,也许约束被删除。

http://d.pr/i/VmvL现在/解散过程

研究

我还没有使用代码来validation这些约束条件是什么,但是使用Spark Inspector,我可以在当前/解散过程中看到视图表示的变化。 当我的导航控制器提供了一个模式视图控制器,iOS只是交换整个导航控制器的视图到模态视图控制器的视图。 而当导航控制器的视图回来,自动布局不再工作。

可能的scheme

我提出的一个解决scheme是让我的容器控制器提供模态控制器。

或者我只是将我的容器控制器更改为自动布局。

事实是,自从我开始使用自动布局以来,这种技术所带来的问题只是主导了好处。 除了这个问题 ,每次界面方向改变时,我的容器控制器里的视图都不能自动排版,看来子视图总是在方向改变之前使用超视图的框架。 我仔细检查我设置的约束,没有冲突,没有歧义。

我的猜测是,我的自定义容器控制器与自动布局系统中的模态视图控制器和界面方向更改不兼容,即使使用约束设置。

Xcode环境

Xcode 5testing版,iOS 7SDK,目标iOS6.1也许有些东西与SDK环境不正确?

所以我发布这个问题,请帮助我!

这是我的第一个问题,所以我没有足够的声望发布图像,但我提供了截图的链接。 对不起!

我有一个类似的问题 。 我正在设置translatesAutoresizingMaskIntoConstraints = NO; 在我的根UIView。 它看起来是“最外面的”UIView – 在你的层次结构的根目录的超级视图必须使用默认的translatesAutoresizingMaskIntoConstraints = YES 。 一旦我删除了这一切,一切按预期工作。

这可能是由模糊的约束造成的。 我build议暂停正在运行的应用程序并input以下命令来进行控制台:

 po [[UIWindow keyWindow] _autolayoutTrace] 

我也有同样的问题,当我试着这个导航控制器它工作正常,但不是与目前的viewcontroller。 使用下面的视图控制器方法以及translatesAutoresizingMaskIntoConstraints来解决这个问题。

 -(void) viewWillLayoutSubviews { [super viewWillLayoutSubviews]; self.view.translatesAutoresizingMaskIntoConstraints = NO; } 

请让我现在,你有任何关心它。 谢谢

如果在UIWindow和根视图之间使用自动布局(设置根视图来填充整个UIWindow ),则这些约束将被另一个视图控制器的全屏演示所吹拂。

会发生什么,全屏演示文稿的整个层次结构会replaceUIWindow下面的所有内容 – 删除原始视图(吹掉约束)并replace新视图层次结构。 然后,当您的评论被取代,这些限制是失去了。 你需要重新创build它们,像viewWillAppear:或者只是确保你的根视图有self.view.translatesAutoresizingMaskIntoConstraints = NO;

我有一个与自动布局布局的表格视图单元格类似的问题。 从模态视图返回后,单元格的布局无效。 viewDidAppear后,我可以重新布局每个单元格,但看起来很糟糕。 感谢@ palimondo的build议,我开始嗅探translatesAutoresizingMaskIntoConstraints 。 事实certificate,我设置了我的表视图单元格的内容视图translatesAutoresizingMaskIntoConstraints = NO当我不应该。

我有同样的问题,与一个search栏容器作为错位元素(UITabController中,在UITabBarController内)。 我见过的其他解决scheme都没有工作,但我最终设法通过在viewWillAppear中重新添加布局约束来解决它:

 [self.view addConstraint:[NSLayoutConstraint constraintWithItem: self.searchBar.superview attribute: NSLayoutAttributeTop relatedBy: NSLayoutRelationEqual toItem: self.view attribute: NSLayoutAttributeTop multiplier: 1 constant: 0]];