我正在为动态创建的视图的约束计算一些乘数。有时它是零。当发生这种情况时,我得到以下未处理的异常:
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像素偏差:
我还没有尝试过那里的乘数0,但0.75也不是一个身份值。它运作良好一段时间。
澄清2
@matt,这是我正在尝试做的一个例子:
基本上,我有一个日历日视图。我正在尝试根据当天的分数位置来定位红色和蓝色时间条(绿色注释显示近似值)。
我当然可以制作一个“布局”视图来实现layoutSubviews()
并在那里完成所有这些比例布局,但我试图使用手头的机器,所以它会更具说明性。我在UICollectionView中做了很多这样的事情,而当我选择“只使用draw()绘制所有内容”时的表现令人失望。
答案 0 :(得分:1)
我不清楚你想要什么,但你不能在约束之间创建一个宽度关系,只能在 views 之间创建。因此,如果你正在做我认为你想做的事情,你将需要创建一个看不见的" spacer"具有所需宽度和位置的视图以生成空间,并将可见的子视图固定到该视图。
编辑是的,既然您已经展示了更多您想要的内容,我的回答是正确的。这是我的渲染:
黑色边框矩形是超视图,条形图根据您的图表定位,与超视图的宽度相关。
这是如何实现的?蓝色条和红色条的左侧有隐形间隔视图,通过宽度提供超视图左侧的空间。因此,蓝色和红色条的水平布局来自四个宽度约束(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