UILabel 在嵌套的 UIStackViews 中被截断?
Posted
技术标签:
【中文标题】UILabel 在嵌套的 UIStackViews 中被截断?【英文标题】:UILabels truncated in nested UIStackViews? 【发布时间】:2016-06-27 18:20:11 【问题描述】:我正在尝试调整两个垂直 UIStackView
s 的大小,以便它们以我想要的方式显示内容。两个垂直的UIStackViews
位于另一个水平的UIStackView
内,后者位于UITableViewCell
内。每个垂直UIStackView
中有三个UILabel
。这是我当前的视图层次结构:
图像视图的宽度和高度被限制为相等的比例。水平堆栈视图的对齐方式为.Center
,分布为.Fill
。垂直堆栈视图 1 具有.Leading
的对齐和.EqualSpacing
的分布。垂直堆栈视图 2 具有.Trailing
的对齐和.EqualSpacing
的分布。所有标签只有一行,堆栈视图 2 中的内容是可选的——如果我不必在 tableView:cellForRowAtIndexPath:
的堆栈视图 2 中显示任何内容,我将 text
属性设置为 nil
。
我一直在尝试让堆栈视图 2 中的标签正确显示文本而不会被截断。可以截断垂直堆栈视图 1 中的文本,但堆栈视图 1 似乎喜欢调整自身大小以占据大部分宽度。更奇怪的是,这并不总是发生。 当垂直堆栈视图 1 中的标签非常短时,这种情况似乎更常见。 垂直视图 2 似乎也已调整大小,使其仅与最后一个标签一样宽,这通常是三个标签中最短的。
这是我尝试过但没有成功的方法:
设置垂直堆栈视图 1 的内容拥抱优先级为高 将垂直堆栈视图 2 设置为所需的内容压缩阻力优先级 子类化UIStackView
,因此它返回一个intrinsicContentSize
,其中width
与其标签的intrinsicContentSize.width
一样大
递归设置垂直堆栈视图 2 中排列的子视图,使其具有所需的内容压缩阻力优先级
任何帮助将不胜感激。
【问题讨论】:
【参考方案1】:我想通了。我继承了UIStackView
,除了覆盖intrinsicContentSize
,我还覆盖了layoutSubviews
,使其自身的内在内容大小无效。
class NestedStackView: UIStackView
override func intrinsicContentSize() -> CGSize
var size = super.intrinsicContentSize()
for view in arrangedSubviews
let viewSize = view.intrinsicContentSize()
if axis == .Vertical
size.width = max(viewSize.width, size.width)
else
size.height = max(viewSize.height, size.height)
return size
override func layoutSubviews()
invalidateIntrinsicContentSize()
super.layoutSubviews()
【讨论】:
以上是关于UILabel 在嵌套的 UIStackViews 中被截断?的主要内容,如果未能解决你的问题,请参考以下文章
UIScrollView 内的嵌套 UIStackViews:不填充容器的宽度?
如何控制嵌套在另一个堆栈视图中的 UIStackViews 的相对宽度?