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))
}
但是,在这种特殊情况下,insets为零。
答案 0 :(得分:10)
原来问题是
self.lineBreakMode = .ByClipping
将其更改为
self.lineBreakMode = .ByCharWrapping
解决了问题
答案 1 :(得分:7)
我遇到了 Helvetica Neue Condensed Bold 字体遇到的相同问题。将标签的基线属性从 对齐基线 更改为 对齐中心 。您可以通过选择标签在情节提要中轻松更改此设置。
答案 2 :(得分:5)
您要查找的属性可能是 UILabel 的valgrind env | grep -i valgrind
。
由于旧的UILabel已知错误,因此需要它。试试吧:
baselineAdjustment
还可以通过界面构建器进行更改。该属性可以在 UILabel的属性检查器下找到,名称为“ Baseline” 。
关于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
)
}
}