我有一个包含三个子视图的视图 . 这些子视图应缩放以填充视图的整个宽度 .
我尝试过使用这个约束:
NSLayoutConstraint *leftConstraint = [NSLayoutConstraint constraintWithItem:smallView attribute:NSLayoutAttributeLeft relatedBy:NSLayoutRelationEqual toItem:containerView attribute:NSLayoutAttributeWidth multiplier:((1 / 3) * idx) constant:0.0];
这会导致异常:
[NSLayoutConstraint constraintWithItem:attribute:relatedBy:toItem:attribute:multiplier:constant:]:乘数0或零第二项与第一个属性的位置一起创建一个等于常量的位置的非法约束 . 位置属性必须成对指定'
我理解它在抱怨什么,但似乎令人困惑的是我无法得到这种行为 . 我希望我的第一个视图的x原点为0 .
有没有其他方法让这个工作?
3 回答
您无法将位置
NSLayoutAttributeLeft
等于宽度NSLayoutAttributeWidth
异常表示您使用的乘数为0.因为您将乘数参数设置为
((1 / 3) * idx)
,我猜idx
是int
类型 . 因此表达式((1 / 3) * idx)
的计算结果为0.如果要使用浮点乘数,可以通过将三个数中的任何一个更改为浮点类型来实现,例如((1 / 3.0) * idx)
.如果您只有3个子视图进行布局,则可视格式可能是一种更简单易读的应用方式 . 假设您希望缩放3个子视图以填充
containerView
,它们都具有相等的宽度 . 代码如下:更一般地说,您可能有超过3个子视图或必须在运行时决定它 . 对于这种情况,for循环可以帮助:
如果您的部署目标是iOS 9.0或更高版本,那么将三个子视图放入
UIStackView
可能会更简单 . 默认堆栈视图设置应该执行您想要的操作:水平布局三个视图,端到端,拉伸以填充堆栈视图的宽度,中间没有填充 .如您所知,您无法创建仅将坐标指定为常量的约束 . 相反,创建一个相对于某个“里程碑”的人 . 在这种情况下,由于您希望原点的x坐标为0,这意味着视图的左边缘将与其超视图的左边缘重合 . 因此,创建一个 Build 该关系的约束:
它必须与其他两个不同,尽管实现这种分裂的通常方法是:
superview.leading == view1.leading
view1.trailing == view2.leading
view2.trailing == view3.leading
view3.trailing == superview.trailing
view1.width == view2.width
view2.width == view3.width
(请注意,我使用的是前导和尾随而不是左右 . 这使得UI可以自动镜像从右到左的语言 . )