【问题标题】:Table view cell labels are inconsistent in line break表格视图单元格标签在换行符中不一致
【发布时间】:2021-10-20 05:13:22
【问题描述】:

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

标签配置:

descriptionLabel.numberOfLines = 0
descriptionLabel.lineBreakMode = .byWordWrapping

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

【问题讨论】:

  • 如果你只是用黑色和红色圈出文字,读者将无法真正分辨出问题所在,你不觉得吗?在文本中显示您拥有什么以及您想要拥有什么。不是每个人都会阅读西里尔文或其他任何语言。
  • 重点是椭圆勾勒出相同的字符串值。里面是什么 - 并不重要。这条线应该打破它在顶部和底部单元格中的方式
  • 你的标签有固定高度吗?
  • 它没有。它有顶部、前导、尾随“equalTo”约束,底部是“greaterThanOrEqual”
  • 如果您以编程方式显示自定义单元格代码,那就太好了。

标签: ios swift xcode uitableview


【解决方案1】:

“孤儿”是段落末尾一行中的一个单词。在排版中,将一个单词悬空视为“糟糕的布局”。

因此,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 子类,我们可以强制两行换行忽略“孤儿”换行:

【讨论】:

  • 这并不能解释奇怪的周期性错误,但它确实解决了我的问题。谢谢!如果没有出现解释,将接受它
  • @AnatolyRudenko - 请参阅我的答案末尾的 编辑 以获得进一步说明。
猜你喜欢
  • 2023-02-14
  • 2013-11-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-12-02
  • 2017-11-25
相关资源
最近更新 更多