UILabels在嵌套的UIStackViews中被截断?

时间:2016-06-27 18:20:11

标签: ios uiview

我正在尝试调整两个垂直UIStackView的大小,以便它们以我想要的方式显示内容。两个垂直UIStackViews位于另一个水平UIStackView内,位于UITableViewCell内。每个垂直UILabel中有三UIStackView个。这是我当前的视图层次结构:

View hierarchy

图像视图的宽度和高度约束为具有相同的比例。水平堆栈视图的对齐方式为.Center,分布为.Fill。垂直堆栈视图1具有.Leading的对齐和.EqualSpacing的分布。垂直堆栈视图2具有.Trailing的对齐和.EqualSpacing的分布。所有标签只有一行,堆栈视图2中的内容是可选的 - 如果我不必在{{1}的堆栈视图2中显示任何内容,我将text属性设置为nil }}

我一直试图在堆栈视图2中获取标签,以正确显示文本而不会截断。将垂直堆栈视图1中的文本截断是很好的,但似乎堆栈视图1喜欢调整自身大小以占据大部分宽度。更奇怪的是,这并不是一直发生的。 当垂直堆栈视图1中的标签非常短时,似乎更经常发生。似乎垂直视图2的大小调整,因此它只与最后一个标签一样宽,这通常是三个标签中最短的。

以下是我没有成功的尝试:

  • 设置垂直堆栈视图1以使内容拥抱优先级为
  • 将垂直堆栈视图2设置为具有所需的内容压缩阻抗优先级
  • tableView:cellForRowAtIndexPath:进行子类化,使其返回UIStackViewintrinsicContentSize与其标签一样大{&#39}。 width
  • 在垂直堆栈视图2中递归设置排列的子视图以具有所需的内容压缩阻抗优先级

任何帮助都将不胜感激。

1 个答案:

答案 0 :(得分:0)

我明白了。我将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()
    }
}