我有一个UIViewController
,我作为一个孩子将其添加到另一个UIViewController
。添加子项时,父项使用childVC.frame = ....
在我的孩子上设置框架,但这会影响我的约束。
我可以轻松地在IB中复制此问题。创建一个UIViewController
,将大小更改为“自由格式”并抛弃状态栏(只是看起来直观)。添加UIButton
(或任何)和约束,使它们的大小相同(见下图)
现在更改视图控制器中顶级视图的大小,并观察会发生什么。
它改变了我对我的限制。我希望我的按钮变大,仍然保持原始约束。如果您在屏幕上的iPhone视网膜3.5 / 4.0之间切换或从横向更改为纵向,则会自动发生。但是,当我调整视图大小时,为什么不呢?这样做会让王室痛苦地以自由形式进行布局并测试不同尺寸。
更重要的是......当我为VC添加子代码时,在代码中设置frame
时,为什么会发生完全相同的事情?如何防止它?
答案 0 :(得分:1)
基于帧的计算和自动布局不兼容。或者至少,它们意味着暴风雨的水域。这就是你遇到问题的原因。切换到自动布局后,您必须接受不再直接操纵frame
。
所以,你不能做childVC.frame = whatever
。
相反,您现在必须使用自动布局来更新childVC.frame
的大小。通过在IB中创建IBOutlet
(childVC
的宽度约束来做到这一点。同样,创建另一个IBOutlet
高度约束childVC
。
在视图控制器中,更新constant
值以更改大小。
myWidthConstraint.constant = 123.f;
执行此操作的位置在控制器的updateViewConstraints
方法中,或者在视图的情况下,updateConstraints
。
也就是说,最好设置自动布局,这样您就不需要任何程序更新。正确定义后,它将知道如何处理视图边界变化的事情。说实话,如果你想做一些更不寻常的事情,只需要以编程方式更新大小。
我可以说你更好吗