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 理解乘数的主要内容,如果未能解决你的问题,请参考以下文章
storyBoard方式ScrollView的AutoLayout