UILabel子类 - 尽管标签高度正确,文字仍在底部切断

mag*_*zbc 17 uilabel ios swift

我有一个问题,UILabel子类切断底部的文本.标签的高度适合文本,底部留有一些空间,但文本仍然被剪掉.

标签

红色条纹是添加到标签图层的边框.

我将标签子类化以添加边缘插入.

override func sizeThatFits(size: CGSize) -> CGSize {
    var size = super.sizeThatFits(size)
    size.width += insets.left + insets.right
    size.height += insets.top + insets.bottom
    return size
}

override func drawTextInRect(rect: CGRect) {
    super.drawTextInRect(UIEdgeInsetsInsetRect(rect, insets))
}
Run Code Online (Sandbox Code Playgroud)

但是,在这种特殊情况下,插入是零.

mag*_*zbc 12

事实证明问题在于

self.lineBreakMode = .ByClipping
Run Code Online (Sandbox Code Playgroud)

改变它

self.lineBreakMode = .ByCharWrapping
Run Code Online (Sandbox Code Playgroud)

解决了这个问题


jul*_*665 9

我的问题是标签的(垂直)内容压缩阻力优先级不够高;将其设置为 required (1000) 修复了它。

看起来其他非 OP 答案可能是针对同一潜在问题的某种解决方法。


Moh*_*ngh 7

Helvetica Neue Condensed Bold字体遇到相同的问题。将标签的“ 基线”属性从“ 对齐基线”更改为“ 对齐中心 ”对我来说很成功。您可以通过选择标签在情节提要中轻松更改此设置。


lui*_*izv 6

TL'DR

可能您正在寻找的属性是UILabelbaselineAdjustment

由于旧的 UILabel 的已知错误,因此需要它。尝试一下:

label.baselineAdjustment = .none
Run Code Online (Sandbox Code Playgroud)

它也可以通过界面生成器进行更改。这个属性可以在UILabel 的属性检查器下找到,名称为"Baseline"

Interface Builder 上的基线属性


解释

这是一个错误

有一些类似这样的讨论是关于 UILabel 文本边界框上的一个错误。在我们的案例中,我们在这里观察到的是这个错误的某个版本。当我们通过 AutoShrink.minimumFontScale缩小文本时,看起来边界框的高度会增加.minimumFontSize

结果,边界框变得大于行高和 UILabel 高度的可见部分。也就是说,将 baselineAdjustment属性设置为默认状态.alignBaselines,文本与裁剪后的底部对齐,我们可以观察到线条剪裁。

理解这种行为对于解释为什么 set.alignCenters解决一些问题而不是其他问题至关重要。只是在更大的边界框上居中文本仍然可以剪辑它。


解决方案

所以最好的方法是设置

label.baselineAdjustment = .none
Run Code Online (Sandbox Code Playgroud)

.none该案的文件说:

相对于边界框的左上角调整文本。这是默认调整。

由于绑定框原点与标签的框架相匹配,因此它应该可以解决AutoShrink启用单行标签的任何问题。

它也可以通过界面生成器进行更改。这个属性可以在UILabel 的属性检查器下找到,名称为"Baseline"


文档

您可以在此处阅读有关官方文档中UILabel 的 更多信息baselineAdjustment