【问题标题】:add a UIView and recalculate constraints with autolayout添加 UIView 并使用自动布局重新计算约束
【发布时间】:2015-05-07 06:33:36
【问题描述】:

我需要你的帮助才能做到这一点:

我有一个宽度等于屏幕宽度的视图。在这个视图中,我有 2 个子视图,宽度为父视图的 1/2,纵横比为 1:1,因此父视图的高度应等于子视图的高度。

之后我需要执行动画,它应该向父视图添加另一个视图并像这样转换整个屏幕:

我应该以编程方式使用自动布局来实现这一点吗?如何更容易地获得这种行为?

【问题讨论】:

    标签: ios objective-c uiview autolayout


    【解决方案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。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-06-05
        • 2017-12-24
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-01-14
        相关资源
        最近更新 更多