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

Mic*_*Hui 31 modalviewcontroller ios autolayout ios7

背景:

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

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

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,目标iOS6.1也许SDK环境不对劲

Pal*_*ndo 33

我遇到了类似的问题.我正在设置translatesAutoresizingMaskIntoConstraints = NO;我的根UIView.它似乎是"最外层的"UIView - 层次结构根目录下的超级视图必须使用默认值translatesAutoresizingMaskIntoConstraints = YES.一旦我删除了它,一切都按预期工作.

  • 我有类似的问题,当我解除viewcontroller时,tableView向下滑动64像素.我通过添加self.view.translatesAutoresizingMaskIntoConstraints = YES尝试了你的技巧(也试过没有),但仍然没有工作.输出没有变化.仍然存在问题.你有什么进一步的建议吗? (3认同)

Tom*_*art 12

这可能是由于模棱两可的限制造成的.我建议暂停正在运行的应用程序并输入以下命令来控制:

po [[UIWindow keyWindow] _autolayoutTrace] 
Run Code Online (Sandbox Code Playgroud)


Rob*_*sey 6

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

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

  • 优秀的解释! (2认同)

cha*_*dan 5

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

-(void) viewWillLayoutSubviews
{
    [super viewWillLayoutSubviews];

    self.view.translatesAutoresizingMaskIntoConstraints = NO;
}
Run Code Online (Sandbox Code Playgroud)

现在请让我知道您对此有任何担忧。谢谢