自动布局 – 使视angular相对于超级景观高度的一半

最近已经进入了自动布局,我被卡在似乎是一个非常微不足道的问题的例子。 我有一个观点,我想坐在屏幕的顶部,占据屏幕高度的一半。 在自动布局之前简单 – 只需将其粘贴到位,并在超级视图resize时告诉它垂直展开。

现在,我不能为我的生活看到如何去做。 以下是我尝试设置的内容:

自动布局布鲁斯

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

经过一段时间的努力之后,我能想到的唯一方法就是在这个视图的下面引入另一个视图,同样地固定它们的高度,让它们坐在上面和下面,然后将第二个(底部)视图设置为不可见..这似乎有点难看!

我错过了什么明显的?

现在可以在IB中使用Xcode 5.1.1。 虽然我花了一段时间才弄清楚它实际上是非常简单的:

首先创build一个基本的顶部alignment约束(您也需要设置底部,左侧和右侧的约束,像正常一样)。 然后select约束并导航到“ 属性”检查器:

演示上面的步骤

然后你可以调整乘数。 如果你想让超级视图的50%保持为1 ,因为它是按照超级中心alignment的。 这也是创build其他百分比视图的好方法(比如25%的超视图)

上面的第二步演示

故事板解决scheme,您可以在任何视图之间设置精确比例:

设置高度平等约束

现在:

编辑约束的乘数

利润!!!

结果

PS还要注意,这种方法适用于不同嵌套层次的视图,(显然)适用于宽度

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

多花一点时间,我想出了以下几点。

我把它当作答案来注意,但是它不是很令人满意,因为它假定你不能在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]; } 

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

所以如果任何人都可以展示如何在界面生成器中做到这一点,那么最好能回答我的问题,否则我想这是一样好(现在)?

如果你有两个视图应该有相同的高度,那么我还有另外一种可能性:只要将view2的高度设置为view1的高度(这里的技巧并不是明确地设置view1的高度)。

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

比方法比Fyodor Volchyok的答案稍微容易和更直接。 – 按住控制button并点击子视图。 – 只需按住命令button,将光标拖到超级视图,然后单击超级视图。 – select“长宽比”。

在这里输入图像说明

– 然后单击大小检查器。 然后双击约束。 在这里输入图像说明

– 确保为这两个项目select了“高度”。 在这里输入图像说明

然后,将“乘数”更改为0.5,用于屏幕的一半,或者您希望的超视图的任何分数。 在这里输入图像说明

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) }