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

时间:2016-03-23 11:02:08

标签: ios swift uilabel

UILabel子类在底部切断文本时遇到问题。标签的高度适合文本,底部留有一些空间,但文本仍然被剪掉。

The label

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

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

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))
}

但是,在这种特殊情况下,insets为零。

7 个答案:

答案 0 :(得分:10)

原来问题是

self.lineBreakMode = .ByClipping

将其更改为

self.lineBreakMode = .ByCharWrapping

解决了问题

答案 1 :(得分:7)

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

答案 2 :(得分:5)

TL'DR

您要查找的属性可能是 UILabel valgrind env | grep -i valgrind

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

baselineAdjustment

还可以通过界面构建器进行更改。该属性可以在 UILabel的属性检查器下找到,名称为“ Baseline”

Baseline property on Interface Builder


说明

这是一个错误

关于this one的一些讨论涉及UILabel文本边界框上的错误。我们在本例中观察到的是此错误的某些版本。通过自动收缩label.baselineAdjustment = .none .minimumFontScale收缩文本时,边界框的高度似乎会增加

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

了解此行为对于解释为什么集.alignBaselines解决了某些问题而不解决其他问题至关重要。只是将文本放在较大的边框上仍然可以对其进行裁剪。


解决方案

所以最好的方法是设置

.alignCenters

label.baselineAdjustment = .none 案例的文档说:

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

由于绑定盒的原点与标签的框架匹配,因此对于启用.none的单行标签,它应该可以解决所有问题。

还可以通过界面构建器进行更改。该属性可以在 UILabel的属性检查器下找到,名称为“ Baseline”


文档

您可以在官方documentation上阅读有关 UILabel的 AutoShrink的更多信息。

答案 3 :(得分:3)

同时为topAnchor和centerYAnchor提供标签时发生了这件事。 只留下一个锚就解决了这个问题。

答案 4 :(得分:2)

我的问题是标签的(垂直)内容抗压缩优先级不够高;将其设置为必填(1000)即可修复。

看来其他非操作性答案可能是解决同一潜在问题的某种解决方法。

答案 5 :(得分:1)

其他答案对我没有帮助,但是将标签的高度限制在所需的任何高度,例如:

let unconstrainedSize = CGSize(width: CGFloat.greatestFiniteMagnitude, height: CGFloat.greatestFiniteMagnitude)
label.heightAnchor.constraint(equalToConstant: label.sizeThatFits(unconstrainedSize).height).isActive = true

此外,如果您的标签的sizeThatFits(_:)字段为0 by 0或等于text

nil将返回""大小

答案 6 :(得分:0)

我也遇到了这个问题,但想避免增加高度限制。我已经创建了一个UILabel子类,该子类允许我添加内容插图(但出于将tableHeaderView直接设置为标签的目的,而不必将其包含在另一个视图中)。使用该类,我可以设置底部插图来解决字体剪裁问题。

import UIKit

@IBDesignable class InsetLabel: UILabel {

    @IBInspectable var topInset: CGFloat = 16
    @IBInspectable var bottomInset: CGFloat = 16
    @IBInspectable var leftInset: CGFloat = 16
    @IBInspectable var rightInset: CGFloat = 16
    var insets: UIEdgeInsets {
        get {
            return UIEdgeInsets(
                top: topInset,
                left: leftInset,
                bottom: bottomInset,
                right: rightInset
            )
        }
    }

    override func drawText(in rect: CGRect) {
        super.drawText(in: rect.inset(by: insets))
    }

    override var intrinsicContentSize: CGSize {
        return addInsetsTo(size: super.intrinsicContentSize)
    }

    override func sizeThatFits(_ size: CGSize) -> CGSize {
        return addInsetsTo(size: super.sizeThatFits(size))
    }

    func addInsetsTo(size: CGSize) -> CGSize {
        return CGSize(
            width: size.width + leftInset + rightInset,
            height: size.height + topInset + bottomInset
        )
    }

}

这可以简化为仅将字体剪裁为:

import UIKit

class FontFittingLabel: UILabel {

    var inset: CGFloat = 16 // Adjust this

    override func drawText(in rect: CGRect) {
        super.drawText(in: rect.inset(by: UIEdgeInsets(
            top: 0,
            left: 0,
            bottom: inset,
            right: 0
        )))
    }

    override var intrinsicContentSize: CGSize {
        let size = super.intrinsicContentSize
        return CGSize(
            width: size.width,
            height: size.height + inset
        )
    }

}