2016-02-13 7 views
5

In seguito al funzionario docs, ho creato questa funzione per calcolare l'altezza del testo.Altezza testo errata quando il testo contiene le emoji

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 
} 

Ma l'altezza calcolata è errata quando il testo contiene un'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) 

È un errore? Come posso risolvere questo?

+0

Anche se questa è una domanda, ma mi ha aiutato. Grazie –

risposta

0

Ho usato un metodo alternativo per calcolare l'altezza del testo. Funziona con 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

Non penso che sia un bug. Emoji occupa più spazio per essere visualizzato.

Credo che questo farà la differenza solo se il numero di emoji nel testo è troppo grande. Se provi il codice qui sotto, penso che il risultato sarà lo stesso.

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

Se si desidera eliminare l'emoji, è possibile rimuoverli dal testo originale prima di eseguire il calcolo dell'altezza. In questo caso, è necessario eseguire la scansione del testo originale sostituendo tutte le emoji con un altro carattere, quindi chiamare il calcolo dell'altezza.

+0

Rimuovere gli emoji prima di eseguire il calcolo dell'altezza elimina lo scopo della funzione poiché anche la larghezza cambia. – Code

+0

Invece rimuovere quindi, sostituire ciascuno per ogni carattere. Immagino che l'altezza sarà molto vicina. –

Problemi correlati