文本包含表情符号时文本高度错误

Cod*_*ode 6 ios swift

在官方文档之后,我创建了这个函数来计算文本高度.

func calculateTextHeight(myString: String, myWidth: CGFloat, myFont: UIFont) -> CGFloat {
    let textStorage = NSTextStorage(string: myString)
    let textContainer = NSTextContainer(size: CGSize(width: myWidth, height: CGFloat.max))
    let layoutManager = NSLayoutManager()

    layoutManager.addTextContainer(textContainer)
    textStorage.addLayoutManager(layoutManager)

    textStorage.addAttribute(NSFontAttributeName, value: myFont, range: NSMakeRange(0, textStorage.length))
    textContainer.lineFragmentPadding = 0
    textContainer.lineBreakMode = .ByWordWrapping

    layoutManager.glyphRangeForTextContainer(textContainer)
    return layoutManager.usedRectForTextContainer(textContainer).size.height
}
Run Code Online (Sandbox Code Playgroud)

但是当文本包含表情符号时,计算的高度是错误的.

var s = "ABCDE 12345"
print(calculateTextHeight(s, myWidth: 500, myFont: UIFont.systemFontOfSize(14)))
// prints 16.7 (correct)

s = "ABCDE 12345 "
print(calculateTextHeight(s, myWidth: 500, myFont: UIFont.systemFontOfSize(14)))
// prints 22.9 (should be 16.7)
Run Code Online (Sandbox Code Playgroud)

这是一个错误吗?我怎样才能解决这个问题?

Cod*_*ode 0

我使用了另一种方法来计算文本高度。这适用于表情符号。

static func calculateStringHeight(str: String, maxWidth: CGFloat, font: UIFont) -> CGFloat {
    return str.boundingRectWithSize(CGSizeMake(maxWidth, CGFloat.max), options: NSStringDrawingOptions.UsesLineFragmentOrigin, attributes: [NSFontAttributeName: font], context: nil).height
}
Run Code Online (Sandbox Code Playgroud)