添加 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 的框架

UIView 中的自动布局 UILabel

Swift UIView 自动布局和约束

使用自动布局调整同级视图的大小时,使用子视图重新定位 UIView 不起作用

程序化自动布局更改 UIView 的行为

UIView 不遵守 UIScrollView 中的自动布局约束