Swift 如何从字体计算一行文本高度
Posted
技术标签:
【中文标题】Swift 如何从字体计算一行文本高度【英文标题】:Swift How to calculate one line text height from its font 【发布时间】:2016-06-12 19:30:42 【问题描述】:我遇到了一个问题,我需要将标签垂直平移到与 textField 文本高度相同的距离。在大多数情况下只是textField.bounds.heigt
但如果文本字段的高度大于文本高度,这对我没有任何好处。所以我需要知道:
如何根据UIFont
计算字符串文本的行高?
关于副本: 我需要的有点不同。那个答案(我在我的答案中引用过)得到的总高度取决于 1)字符串 2)宽度 3)字体。我需要的是仅取决于字体的行高。
【问题讨论】:
Figure out size of UILabel based on String in Swift的可能重复 这与我需要的有点不同。那个答案(我在我的答案中引用过)得到的总高度取决于 1)字符串 2)宽度 3)字体。我需要的是仅取决于字体的行高 【参考方案1】:我过去使用这个字符串扩展来绘制一些文本,而不是在某处创建 UILabel。我不喜欢这样一个事实,即我似乎无法获得要绘制的特定文本的真实高度(并非每个字符串都包含大写字母或带有下划线的字符等)。我使用了几个枚举围绕给定点的水平和垂直对齐。 对垂直高度的想法持开放态度。
public func draw(at pt: CGPoint,
font: UIFont? = UIFont.systemFont(ofSize: 12),
color: UIColor? = .black,
align: HorizontalAlignment? = .Center,
vAlign: VerticalAlignment? = .Middle)
let attributes: [NSAttributedString.Key : Any] = [.font: font!,
.foregroundColor: color!]
let size = self.boundingRect(with: CGSize(width: 0, height: 0),
options: [ .usesFontLeading ],
attributes: [ .font: font! ],
context: nil).size
var x = pt.x
var y = pt.y
if align == .Center
x -= (size.width / 2)
else if align == .Right
x -= size.width
if vAlign == .Middle
y -= (size.height / 2)
else if vAlign == .Bottom
y -= size.height
let rect = CGRect(x: x, y: y, width: size.width, height: size.height)
draw(in: rect, withAttributes: attributes)
【讨论】:
【参考方案2】:UIFont
有一个属性lineHeight
:
if let font = _textView.font
let height = font.lineHeight
font 是你的字体
【讨论】:
像魅力一样工作。谢谢! font.lineHeight 返回字体的高度。但是,UILabel 总是比行高高一点【参考方案3】:我一直在寻找一种方法来做到这一点并找到这个answer,它有一个String
扩展来计算字符串和给定字体的大小。我已经修改它来做我想做的事情(获取使用字体书写的文本的行高。):
extension UIFont
func calculateHeight(text: String, width: CGFloat) -> CGFloat
let constraintRect = CGSize(width: width, height: CGFloat.greatestFiniteMagnitude)
let boundingBox = text.boundingRect(with: constraintRect,
options: NSStringDrawingOptions.usesLineFragmentOrigin,
attributes: [NSAttributedStringKey.font: self],
context: nil)
return boundingBox.height
我希望这对寻找它的人有所帮助。 (将来可能是我自己)。
【讨论】:
以上是关于Swift 如何从字体计算一行文本高度的主要内容,如果未能解决你的问题,请参考以下文章