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

时间:2013-02-18 12:01:43

标签: ios autolayout

最近已进入自动布局,我仍然坚持看似真正微不足道的问题的例子。我认为我想坐在屏幕的顶部,占据屏幕高度的一半。在自动布局之前很简单 - 只需将其固定到位并告诉它在superview调整大小时垂直扩展。

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

autolayout blues

底部空间约束设置为“等于284”,这对我来说是绝对的,对我来说绝对无用,因为它在屏幕底部保留了284个点空间,并且不再缩小视图是屏幕的一半大小。并且没有办法将该约束设置为等于任何其他视图高度的某个部分。

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

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

6 个答案:

答案 0 :(得分:172)

故事板解决方案,您可以在其中设置任意视图之间的确切比率:

Set height equality constraint

立即

Edit constraint's multiplier

<强> PROFIT !!!

Result

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

P.P.S。有时它可能有助于反转第一项和第二项&#34;约束或设置反向乘数(例如2而不是0.5)(但如果您不了解视图之间的相互关系,这些方法就无用了。)

答案 1 :(得分:156)

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

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

Demonstration of steps above

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

Demonstration of second step above

答案 2 :(得分: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];

}

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

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

答案 3 :(得分:8)

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

enter image description here

- 然后单击“大小”检查器。 - 然后双击约束。 enter image description here

- 确保&#34;身高&#34;已为两个项目选择。 enter image description here

- 然后更改&#34;乘数&#34;屏幕的一半到0.5,或者你想要的超级视图的任何一部分。 enter image description here

答案 4 :(得分:7)

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

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

答案 5 :(得分:0)

快速版的Mete的答案:

    override func viewDidLoad() {
    super.viewDidLoad()
    // Do any additional setup after loading the view, typically from a nib.



    upperView.translatesAutoresizingMaskIntoConstraints = false


    var constraint = NSLayoutConstraint(item: upperView,
                                        attribute: NSLayoutAttribute.top,
                                        relatedBy: NSLayoutRelation.equal,
                                        toItem: self.view,
                                        attribute: NSLayoutAttribute.top,
                                        multiplier: 1,
                                        constant: 0)

    self.view.addConstraint(constraint)


    constraint = NSLayoutConstraint(item: upperView,
                                    attribute: NSLayoutAttribute.height,
                                    relatedBy: NSLayoutRelation.equal,
                                    toItem: self.view,
                                    attribute: NSLayoutAttribute.height,
                                    multiplier: 0.5,
                                    constant: 0)

    self.view.addConstraint(constraint)


    constraint = NSLayoutConstraint(item: upperView,
                                    attribute: NSLayoutAttribute.leading,
                                    relatedBy: NSLayoutRelation.equal,
                                    toItem: self.view,
                                    attribute: NSLayoutAttribute.leading,
                                    multiplier: 1,
                                    constant: 0)

    self.view.addConstraint(constraint)


    constraint = NSLayoutConstraint(item: upperView,
                                    attribute: NSLayoutAttribute.trailing,
                                    relatedBy: NSLayoutRelation.equal,
                                    toItem: self.view,
                                    attribute: NSLayoutAttribute.trailing,
                                    multiplier: 1,
                                    constant: 0)

    self.view.addConstraint(constraint)


}