33

背景:

我有一个自定义容器控制器,它就像 UITabBarController,但带有切换动画。我使用自动布局来实现。
因为子控制器之间的切换是动态的,所以当子视图控制器的视图被添加到容器的视图中时,适当的约束被添加到子视图控制器中,而不是在 IB 中预先设置。(约束当然被添加到superview中)

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

PS: 约束细节
H:|[Child](将约束常量从左/右到右/左更改为动画)
H:[Child(==Super)]
V:|[Child]|

问题出在哪里:

其中一个子控制器是导航控制器,当导航控制器呈现模态视图控制器(使用presentViewController:animated:completion:)并关闭它(使用dismissViewControllerAnimated:completion:)时出现问题,在呈现/关闭导航控制器的框架后变为(x,y,0, 0),似乎自动布局变得无效,也许约束已被删除。

http://d.pr/i/VmvL目前/解雇流程

研究

我还没有使用代码来验证这些约束会发生什么,但是使用 Spark Inspector,我看到视图呈现在呈现/关闭过程中发生了变化。当我的导航控制器呈现模态视图控制器时,iOS 只是将整个导航控制器的视图交换到模态视图控制器的视图。当导航控制器的视图返回时,自动布局不再起作用。

可能的解决方案

我想出的解决方案之一是让我的容器控制器呈现模态控制器。

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

事实上,自从我开始使用自动布局以来,这种技术所导致的问题就占据了优势。除了这个问题,每次界面方向改变时,我的容器控制器内的视图就不能自动布局正确,似乎子视图总是在方向改变之前使用父视图的框架。我仔细检查了我设置的约束,没有冲突也没有歧义。

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

Xcode 环境

Xcode 5 beta, iOS 7SDK, target iOS6.1也许 SDK 环境有问题?

4

6 回答 6

36

我有一个类似的问题。我translatesAutoresizingMaskIntoConstraints = NO;在我的根 UIView 上进行设置。它似乎是“最外层”的 UIView - 层次结构根部的超级视图必须使用默认的translatesAutoresizingMaskIntoConstraints = YES. 一旦我删除了这个,一切都按预期工作。

于 2013-09-06T10:47:38.610 回答
12

这可能是由模棱两可的约束引起的。我建议暂停正在运行的应用程序并在控制台输入以下命令:

po [[UIWindow keyWindow] _autolayoutTrace] 
于 2013-09-30T20:45:36.487 回答
7

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

发生的情况是,全屏演示的整个层次结构替换了下面的所有内容UIWindow- 您的原始视图被删除(消除了约束)并替换了新的视图层次结构。然后,当您的评论被替换时,这些约束就会丢失。您需要在某个地方重新创建它们,viewWillAppear:或者只是确保您的根视图具有self.view.translatesAutoresizingMaskIntoConstraints = NO;

于 2015-07-20T10:23:37.460 回答
5

我也有同样的问题,当我尝试这个导航控制器时它工作正常,但现在的视图控制器不行。使用下面的视图控制器方法和 translatesAutoresizingMaskIntoConstraints 来解决这个问题。

-(void) viewWillLayoutSubviews
{
    [super viewWillLayoutSubviews];

    self.view.translatesAutoresizingMaskIntoConstraints = NO;
}

现在请让我知道您对此有任何顾虑。谢谢

于 2014-11-06T10:24:18.803 回答
0

我遇到了同样的问题,将搜索栏容器作为错误放置的元素(在 UIViewController 内,在 UITabBarController 内)。我见过的其他解决方案都没有奏效,但我最终设法通过在 viewWillAppear 中重新添加布局约束来解决它:

[self.view addConstraint:[NSLayoutConstraint constraintWithItem: self.searchBar.superview
                                                      attribute: NSLayoutAttributeTop
                                                      relatedBy: NSLayoutRelationEqual
                                                         toItem: self.view
                                                      attribute: NSLayoutAttributeTop
                                                     multiplier: 1
                                                       constant: 0]];
于 2014-06-09T22:33:15.823 回答
0

我在使用自动布局布局的表格视图单元格中遇到了类似的问题。从模态视图返回后,单元格的布局无效。我可以在 viewDidAppear 之后重新布局每个单元格,但它看起来很糟糕。感谢@palimondo 的建议,我开始四处寻找translatesAutoresizingMaskIntoConstraints。事实证明,我正在将我的表格视图单元格的内容视图设置为translatesAutoresizingMaskIntoConstraints = NO我不应该设置的时间。

于 2013-10-06T14:42:10.493 回答