2016-02-13 9 views
5

Po utworzeniu oficjalnej wersji docs utworzyłem tę funkcję, aby obliczyć wysokość tekstu.Nieprawidłowa wysokość tekstu, gdy tekst zawiera emotikony

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 
} 

Ale obliczona wysokość jest nieprawidłowa, gdy tekst zawiera emoji.

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) 

Czy to błąd? Jak mogę to naprawić?

+0

Chociaż to pytanie, ale pomogło mi to. Dzięki –

Odpowiedz

0

Użyłem alternatywnej metody obliczania wysokości tekstu. Działa to z emoji.

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

Nie sądzę, że to błąd. Emoji zajmuje więcej miejsca do wyświetlenia.

Uważam, że będzie to miało wpływ tylko wtedy, gdy liczba emoji w tekście jest zbyt duża. Jeśli spróbujesz kodu poniżej, myślę, że wynik będzie taki sam.

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

Jeśli chcesz wyeliminować emoji, możesz usunąć je z oryginalnego tekstu przed wykonaniem obliczenia wysokości. W takim przypadku należy zeskanować oryginalny tekst, zastępując wszystkie emoji innym znakiem, a następnie wywołać obliczenie wysokości.

+0

Usunięcie emotikonów przed wykonaniem obliczenia wysokości jest niezgodne z celem funkcji, ponieważ zmienia się również szerokość. – Code

+0

Zamiast tego usuń, zamień każdą z nich na dowolną postać. Myślę, że wysokość będzie bardzo blisko. –

Powiązane problemy