autolayout - 使视图的高度相对于半视图高度的一半

Met*_*ete 132 ios autolayout

最近我一直在进行自动布局,而我却陷入了一个看起来非常微不足道的问题的例子.我认为我想坐在屏幕的顶部,占据屏幕高度的一半.在自动布局之前很简单 - 只需将其固定到位并告诉它在superview调整大小时垂直扩展.

现在,我不能为我的生活看到如何做到这一点.这是我尝试设置时得到的结果:

自动布局蓝调

底部空间约束被设置为"等于284",当我改为iPhone4布局时,这对我来说绝对无用,因为它在屏幕底部保留284个点空间,并且缩小视图不再是屏幕大小.并且没有办法将该约束设置为等于任何其他视图高度的某个部分.

经过一段时间的挣扎之后,我能想到的唯一方法是在这个视图下方引入另一个视图,将它们的高度平均固定,让它们相互坐在上下,然后将第二个(底部)视图设置为不可见..这看起来有点难看!

我错过了一些明显的东西吗?

Fyo*_*yok 177

Storyboard解决方案,您可以在其中设置任何视图之间的精确比例

设置高度相等约束

现在:

编辑约束的乘数

利润!!!

结果

PS另请注意,此方法适用于不同嵌套级别的视图,并且(显然)适用于宽度

PPS有时可能有助于"反转约束的第一项和第二项"或设置反向乘数(例如2而不是0.5)(但如果您不了解视图之间的相互关系,则这些方法没有用).

  • 更新:显然,界面构建器不允许内容视图成为任何自动布局约束的显式目标。我必须插入一个虚拟的子视图作为内容视图的子视图,以完成此工作。 (2认同)

Fir*_*iro 162

现在可以在[至少] Xcode 5.1.1中的IB中实现.虽然我花了一些时间才发现它实际上非常简单:

首先创建一个基本的顶部对齐约束(您还需要设置底部,左侧和右侧约束,就像正常一样).然后选择约束并导航到属性检查器:

演示上面的步骤

然后你可以调整乘数.如果你想要50%的超级视图,请将其保留1,因为它按照超级中心对齐.这也是创建其他百分比视图的好方法(如超视图的25%)

演示上面的第二步

  • 我有点困惑.我试过这个,但它只是将视图置于超视图的中心,它不会调整视图的高度. (3认同)

Met*_*ete 30

经过一段时间后,我想出了以下内容.

我注意到它是一个答案,但它不是很令人满意,因为它假设你不能在Interface Builder中实际执行此操作,但正确的约束可以在代码中添加,如下:

- (void) viewWillAppear:(BOOL)animated
{

    NSLayoutConstraint *constraint = [NSLayoutConstraint constraintWithItem:upperview
                                                                 attribute:NSLayoutAttributeHeight 
                                                                 relatedBy:0 
                                                                    toItem:self.view
                                                                 attribute:NSLayoutAttributeHeight
                                                                multiplier:.5 
                                                                  constant:0];
    [self.view addConstraint:constraint];

}
Run Code Online (Sandbox Code Playgroud)

基本上,它设置了一个乘以0.5的乘数与self.view的高度,作用于上层视图.我不得不将IB中底部垂直空间约束的优先级设置为低于1000,以避免一堆关于破坏约束的运行时消息.

所以,如果任何人都可以在Interface Builder中展示如何做到这一点,那么这将更好地回答我的问题,否则我想这是好的(现在)???

  • 我认为这和现在一样好.如果Apple允许我们访问IB中的乘数值,那将是很好的,因此可以设置和常量一样. (3认同)
  • 对于任何查看此答案的人,Xcode 5.1现在允许您通过Interface Builder设置乘数.我现在能够通过IB配置超级视图高度的一半的视图. (3认同)

小智 8

比Fyodor Volchyok的答案稍微容易一点,比方法更直接. - 按住控制按钮并单击子视图. - 按住命令按钮,将光标拖动到超级视图,然后单击超级视图. - 选择"宽高比".

在此输入图像描述

- 然后单击"大小"检查器. - 然后双击约束. 在此输入图像描述

- 确保为两个项目选择"高度". 在此输入图像描述

- 然后将"倍增器"更改为0.5,用于屏幕的一半,或者您想要的超级视图的任何部分. 在此输入图像描述


bra*_*ray 7

在代码中我还有另一种可能性,如果你有2个视图都应该具有相同的高度:只需将view2的高度设置为view1的高度(这里的技巧不是明确地设置view1的高度).

    [self.view addConstraints:[NSLayoutConstraint
        constraintsWithVisualFormat:@"V:[topLayoutGuide]-0-[_view1]-0-[_view2(==_view1)]-0-[bottomLayoutGuide]"
                            options:0
                            metrics:nil
                              views:viewsDict]];
Run Code Online (Sandbox Code Playgroud)