AutoLayout 理解乘数

Posted

技术标签:

【中文标题】AutoLayout 理解乘数【英文标题】:AutoLayout Understanding Multiplier 【发布时间】:2016-12-19 06:34:27 【问题描述】:

我对乘数有疑问,无法理解此功能的工作原理。例如,我的视图有 6:1 乘数(到 SuperView.Leading),如下所示。

当我将乘数更改为 2:1 时,如下图所示。

我的问题是在 6:1 关系中 6 和 1 是什么意思。在 2:1 关系中,2 和 1 是什么意思。类似的考虑你有如下图所示的三个视图。 subViews 和 superView 之间总共有 4 个空白区域。我怎么能说每个空白区域都必须是 SuperView.Width / 6 (并且每个空白宽度必须相等)

提前致谢。

【问题讨论】:

为了更好地理解直接使用 0.5 而不是 1:2 如果你检查苹果文档,自动布局属性的每一个细节......你需要先检查一下 【参考方案1】:

在使用自动布局时,尤其是在使用比例布局时,您必须使用乘数。

我必须在这里解释一些数学。 我们知道直线方程。

Y = Mx + C

在上面的等式中。假设 M 是您的乘数,C 是您的常数。

因此假设你有 superview(在 iphone 6s plus 的情况下) 414(宽)x 736(高)尺寸。假设您在该视图上创建了子视图。

现在,如果您希望子视图大小正好是父视图大小的一半,那么只需将两个约束从子视图拖到父视图。 (即等宽等高)

看这张图片

显然现在你会得到一个错误。就像我得到的一样。 (见下图)

现在一个一个地点击这两个约束,并使用乘数为 0.5。然后使用上面的直线方程。 这里 0.5 表示您想要子视图的宽度 = superviewWidth / 2.0 即 207 像素。

换句话说,您也可以提供乘数为 207:414。

Y 即 subviewWidth = ((M i.e. 0.5) * (x i.e. 414 i.e. superviewWidth)) + (Constant i.e. 0)

最后你得到 subviewWidth = 207 px

子视图的高度也类似。提供乘数 0.5 或 368:736。

完成所有操作后,别忘了点击子视图并更新框架。

这样常量和乘数就可以工作了。

【讨论】:

非常感谢!一个小注:0.5 * 414 = 207 :)【参考方案2】:

乘数用于创建比例约束。自动布局计算第一个项目的属性为second item’s attribute and this multiplier 的乘积。 1 以外的任何值都会创建比例约束。

在您的情况下,6:1 意味着乘数是 6/1 = 6。这意味着

view.leading  = Superview.leadingMargin*6

: 替换为/ - 你会明白它的意思。

【讨论】:

【参考方案3】:

在我的示例中,乘数是 1:2 = 0.5

红色视图的高度是父视图的 0.5 倍

【讨论】:

【参考方案4】:

当涉及到乘数时,它取决于您要处理的约束。您将视图前导约束连接到超级视图前导边距。当常数为 0 时,您会出现 8 分的差距。当您更改乘数时,您将影响该差距。这就是为什么当您进行 2:1 时,您会看到它向右移动了 8 分。本质上是将原来的 8 点差距乘以 2。如果你做 1:2,它将从 8 点变为 4 点,基本上将原来的 8 点边距除以 2。

现在,当您查看 Adrians 的示例时,他只将其乘以 1:2,那么它是如何使其占据整个屏幕的一半呢?那是因为他在高度限制上这样做了。 view原本是superview的全尺寸,但是当他乘以1:2时,他表示他希望它是原来高度的1/2。给你最终的结果。

所以要理解的重要一点是,乘数可能会根据情况而有所不同,但那是因为它取决于您要处理的约束。

这里有一个很好的答案,可以深入了解: Understanding multiplier in auto layout to use relative positioning

该链接详细说明了如果您想使前沿 10% 和后沿 90%,您需要设置与后沿相关的两个约束。

将尾随约束乘以 0.9,将前导约束乘以 0.1。

关于您关于等分视图的问题,您应该使用堆栈视图。它们是为这种情况而设计的,因此您不必处理所有限制。您只需要为堆栈视图设置约束并相应地配置它。

【讨论】:

以上是关于AutoLayout 理解乘数的主要内容,如果未能解决你的问题,请参考以下文章

AutoLayout

自动布局AutoLayout

如何优雅的代码编写 AutoLayout

storyBoard方式ScrollView的AutoLayout

Storyboardxib中的UIScrollView使用autolayout,使其能够滚动

storyBoard方式ScrollView的AutoLayout