2016-02-13 69 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

在進行高度計算之前刪除表情符號會破壞函數的用途,因爲寬度也會發生變化。 – Code

+0

取而代之,將其替換爲任何caracter。我想這個高度會非常接近。 –

相關問題