Ios 为什么UIStackView不堆叠UILabel arrangedSubview?

Ios 为什么UIStackView不堆叠UILabel arrangedSubview?,ios,uilabel,uistackview,Ios,Uilabel,Uistackview,我有一个UIStackView,作为排列的子视图,我有两个UIView和一个UILabel。UIView一个接一个地堆叠,而UILabel与子视图的前缘对齐 代码: 输出: 尝试将分发更改为填充 stack.distribution = .fill 具有多行集 评论之后 为了清楚起见 首先,不要按比例使用.fill。不管你怎么想,那都是错的。您已明确将两个“图标”分别设置为42点宽。如果堆栈视图按比例使用.filly,它将尝试更改这些视图的宽度,您将获得自动布局冲突 其次,具有.number

我有一个UIStackView,作为排列的子视图,我有两个UIView和一个UILabel。UIView一个接一个地堆叠,而UILabel与子视图的前缘对齐

代码:

输出:

尝试将
分发
更改为
填充

stack.distribution = .fill
具有多行集

评论之后

为了清楚起见

首先,不要按比例使用
.fill
。不管你怎么想,那都是错的。您已明确将两个“图标”分别设置为42点宽。如果堆栈视图按比例使用
.filly
,它将尝试更改这些视图的宽度,您将获得自动布局冲突

其次,具有
.numberOfLines=0
ui标签必须具有宽度。否则,就没有办法知道在哪里中断文本。。。如果有大量文本,它将从视图的侧面延伸出去

第三,行
label.sizeToFit()
在这里无法实现任何功能。删除它就行了

如果添加此行:

stack.widthAnchor.constraint(equalToConstant: 200.0).isActive = true
然后堆栈视图将扩展到200 pts宽

自动布局将使第一个排列视图的宽度为42(因为这是您声明的宽度),第二个视图的宽度相同。由于已将间距设置为
7
,因此将计算

42 + 7 + 42 + 7
这等于
98
。它从堆栈视图的宽度中减去:

200 - 98 = 102
这是标签的宽度

结果:


如果您不想显式地将宽度设置为
200
,可以将其设置为superview宽度的百分比,或者为其设置前导和尾随约束。

这样就可以将其放入堆栈(yay),但它不考虑uilabel的固有大小,即它会将其压缩,使其与其他两个UIView的宽度相同,并使文本在几乎每个单词之后断开。要使其拉伸注释、行或为其指定宽度,多行标签没有固有宽度(当然,它有,但不是以您尝试使用它的方式)。您必须以某种方式给它一个宽度,通过约束或约束其容器的宽度——在本例中是堆栈视图的宽度。
200 - 98 = 102