UILabel 在嵌套的 UIStackViews 中被截断?

Posted

技术标签:

【中文标题】UILabel 在嵌套的 UIStackViews 中被截断?【英文标题】:UILabels truncated in nested UIStackViews? 【发布时间】:2016-06-27 18:20:11 【问题描述】:

我正在尝试调整两个垂直 UIStackViews 的大小,以便它们以我想要的方式显示内容。两个垂直的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 的相对宽度?

嵌套的 UIStackViews 在编程 UI 中不起作用

UITableViewCell 中嵌套的 UIStackViews,会减慢滚动速度,降低性能。如何提高性能?

从嵌套的 UIView 获取框架

UIStackView 内的 UIStackViews 给出错误