添加 UIView 并使用自动布局重新计算约束
Posted
技术标签:
【中文标题】添加 UIView 并使用自动布局重新计算约束【英文标题】:add a UIView and recalculate constraints with autolayout 【发布时间】:2015-05-07 06:33:36 【问题描述】:我需要你的帮助才能做到这一点:
我有一个宽度等于屏幕宽度的视图。在这个视图中,我有 2 个子视图,宽度为父视图的 1/2,纵横比为 1:1,因此父视图的高度应等于子视图的高度。
之后我需要执行动画,它应该向父视图添加另一个视图并像这样转换整个屏幕:
我应该以编程方式使用自动布局来实现这一点吗?如何更容易地获得这种行为?
【问题讨论】:
【参考方案1】:你可以……
首先,我不会让它们成为父视图的一半,而是:
将左视图的左边框设置为父视图的左边框。 将右视图的右边框设置为父视图的右边框。 设置左右视图之间的水平间距 = 0。 在左右视图之间设置等宽约束。那么当你添加新视图时,
删除右视图的右边框约束。 将新视图的右边框设置为父视图的右边框。 设置右视图和新视图之间的水平间距 = 0。 在右视图和新视图之间设置等宽约束。然后调用
[UIView animateWithDuration:0.5 animations:^
[view layoutIfNeeded];
];
请注意,如果默认只有两个视图,您可以通过情节提要添加第一组约束(这比以编程方式进行更容易)。其余部分您可以通过编程方式完成:See Apple documentation。
就我个人而言,我喜欢这种方法,因为您不必对视图的大小或位置进行任何数学运算 - 自动布局会为您计算出来。
【讨论】:
【参考方案2】:最简单的方法是。
在设计时(故事板)在父视图中添加 3 个视图。 为所有子视图(视图 1,2 和 3)创建宽度约束并为其创建出口。完成所有视图的设计后,将第三个视图的宽度约束设置为 0。为视图控制器实现“viewDidLayoutSubviews”方法,如下所示。
- (void)viewDidLayoutSubviews
[super viewDidLayoutSubviews];
在这个方法中,找到当前父视图的宽度,并将其存储在一个变量“X”中。
第一次加载视图时,将第一个和第二个视图的宽度约束常量设置为 x/2。
当第三个视图准备好显示时,将动画块内所有三个视图的宽度约束常量设置为 x/3。
【讨论】:
以上是关于添加 UIView 并使用自动布局重新计算约束的主要内容,如果未能解决你的问题,请参考以下文章
在 Swift 运行时更改自动布局约束的 UIView 的框架