Swift如何从字体中计算一行文本高度

时间:2016-02-29 16:50:28

标签: ios string swift height uifont

我遇到了一个问题,我需要设置动画来垂直翻译一个与textField文本高度相同距离的标签。在大多数情况下只有textField.bounds.heigt,但如果textField的高度大于文本高度,那对我来说就不会有任何好处。所以我需要知道: 如何计算字符串文字的行高UIFont

关于副本: 我需要的东西有点不同。答案(我在答案中引用)得到总高度取决于1)字符串2)宽度3)字体。我需要的是只有字体的一行高度。

3 个答案:

答案 0 :(得分:12)

UIFont有一个属性lineHeight

    if let font = _textView.font {
        let height = font.lineHeight
    }

其中font是你的字体

答案 1 :(得分:4)

我一直在寻找一种方法来查找这个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 } } ,以计算字符串和给定字体的大小。我已将其修改为我想要的(获取使用字体写入文本的行高。):

Template.chart.onRendered(function () {
 var template = this;

 template.subscribe('yelp', function () {  // Wait for the data to load using the callback
     yelp_data = Yelp.find().fetch();
     var ndx = crossfilter(yelp_data)
 });
});

我希望这有助于有人寻找它。 (将来可能是我自己)。

答案 2 :(得分:0)

我过去曾使用此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)
}