2010-08-25 6 views
4

J'ai un TextField avec multi-lignes et retour à la ligne activé, et une largeur fixe. Je veux calculer la hauteur totale du texte à l'intérieur.TextField multiline + wrap obtenir la hauteur du texte

J'ai essayé d'utiliser TextField.textHeight, mais cela me donne la hauteur d'une ligne. En raison de l'emballage, je ne peux pas facilement calculer le nombre de lignes pour le multiplier avec la hauteur de la ligne. TextField.height me donne juste la hauteur fixe par défaut du champ, 100 pixels.

Alors, comment le faire?

Répondre

4

Il doit y avoir une erreur dans votre code, car textHeight doit renvoyer votre hauteur TextField, pas seulement une hauteur de ligne.

+0

Eh bien peut-être que j'avais quelque chose de mal dans mon code, ça va maintenant. Je ne peux pas vraiment me rappeler comment ou quand je l'ai réparé. – Lahey

+3

La hauteur TextField est en fait (textHeight + 4). Le TextField inclut une gouttière 2px autour du texte, de sorte que la hauteur du TextField sera automatiquement ajustée à textHeight + (2px top gutter) + (2px bottom gutter) si autoSize est autre chose que TextFieldAutoSize.NONE. Voir: http://help.adobe.com/en_US/FlashPlatform/reference/actionscript/3/flash/text/TextLineMetrics.html et http://help.adobe.com/en_US/FlashPlatform/reference/actionscript/3/ flash/text/TextField.html # autoSize Si vous définissez WordWrap sur true, le redimensionnement automatique horizontal s'arrêtera, mais il sera automatiquement redimensionné verticalement. – Triynko

1

assurez-vous d'inclure wordWrap

cette trace txt.textHeight = 135

 
var format:TextFormat = new TextFormat(); 
format.font = new Bauhaus().fontName; 

var txt:TextField = new TextField(); 
txt.embedFonts = true; 
txt.multiline = true; 
txt.defaultTextFormat = format; 
txt.wordWrap = true; 
txt.width = 100; 
txt.text = "Lorem ipsum dolor sit amet, consectetur adipiscing elit. Morbi metus diam, condimentum sagittis rutrum vitae, vehicula et velit."; 
addChild(txt); 

trace("txt.textHeight "+txt.textHeight);
0

J'ai trouvé une solution de regarder Docs, et ce tip. Les deux éléments suivants fonctionnent parfaitement pour moi avec un retour à la ligne multiligne sur une seule ligne (juste retour à la ligne, et \ n), et un retour à la ligne sans ligne (juste \ n).

Version courte assomptive (ne pas utiliser ce):

var totalLines = textField.bottomScrollV - textField.scrollV + textField.maxScrollV; 
var metrics = textField.getLineMetrics(0); 
var gutter  = 2; 
var actualHeight = (metrics.ascent + metrics.descent) * totalLines + (totalLines - 1) * metrics.leading + 2 * gutter; 

version plus longue de mieux où les lignes ont des paramètres différents (à utiliser):

var gutter = 2; 
var totalLines = textField.bottomScrollV - textField.scrollV + textField.maxScrollV; 

var actualHeight = 0; 
var prevLeading = 0; 
for (var i = 0; i < totalLines; i += 1) 
{ 
    var metrics = textField.getLineMetrics(i); 
    actualHeight += metrics.ascent + metrics.descent + prevLeading; 
    prevLeading = metrics.leading; 
} 
actualHeight += 2 * gutter; 

Pour un seul test en ligne avec une ligne image où textField height me donne 32, textHeight me donne 39, la hauteur calculée (effectiveHeight ci-dessus) est de 34. Pour un test multi-ligne où la hauteur est de 97,20, textHeight est 23,79, actualHeight est 97,15. Cette hauteur réelle inclut la gouttière des deux côtés, mais supprime la ligne de fuite s'il y en a.

Questions connexes