iOS 自动布局:为什么不允许零乘数?

iOS auto layout: why is zero multiplier not allowed?

我正在为动态创建的视图的约束计算一些乘数。有时它为零。发生这种情况时,我会收到以下未处理的异常:

A multiplier of 0 or a nil second item together with a location for the first attribute creates an illegal constraint of a location equal to a constant. Location attributes must be specified in pairs

来自此代码:

NSLayoutConstraint(item: spanView,
    attribute: .leading,
    relatedBy: .equal,
    toItem: self.miniOnOffView,
    attribute: .trailing,
    multiplier: m1,
    constant: 0.0).isActive = true

其中m1 = 0,spanView已经添加为self.miniOnOffView的子视图。

基本上,给定一个介于 0 和 1 之间的小数,我正在尝试指定子视图前导部分的小数位置。我不明白的是为什么这是一个错误。为什么零是非法值?

有更好的解决办法吗?我基本上有子视图,我想相对于父视图将左右部分定位,两者都在宽度的 0 到 1 之间。

澄清 1

@Pärserk 感谢 link。不是射击信使,而是 Apple 的声明并不完全符合 Interface Builder 让我做的事情。我使用以下方法将按钮 3/4 放置在容器视图中,偏移量为 30 像素:

我还没有(还)尝试过 0 作为乘数,但 0.75 也不是一个标识值。它工作了一段时间。

澄清 2

@matt,这是我正在尝试做的一个例子:

基本上,我有日历日视图。我试图根据它们在一天内的小数位置来定位红色和蓝色时间条(绿色注释显示近似值)。

我当然可以制作一个实现 layoutSubviews() 的 "layout" 视图,并在那里进行所有比例布局,但我试图使用手头的机器,这样它会更具声明性正面。我在 UICollectionView 中做了很多这样的事情,当我使用 "just draw it all myself using draw()" 时的表现令人失望。

我不清楚你想要什么,但你不能在 constraints 之间创建宽度关系,只能在 views 之间创建宽度关系。因此,如果您正在做我认为您想做的事情,您将需要创建一个不可见的 "spacer" 视图,该视图具有所需的宽度和位置以生成 space,并将您的可见子视图固定到该视图.

编辑 是的,既然你已经展示了更多你想要的东西,我的回答是正确的。这是我的渲染:

黑色边框的矩形是父视图,条形图根据您的图表相对于父视图的宽度定位。

这是如何实现的?在蓝色条和红色条的左侧有不可见的 spacer 视图,通过它们的宽度提供从父视图左侧开始的 space 。因此,蓝色和红色条的水平布局来自四个宽度约束(sup 是父视图):

spacerView1.widthAnchor.constraintEqualToAnchor(sup.widthAnchor, multiplier: 0.1).active = true
spacerView2.widthAnchor.constraintEqualToAnchor(sup.widthAnchor, multiplier: 0.25).active = true
blueView.widthAnchor.constraintEqualToAnchor(sup.widthAnchor, multiplier: 0.6-0.1).active = true
redView.widthAnchor.constraintEqualToAnchor(sup.widthAnchor, multiplier: 0.9-0.25).active = true