我遇到乘数问题,无法理解此功能的工作原理。例如,我有视图有6:1乘数(To SuperView.Leading),如下所示。
我的问题是6:1的关系,6和1是什么意思。并且在2:1的关系中,2和1的意思是什么。类似的考虑你有三个视图,如下图所示。子视图和superView之间总共有4个空白区域。我怎么说每个空白区域必须是SuperView.Width / 6(并且每个空白宽度必须相等)
提前致谢。
答案 0 :(得分:8)
使用自动布局时,尤其是在使用比例布局时,必须使用乘数。
我必须在这里解释一些数学。 我们知道直线方程。
Y = Mx + C
在上面的等式中。假设M是你的乘数,C是你的常数。
因此假设你有超级视图(如果是iphone 6s plus) 414(宽)x 736(高)尺寸。在该视图中假设您创建了子视图。
现在,如果您希望子视图大小超出superview大小的一半,则只需将两个约束从子视图拖到superview。 (即等宽和等高)
见图片
显然现在你会收到错误。就像我得到的一样。 (见下图)
现在逐个点击两个约束,并使用乘数为0.5。然后使用上面的直线方程。 这里0.5表示你想要subview = superviewWidth / 2.0的宽度,即212 px。
换句话说,你也可以提供乘数212:414。
Y即subviewWidth =((M即0.5)*(x即414,即superviewWidth))+(常数,即零)
最后你得到subviewWidth = 212 px
同样适用于子视图的高度。提供乘数0.5或368:736。
完成所有操作后,请不要忘记点击子视图并更新相框。
这样常数和乘数就可以了。
答案 1 :(得分:3)
答案 2 :(得分:3)
乘数用于创建比例约束。自动布局计算第一项的属性为second item’s attribute and this multiplier
的乘积。除1以外的任何值都会创建比例约束。
在你的情况下,6:1表示乘数是6/1 = 6.这意味着
view.leading = Superview.leadingMargin*6
将:
替换为/
- 您将了解其含义。
答案 3 :(得分:2)
当谈到乘数时,它取决于你正在处理的约束。您具有连接到superview前导边距的视图前导约束。当常数为0时,会给出8点的差距。当您更改乘数时,您将影响该差距。这就是为什么当你做2:1时你会看到它正确的8点。基本上将原来的8点差距乘以2.如果你做1:2它将从8点变为4点,基本上将原来的8点差距除以2。
现在,当你看看阿德里安斯的例子时,他只将它乘以1:2,那么它是如何使它成为整个屏幕的一半?那是因为他在高度限制上做到了这一点。视图最初是超视图的全尺寸,但当他将它乘以1:2时,他表示他希望它是原始高度的1/2。给你最终结果。
因此,重要的是要理解乘数可能会因情况而异,但这取决于您正在处理的约束。
这里有一个很好的答案: Understanding multiplier in auto layout to use relative positioning
该链接详细说明了如果您想要使前缘10%和后缘90%,您需要设置相对于后缘的两个约束。
将尾随约束乘以0.9,将前导约束乘以0.1。
关于有关同等分离视图的问题,您应该使用堆栈视图。它们是为这种情况而制作的,所以你不必处理所有的限制。您只需要为堆栈视图设置约束并相应地进行配置。