PDA

Просмотр полной версии : Размеры TextArea в зависимости от текста.


Astraport
29.07.2012, 22:03
Программно создается флексовский элемент TextArea. Нужно создать его так, чтобы весь текст был виден полностью, без скролов. Например по ширине 300 пикселей, а по высоте как получится с учетом того что шрифт может быть разный.

VerticalScrollPolicy программно не задается. Свойств textWidth и textHeight как у textField не имеется. Как решать - не понятно.

КорДум
30.07.2012, 01:57
Так это. У него же есть ссылка. TextArea#textField

Astraport
30.07.2012, 08:57
Так это. У него же есть ссылка. TextArea#textField

КорДум, если честно, то не понимаю где ты её видишь. Видимо я должен указать что это Spark для мобильных, но это не важно.

Пока нашел такой костыль. Создавать экземпляр TextField с заданным текстом не добавляя на сцену, высчитывать у него textHeight и задавать этот размер для TextArea.

alatar
30.07.2012, 12:37
В мобильном скине используется StyleableTextField в качестве textDisplay и у него есть, как у наследника TextField, textWidth и textHeight.
Как решать - не понятно.
Создать свой мобильный скин без scroller'a.

Zebestov
30.07.2012, 12:52
Почему этот раздел.

Astraport
30.07.2012, 13:24
Почему этот раздел.
Да сначала думал, что вопрос скорее as3 плана, считать текстовые метрики.
В мобильном скине используется StyleableTextField в качестве textDisplay и у него есть, как у наследника TextField, textWidth и textHeight.
Вчера нашел (http://stackoverflow.com/questions/10618293/autosizing-flex-mobile-spark-textarea-component) такое решение:
for(var i:int=0; i < StyleableTextField(txt_genel.textDisplay).numLines; i++) {
ta_height += StyleableTextField(txt_genel.textDisplay).getLineMetrics(i).height;
}
txt_genel.height = ta_height;
Но по-моему это тоже самое что я делаю - меряю textField.
По сути у меня текст может быть разным - и 10 знаков и 200 знаков. Ширина задается, а вот по высоте текстовый блок должен ресайзиться. И ещё закавыка в том, что текст может быть многострочным и все это тоже нужно считать.
Создать свой мобильный скин без scroller'a.
Да я посмотрел код spark.skins.mobile.TextAreaSkin и побоялся скроллер удалять. Он там на всем завязан и непонятно как скажется на производительности и возможных ошибках - итоговое TextArea приходится вращать, ресайзить, таскать и т. п.

alatar
30.07.2012, 13:37
Вчера нашел такое решение... Но по-моему это тоже самое что я делаю - меряю textField.
StyleableTextField это и есть TextField. Зачем дополнительные танцы с бубном?
Да я посмотрел код spark.skins.mobile.TextAreaSkin и побоялся скроллер удалять. Он там на всем завязан и непонятно как скажется на производительности и возможных ошибках - итоговое TextArea приходится вращать, ресайзить, таскать и т. п.
В компоненте он указан как requested = false. В конце-концов что мешает использовать непосредственно StyleableTextField, зачем еще обвязка в виде TextArea, если его возможности все равно не используются.

Astraport
30.07.2012, 13:54
В конце-концов что мешает использовать непосредственно StyleableTextField, зачем еще обвязка в виде TextArea, если его возможности все равно не используются.
По-моему это примитив не поддерживающий эффектов, а мне нужны к тексту тени, глоу и т. п.

Добавлено через 1 минуту
Класс StyleableTextField - это текстовый примитив, который используется в темах оформления и средствах визуализации элементов ActionScript. Он не может использоваться в разметке MXML и несовместим с эффектами.

Добавлено через 18 минут
Проверил - работают фильтры. Странно. Попробую использовать. Спасибо.

strangedk
30.07.2012, 14:13
Может конечно не в тему, но т.к. не указано нужно ли редактировать текст - скажу что Label вроде не имеет подобных проблем.

Astraport
30.07.2012, 14:17
Нужно редактировать.

Добавлено через 5 минут
Не получается использовать, сразу нарвался на ошибку:
TypeError: Error #1009: Cannot access a property or method of a null object reference.
at mx.utils::MatrixUtil$/decomposeMatrix()[E:\dev\4.y\frameworks\projects\framework\src\mx\utils\MatrixUtil.as:145]
at spark.components.supportClasses::StyleableTextField/get http://www.adobe.com/2006/flex/mx/internal::measuredTextSize()[E:\dev\4.y\frameworks\projects\mobilecomponents\src\spark\components\supportClasses\StyleableTextField.as:272]
at spark.components.supportClasses::StyleableTextField/getPreferredBoundsWidth()[E:\dev\4.y\frameworks\projects\mobilecomponents\src\spark\components\supportClasses\StyleableTextField.as:1612]

GBee
31.07.2012, 19:44
А для спарка такое не пройдет в своей вариации?

private function resizeMe(field:TextArea) :void
{
field.validateNow();
field.mx_internal::getTextField().autoSize = TextFieldAutoSize.LEFT;
field.height = field.mx_internal::getTextField().height;
}

Astraport
31.07.2012, 23:33
Привет!
ReferenceError: Error #1069: Property http://www.adobe.com/2006/flex/mx/internal::getTextField not found on spark.components.TextArea and there is no default value.

GBee
01.08.2012, 12:53
Да понятно что в прямую не пройдет, я же говорю может там есть подобие. spark_internal например :о)

alatar
01.08.2012, 13:07
1. Нет никакого spark_internal используется только mx_internal.
2. Отображаемый текст часть скина, к тому же необязательная, его может и не быть (как бы это странно не звучало) или он может быть еще не создан на момент проверки.
3. Вместо костылей и танцев с бубном проще сделать свой скин без скроллера, простой как две копейки.