Swift 如何根据字体计算一行文本的高度
Swift How to calculate one line text height from its font
我 运行 遇到了一个问题,我需要为 t运行 设置标签的动画,使其垂直距离与 textField 的文本高度相同。在大多数情况下只是 textField.bounds.heigt
但如果 textField 的高度大于文本高度,它对我来说没有任何好处。所以我需要知道:
如何根据UIFont
计算字符串文本的行高?
关于副本:
我需要的有点不同。该答案(我在我的答案中引用过)得到的总高度取决于 1) 字符串 2) 宽度 3) 字体。我需要的是一个行高只取决于字体。
我一直在寻找一种方法来做到这一点,并找到了这个 ,它有一个 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
}
}
我希望这对寻找它的人有所帮助。 (以后可能就是我自己)。
UIFont
有一个 属性 lineHeight
:
if let font = _textView.font {
let height = font.lineHeight
}
font 是你的字体
我过去曾使用此 String 扩展来绘制一些文本,而不是在某处创建 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)
}
我 运行 遇到了一个问题,我需要为 t运行 设置标签的动画,使其垂直距离与 textField 的文本高度相同。在大多数情况下只是 textField.bounds.heigt
但如果 textField 的高度大于文本高度,它对我来说没有任何好处。所以我需要知道:
如何根据UIFont
计算字符串文本的行高?
关于副本: 我需要的有点不同。该答案(我在我的答案中引用过)得到的总高度取决于 1) 字符串 2) 宽度 3) 字体。我需要的是一个行高只取决于字体。
我一直在寻找一种方法来做到这一点,并找到了这个 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
}
}
我希望这对寻找它的人有所帮助。 (以后可能就是我自己)。
UIFont
有一个 属性 lineHeight
:
if let font = _textView.font {
let height = font.lineHeight
}
font 是你的字体
我过去曾使用此 String 扩展来绘制一些文本,而不是在某处创建 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)
}