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

时间:2016-07-18 17:29:58

标签: ios autolayout nslayoutconstraint

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

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感谢您的链接。没有拍摄信使,但Apple的声明并不完全与Interface Builder让我这么做。我已经使用以下方法来定位一个按钮3/4,在容器视图中具有30像素偏差:

enter image description here

我还没有尝试过那里的乘数0,但0.75也不是一个身份值。它运作良好一段时间。

澄清2

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

enter image description here

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

我当然可以制作一个“布局”视图来实现layoutSubviews()并在那里完成所有这些比例布局,但我试图使用手头的机器,所以它会更具说明性。我在UICollectionView中做了很多这样的事情,而当我选择“只使用draw()绘制所有内容”时的表现令人失望。

1 个答案:

答案 0 :(得分:1)

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

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

enter image description here

黑色边框矩形是超视图,条形图根据您的图表定位,与超视图的宽度相关。

这是如何实现的?蓝色条和红色条的左侧有隐形间隔视图,通过宽度提供超视图左侧的空间。因此,蓝色和红色条的水平布局来自四个宽度约束(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
相关问题