Table 视图单元格标签换行不一致

Table view cell labels are inconsistent in line break

我有一个自定义 table 视图单元格,里面有一个标签。我注意到每七个单元格的标签都会过早地打破第一行。屏幕截图上的所有单元格在其标签文本的开头都有相同的字符串子序列(黑色和红色椭圆)。 正如您可能已经猜到的那样,中间单元是第七个单元。如果我向下滚动 7 个单元格,结果将是相同的

标签配置:

descriptionLabel.numberOfLines = 0
descriptionLabel.lineBreakMode = .byWordWrapping

我不知道如何解决这个问题,请求您的帮助。 提前致谢!

“孤儿”是段落末尾一行中的单个词。在排版中,将单词 悬空放在末尾 .

被认为是“糟糕的布局”

因此,Apple 已编码 UILabel 以避免“孤儿”。

如果您不介意标签中的孤儿,UITextView 不会 强制执行 - 所以您可以使用 UITextView(禁用编辑和滚动)。

正如您在此图片中所见,不过:

UITextView 对实际框架中的文本有默认的“插入”。

所以,这是一个 @IBDesignable 子类,它删除了插入:

@IBDesignable
class TextViewLabel: UITextView {
    
    override init(frame: CGRect, textContainer: NSTextContainer?) {
        super.init(frame: frame, textContainer: textContainer)
        commonInit()
    }
    
    required init?(coder aDecoder: NSCoder) {
        super.init(coder: aDecoder)
        commonInit()
    }
    
    func commonInit() -> Void {
        isScrollEnabled = false
        isEditable = false
        isSelectable = false
        textContainerInset = UIEdgeInsets.zero
        textContainer.lineFragmentPadding = 0
    }
    
}

编辑 澄清...

这里是三个默认值UILabel,宽度完全相同:

请注意,对于标签 A,第一行末尾有足够的空间用于单词 "an",但它会换到第二行防止出现孤儿——也就是说,防止第二行出现单个单词

使用标签 B,单词 "an" 保留在第一行,因为自动换行导致 两个 单词第二行.

正如我们在标签 C 中看到的那样,如果文本换行到 超过两行 UILabel 允许孤儿 -- 最后一行的一个词。

通过将默认的 UILabel 替换为 TextViewLabel 子类,我们可以强制两行换行忽略“孤儿”换行: