Автоматическое изменение размера текстовой области или расширенного текста

#apache-flex #flex4 #textarea #richtext

#apache-flex #flex4 #текстовое поле #richtext

Вопрос:

Я провел много поисков по этому вопросу, но, похоже, то, что я нахожу, либо устарело, либо просто не работает.

В прошлом для текстовых полей можно было задать текстовому полю определенную ширину, для wordWrap — значение true, и в итоге получалось текстовое поле, высота которого изменялась в соответствии с добавленным вами текстом.

Теперь я пытаюсь сделать это либо с помощью текстового поля Spark, либо с помощью RichText.

Я попробовал это HeightInLines = NAN, но, похоже, это устарело.

Я также пробовал эту процедуру:

 var totalHeight:uint = 10;
this.validateNow();
var noOfLines:int = this.mx_internal::getTextField().numLines;
for (var i:int = 0; i < noOfLines; i  ) 
{
     var textLineHeight:int = 
                     this.mx_internal::getTextField().getLineMetrics(i).height;
     totalHeight  = textLineHeight;
}
this.height = totalHeight;
  

Но mx_internal отсутствует в компонентах Spark.

Я пытаюсь сделать это с помощью AS3, а не MXML. Если у кого-нибудь есть какие-либо предложения или ссылки, которые могли бы помочь мне разобраться с этим, используя AS3, я был бы очень признателен.

Ответ №1:

Боролся с этим весь день. Но похоже, что компонент RichEditableText автоматически изменит размер, если вы зададите его ширину и оставите высоту неопределенной.

Комментарии:

1. Большое спасибо, Росс, я столкнулся с этим, и ваше решение отлично сработало!

Ответ №2:

Это работает нормально:

 <?xml version="1.0" encoding="utf-8"?>
<s:Application xmlns:fx="http://ns.adobe.com/mxml/2009" 
    xmlns:s="library://ns.adobe.com/flex/spark" 
    xmlns:mx="library://ns.adobe.com/flex/mx" minWidth="955" minHeight="600">
    <s:TextArea updateComplete="event.currentTarget.heightInLines = NaN" />
</s:Application>
  

Найдено в комментариях здесь. Вы можете сделать то же самое в ActionScript, используя то же updateComplete событие.

Комментарии:

1. оопсс…. В примере, на который вы ссылаетесь, это предназначено для увеличения текстовой области по мере ввода текста. Я говорю о создании текстовой области, заполнении ее текстом и получении полноразмерной текстовой области, а также числа для высоты, чтобы я мог настраивать элементы под текстовым полем.

Ответ №3:

Вот как я устанавливаю высоту текстовой области, чтобы соответствовать ее содержимому при использовании внутри ItemRenderer (например, для компонента списка):

 private function onUpdateComplete( e: Event ): void
{
    // autoresize the text area
    if ( theText ) {
      var actualNumOfLines: int = theText.textFlow.flowComposer.numLines;
      theText.heightInLines = actualNumOfLines; 

      invalidateSize();
    }
}
  

У ItemRenderer должно быть установлено это свойство:

 <s:ItemRenderer ... updateComplete="onUpdateComplete(event)>
  

Возможно, событие updateComplete не является оптимальным триггером для действий по автоматическому изменению размера, но у меня работает нормально.

Ответ №4:

Вы можете удалить скроллеры из обложки TextArea, и она станет автоматически изменяемой. Вы можете загрузить готовый скин здесь: http://www.yumasoft.com/node/126

Ответ №5:

Вот решение для текстовых областей spark (оно работает так же, как текстовые области mx):

 var ta_height:int;
for(var i:int=0; i < StyleableTextField(myTextArea.textDisplay).numLines; i  ) {
        ta_height  = StyleableTextField(myTextArea.textDisplay).getLineMetrics(i).height;
}
myTextArea.height = ta_height;
  

Ответ №6:

Кажется, у меня это работает:

 <s:TextArea id="testTextArea"
            change="testTextArea_changeHandler(event)" 
            updateComplete="testTextArea_updateCompleteHandler(event)"/>

<fx:Script>
    <![CDATA[
        protected function testTextArea_changeHandler(event:TextOperationEvent):void
        {
            testTextArea.height = RichEditableText(testTextArea.textDisplay).contentHeight   2;
        }

        protected function testTextArea_updateCompleteHandler(event:FlexEvent):void
        {
            testTextArea.height = RichEditableText(testTextArea.textDisplay).contentHeight   2;
        }
    ]]>
</fx:Script>
  

Ответ №7:

Я так же ломал голову над этим s: TextArea, а затем обнаружил, что это позволяет выполнить работу :

 <s:RichEditableText id="txtArea" left="0" right="0" backgroundColor="#F7F2F2"
                    change="textChanged()" />
  

Комментарии:

1. Вы не включили функцию TextChanged().