了解自动布局中的乘数以使用相对定位

我想了解如何利用自动布局来将项目相对于其他视图的百分比定位。

例如,我最近得知,你可以指定一个视图的底部应该比它的超级视图底部高4%,使用这个:

self.view.addConstraint(NSLayoutConstraint(item: label, attribute: .Bottom, relatedBy: .Equal, toItem: self.view, attribute: .Bottom, multiplier: 0.96, constant: 0)) 

这对我来说是有道理的,因为乘数1会在视图的底部alignment,所以通过将乘数改为0.96,可以减less4%。

但是你怎么能在另一个方向做同样的事情呢? 你想指定一个标签的顶部应该从超级视图的顶部开始4%。 如果使用同一行,但将属性更改为.Top ,则意味着它会比superview的顶部高4%(但实际上并不会将其移出屏幕)。 你不能有一个负面的乘数,我不认为,我不相信一个值大于1会做任何事情,当常数是0.那么你怎么得到的设置?

我有同样的问题执行前导和尾随。 拖尾很容易。 如果你想从右边10%

 self.view.addConstraint(NSLayoutConstraint(item: label, attribute: .Trailing, relatedBy: .Equal, toItem: self.view, attribute: .Trailing, multiplier: 0.9, constant: 0)) 

这是有道理的,因为你拨回0.1或10%,而不是完全alignment在1.0。 但是你如何领导呢? 我以为你可能能够设置标签的领先相对于视图的尾随,然后设置乘数为0.1。 在我看来,这意味着标签将从最右边开始,然后被拨回90%,因此从左边获得所需的10%。 但事实并非如此,我不知道为什么。

你能解释这是如何工作,如何正确使用乘数来获得这些相对布局?

为了简单起见,假设您想要创build一个标签,该标签具有顶部和底部10%的超级视图的高度,尾部和超过视图宽度的10%。 在纵向的iPhone上,标签的上方和下方都会有更多的填充,比左边和右边的填充还要多(像是按比例绘制):
在这里输入图像说明

但是,让我们说在iPad上,这将是一个完美的广场视图。 因此填充将是相同的数量,如下所示:
在这里输入图像说明

问题是如何定义这种约束是dynamic的,而不是为常量设置一个固定的值。 我已经知道如何做底线和尾随,但顶尖和领导让我难住。 我希望能够理解如何使用乘数来进行更高级的布局,例如,指定一个标签的顶部应该位于另一个标签底部的10%处,而不是将其设置为固定的常数。

有几个方法可以做到这一点。 在最简单的情况下,你已经几乎得到了它:如果你想水平边界为10%和90%,那么你需要指定两个约束相对于超视图的后沿 – 所以Subview.Trailinglocking到Superview.Trailing的倍数为0.9 ,正如你所说的,但是那么Subview.Leading也locking到Superview.Trailing ,只是乘以0.1

在这里输入图像说明

(和顶部/底部类似)

另一方面,最后提到的情况要复杂一点:“指定一个标签的顶部应该位于另一个标签的底部10%”。 为此,您可能无法像前一种情况那样使用固定的百分比插入。 相反,您可以在它们之间创build一个不可见的间隔视图:使用Spacer.Height = 0.1 * Superview.Height添加约束,然后将其添加到两个标签之间。 (您也可以使用这些间隔视图处理以前的情况,但是对于这种情况,这并不是真的有必要。)

在我看来,“你不能有一个负面的乘数,我不认为,并且我不相信一个值大于1,当常数为0时会做任何事情”暴露了你的理解偏差。

引擎盖下面的规则只是一个线性方程:

 FirstItem.Attribute1 = (SecondItem.Attribute2 * Multiplier) + Constant 

所有的测量点。 如你所见,乘数(NSLayoutConstraint的一个属性)不是常量的乘数。 按照等式,你不明白的事情就会清楚。

至于你的具体例子,@Archaeopterasa提出了一个很好的解决scheme,另一个如下所示:

基于你知道如何做底和尾的事实,我想你已经做了这两件事。 然后再添加两个约束,效果将是你想要的: 将标签的宽度设置为80%超视图的宽度将标签的高度设置为超视图高度的80%

最后,如果你想要在另一个标签底部10%的地方指定一个标签的顶部谎言,看来你不能在没有写一行代码的情况下实现它。 在运行时已知superview的高度后,必须使用代码设置连接FirstItem和SecondItem的NSLayoutConstraint对象的常量。

首先,控制从一个标签拖动到另一个标签,select“垂直间距”(或者你可以用其他方法做到这一点)

其次,需要引用sockets:

 @IBOutlet weak var tenPercentOfSuperview: NSLayoutConstraint! 

然后,在适当的地方做这个(例如,在viewDidLoad())

 let heightOfSuperview = self.view.bounds.height tenPercentOfSuperview.constant = heightOfSuperview * 0.1 

一切都好了。

如果您想了解更多关于此主题的信息,build议您使用Apple的文档: https : //developer.apple.com/library/ios/recipes/xcode_help-IB_auto_layout/chapters/EditingConstraintAttributesintAttributesInspector.html

这是

非常简单

方法来做到这一点。

只需添加“帮手”或“措施”的意见:

示例中的“计算助手”视图是黄色的。

一般的技术是如此简单明了 – 不需要任何解释,你可以从图像中得到它。

它是iOS中“他们不会教你的东西”中的“大象之一”。 但它在所有的布局中都被不断使用。

(事实上​​,苹果公司应该为此而制定一个特殊的UIView子类“措施” – 实际上,许多大型团队都这样做,具有明显的特点。)

在这里输入图像说明

注意图标#1居中在“视图1/4”辅助视图的右端。

注意图标#3居中在“视图3/4”辅助视图的左端。

你完成了,有一个霞多丽。

方便的是,在助手的意见,只要设置乘数为你想要的任何东西,取决于想要的感觉。 这是非常容易,然后改变你的代码,使用IBInspectable, animation ,等等…

在这里输入图像说明