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 如何从字体计算一行文本高度的主要内容,如果未能解决你的问题,请参考以下文章

如何计算WPF中的字体高度?

无论字体系列或字体大小如何,有没有办法使文本垂直居中?

如何更改RichTextBox高度以适应C#中的新字体大小

iOS 文本字体的默认宽度和高度

WPF 格式化文本:计算字体大小以填充可用高度空间

iOS-UILabel根据文本字体大小计算label宽度;以及自适应高度