UILabel 不可靠包装

UILabel not wrapping reliably

似乎不​​可能让 UILabel 以我希望的方式始终 遵守约束。前导和尾随 space 约束似乎有效,但标签只是截断行而不是扩展到新行。

我确实将 UILabelnumberOfLines 设置为 0。我也尝试了此处列出的建议:UILabel not wrapping text correctly sometimes (auto layout) 但它似乎无法可靠地工作。我尝试的最后一件事是将 setContentCompressionResistancePriority 属性 设置为 FittedLow 但它不适用于 UITableView 中的所有内容。事实上,根据 tableview 是否刷新,看起来所有的包装都可以撤消。

我尝试过的唯一似乎运作良好的方法是将 UILabel 的 preferredMaxLayoutWidth 设置为常量。我只是希望将它用作最后的手段,以避免在运行时计算标签的宽度。当然,有一种开箱即用的方法可以得到我想要的东西。

您可以根据内容计算UILabel运行时的高度

func heightForLabel(text:String, font:UIFont, width:CGFloat) -> CGFloat
    {
        let label:UILabel = UILabel(frame: CGRectMake(0, 0, width, CGFloat.max))
        label.numberOfLines = 0
        label.lineBreakMode = NSLineBreakMode.ByWordWrapping
        label.font = font
        label.text = text

        label.sizeToFit()
        return label.frame.height

    }

使其正常工作的关键是在应用约束并设置所有文本后要求视图重置布局。在设置了所需的数据后,我只是将这些行添加到我的自定义 UITableViewCell 中:

    //set data
    //set constraints

    ...

    contentView.setNeedsLayout()
    contentView.layoutIfNeeded()
 }

我意识到这是解决方案,因为视图在受到约束影响后一直报告其初始帧大小而不是大小。出于某种原因,所有其他视图看起来都是正确的,但 UILabels.

不是

我在此处发布的答案中找到了解决方案: