Вам не хватает следующей информации, потому что измерения текста работают нормально при создании и настройке текстового поля, даже не добавляя его в список отображения.
Хитрость заключается в том, чтобы убедиться, что вы установилисвойство text для LAST, после полной настройки TextField .Установка свойства «текст», кажется, завершает макет, учитывая все ранее настроенные параметры.
Проблема, с которой вы сталкиваетесь, вероятно, заключается в том, что вы устанавливаете свойство «текст», а затем вносите изменения в другие параметры.такие как multiline или embedFonts.Когда вы это сделаете, getLineMetrics не будет возвращать правильные значения.Если затем установить свойство «текст» и снова проверить getLineMetrics, значения будут правильными.См. Этот пример и комментарии после операторов трассировки.
var tf:TextField = new TextField();
tf.defaultTextFormat = new TextFormat( "Arial Black", 16, 0, false );
tf.embedFonts = true;
tf.text = "Hello"; //set text last
trace( tf.getLineMetrics(0).height ); //Traces 22.55 (correct)
var tf2:TextField = new TextField();
tf2.defaultTextFormat = new TextFormat( "Arial Black", 16, 0, false );
tf2.text = "Hello"; //set text first
tf2.embedFonts = true; //modify a property after setting text seems to make the TextField "dirty"
trace( tf2.getLineMetrics(0).height ); //Traces 1.15 (incorrect)
var tf3:TextField = new TextField();
tf3.defaultTextFormat = new TextFormat( "Arial Black", 16, 0, false );
tf3.text = "Hello";
tf3.embedFonts = true; //modifying a property after setting the text seems to make the TextField "dirty"
tf3.text = "Hello"; //setting the text again seems to fix the problem
trace( tf3.getLineMetrics(0).height ); //Traces 22.15 (correct)
Урок здесь заключается в том, что порядок настройки TextField имеет значение.Это задокументировано как истинное, например, со свойством defaultTextFormat, которое необходимо установить ПЕРЕД настройкой текста, иначе заданный вами новый текст не поднимет defaultTextFormat.В этом случае текст может вообще не отображаться, если у вас включен embedFonts, и он использует другой шрифт по умолчанию, который не встроен.Поэтому убедитесь, что вы сначала установили defaultTextFormat, настроили другие свойства и задали «текст» последним, непосредственно перед вызовом getLineMetrics.
Здесь используйте эту функцию, которую я создал.Это заставляет вас сначала сконфигурировать важные свойства TextField (текст, тип, многострочный, выбираемый, embedFonts), а затем более поздние параметры в точности соответствуют конструктору TextFormat в том же порядке.Это гарантирует, что ваши свойства установлены в правильном порядке, текст назначается последним, и это уменьшит ваше создание TextField до одного оператора:
public static function CreateTextField( text:String = "", type:String = null, multiline:Boolean = false, selectable:Boolean = true, embedFonts:Boolean = false, font:String=null, size:Object=null, color:Object=null, bold:Object=null, italic:Object=null, underline:Object=null, url:String=null, target:String=null, align:String=null, leftMargin:Object=null, rightMargin:Object=null, indent:Object=null, leading:Object=null ):TextField
{
var tf:TextField = new TextField();
tf.defaultTextFormat = new TextFormat( font, size, color, bold, italic, underline, url, target, align, leftMargin, rightMargin, indent, leading );
tf.embedFonts = embedFonts;
tf.multiline = multiline;
tf.selectable = selectable;
tf.type = type;
tf.text = text; //setting text last ensures the text line metrics returns correct values
return tf;
}