背景:
我有一个自定义容器控制器,它就像 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 环境有问题?