某些字体的文本在UILabel中没有垂直居中



我希望文本始终垂直居中。它不适用于某些特定的字体,例如";DamascusSemiBold";,解决方案是什么?

let label = VerticalLabel(frame: CGRect(x: 10, y: 100, width: 300, height: 50))
label.layer.borderColor = UIColor.red.cgColor
label.layer.borderWidth = 1
label.text = "Text Sticker"
label.font = UIFont(name: "DamascusSemiBold", size: 30)
label.numberOfLines = 0
label.textColor = .white
label.textAlignment = .center
self.view.addSubview(label)

public override func textRect(forBounds bounds: CGRect, limitedToNumberOfLines numberOfLines: Int) -> CGRect {
var textRect = super.textRect(forBounds: bounds, limitedToNumberOfLines: numberOfLines)
print(textRect, bounds)
textRect.origin.y = bounds.origin.y + (bounds.size.height - textRect.size.height) * 0.5
print(textRect)
return textRect
}
public override func drawText(in rect: CGRect) {
let actualRect = self.textRect(forBounds: rect, limitedToNumberOfLines: self.numberOfLines)
super.drawText(in: actualRect)
}

它不是居中的,只是顶部!

我知道有很多类似的线索,但我已经读过所有的(据我所知(,还没有看到我遇到的同样的问题。

我正试图让所有的文本显示在一个标签垂直。

让我解释一下——字体的创建方式并不总是一样的,所以它们的总高度可能是一样的(例如24分(。然而,升序和降序差别很大——一种字体可能大多在基线之上,而另一种字体则大多在基线之下。因此,具有不同字体的相同文本可能并不总是显示在同一视图/标签中。

第一个是Helvetica Bold 300分。第二个是Apple Gothic 300分。

注意";g";与Helvetica(以及许多其他字体——试试看,你会发现(隔绝。

所以我的问题是:无论字体如何,我都希望能够看到整个文本。如果";Helvetica";示例可以在标签中向上移动(并居中(,这将解决我的问题。为了更容易,我只需要显示一行。

不幸的是,我看到的解决方案都不涉及字体的下行和上行,以及如何在Rect中绘制文本而不进行裁剪。注意;垂直对齐";不同线程中的解决方案并不能解决这个特定的问题。

我计算attributedString的boundRef,并更新标签的框架,并垂直居中文本

super.drawText(in: rect.inset(by: UIEdgeInsets(top: -(font.ascender - font.capHeight), left: 0, bottom: font.descender, right: 0)))

上面的代码即使垂直居中也会剪切下行,如何在不剪切上行、下行的情况下垂直居中文本?屏幕截图有人对此有什么想法或解决方案吗?

如果您有一个包含较长文本的标签,该标签将包含多行,请将numberOfLines设置为0(此处为零表示不限行数(。

label.numberOfLines=0