2016-02-13 2 views
5

公式docsに続いて、この機能を作成してテキストの高さを計算しました。テキストに絵文字が含まれているとテキストの高さが正しくない

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 
} 

テキストに絵文字が含まれていると計算された高さが正しくありません。

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) 

これはバグですか?これをどうすれば解決できますか?

+0

これは質問ですが、それは私を助けました。ありがとう –

答えて

0

代わりに、テキストの高さを計算する方法を使用しました。これはemojisで動作します。

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 
} 
-1

私はバグではないと思います。絵文字が表示されるスペースを増やします。

これは、テキストの絵文字の数が大きすぎる場合にのみ効果があると思います。 以下のコードを試してみると、結果は同じになると思います。

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

絵文字を削除する場合は、高さの計算を行う前に元のテキストから削除することができます。 この場合、すべての絵文字を他の文字に置き換えて元のテキストをスキャンし、次に高さの計算を呼び出す必要があります。

+0

高さの計算を行う前にemojisを削除すると、幅も変化するので、関数の目的を無効にします。 – Code

+0

代わりに、それを削除して、それぞれの文字列を置き換えます。私は身長が非常に近いと思う。 –

関連する問題