Этот код можно использовать для изменения размера TextField, чтобы он был достаточно большим, чтобы вместить текст без прокрутки.
var metrics:TextLineMetrics = getLineMetrics( numLines - 1 ); //get metrics of last line of text
var minimum_height = metrics.height + metrics.leading; //include one extra leading in all textHeight measurements to avoid undercalculating the textHeight (maxScrollV seems to use a value for textHeight that includes an extra leading value)
var real_textHeight:Number = textHeight + metrics.leading; //include one extra leading in all textHeight measurements to avoid undercalculating the textHeight (maxScrollV seems to use a value for textHeight that includes an extra leading value)
var gutter:Number = 4; //2px top and 2px bottom gutter exists on all textfields
height = (h < minimum_height) ? (minimum_height + gutter) : (real_textHeight + gutter); //match height of text, ensuring height is at least enough to display one line, even if there is no text. also accounts for 4 pixel gutter and extra leading value that would otherwise throw off maxScrollV
В вашем случае вы не пытаетесь изменить размер textField, но в принципе, чтобы определить, следует ли отображать полосы прокрутки, вы хотели бы использовать:
var needsScrollBars:Boolean = ((textfield.textHeight + metrics.leading) > (height + 4));
Ключ заключается в том, чтобы включить это дополнительное начальное значение, которое не включено в свойство textHeight, но, похоже, учитывается maxScrollV. Проблема, когда maxScrollV слишком много, исчезает, если ведущий равен нулю.
Если ваша проблема заключается в задержке обновления полей, убедитесь, что вы устанавливаете свойство text в последнюю очередь. Если вы выполняете автоматическое изменение размера, вы можете либо изменить высоту, а затем сбросить textfield.text или вызвать либо textfield.getCharBoundaries, либо textfield.getLineMetrics, что, по-видимому, заставляет его обновить свои внутренние значения.
Наконец, еще одна проблема, которую я заметил, заключается в том, что numLines изначально неправильный. Например, пустое текстовое поле на сцене сообщит о numLines = 2. Как только «текст» будет установлен во время выполнения, это значение будет исправлено, поэтому, если вы просто установите text = ""
, тогда numLines будет правильным. В любом случае textHeight + lead - это хорошее «реальное» значение, используемое для высоты текста, и, как всегда, «требуемая высота текстового поля, чтобы избежать прокрутки», должно быть «реальной высотой текста» + 4.