Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 3.0 (http://www.flasher.ru/forum/forumdisplay.php?f=83)
-   -   Динамическое изменение высоты TextField (http://www.flasher.ru/forum/showthread.php?t=143856)

AL.exe 27.08.2010 15:20

Динамическое изменение высоты TextField
 
Подскажите, пожалуйста решение. Столкнулся с такой проблемой: требуется создать текстовое поле с постоянной шириной, скажем, в 200 пикселей. В поле добавляется какой-либо текст. Нужно, чтобы поле автоматчиески изменило высоту. Казалось бы, задача не такая сложная, но textHeight, к сожалению, возвращает всегда высоту одной строки :(

Может, я изобретаю велосипед и есть какой-то штатный способ?

-De- 27.08.2010 15:27

ставишь ему width = 200 ... и вроде всё.
а, ещё wordWrap = true;

AL.exe 27.08.2010 15:30

Цитата:

ставишь ему width = 200 ... и вроде всё.
На самом деле надо было еще сделать multiline=true, wordWrap=true и autosize = TextFieldAutoSize.LEFT, а так Вы даже почти правы :)))

Вернее, я плохо описал проблему.

Мне нужно сделать, чтобы текст по умолчанию был 150 пикселей в ширину, если текст больше 150, но меньше 200, то он должен растягивать поле по горизонтали. Если больше 200, то переносится в несколько строк и по ширине стать ровно стоько, сколько нужо (но не меньше 150) - вот тут-то и покрадывается проблема: когда тест становится могострочным, невозможно определить его реальную ширину (т.е. шириной самой широкой строки) т.к. textWidth возвращает длину всего текста :(

-De- 27.08.2010 15:59

Я там дописал - wordWrap = true и textWidth возвращает ширину самой широкой строки. Не оч. понял, что хотите, но вродь должно хватить. Если что скейлить по горизонтали - scaleX ещё есть.

AL.exe 27.08.2010 16:09

Ну, я вижу, что плохо объяснил.

Скажем, проблема такая:

Нужно, чтобы поле автоматически изменяло высоту (этого добиться понятно как - выше перечислено) и автоматически уменьшало ширину до ширины самой длинной строки. Вот в этом как раз проблема, т.к. textWidth возвращает не длину самой длинной строки, а всего текста, если бы он стоял в одну строку.

incvizitor 27.08.2010 16:19

Код AS3:

override public function set text(s:String):void{
      super.text=s;
      wordWrap=false;
      var tw:Number=Math.min(Math.max(textWidth,150),200);
      wordWrap=true;
      width=tw;
}

?

AL.exe 27.08.2010 16:53

incvizitor, думал б этом, но не будет работать, т.к. этот код установит ширину в 150 при наличии нескольких строк, а в тексте может быть слово длинее 150 пикселей. Соответственно, оно разобьется. В идеале в таком случае ширина должна устанавливаться как ширина самого длинного слова.

Добавлено через 5 минут
Кстати, а можно как-то сделать, чтобы текст переносился по словам, а не по буквам? А то бьющиеся слова - это как-то вообще не весело

Добавлено через 50 минут
В общем, правильынй ответ, хоть и извращеный:

split'им текст исходного текстового поля по пробелу, в цикле содаем с таким же форматированием текстовые поля с каждым из этих слов, смотрим ширину самого длинного (естественно с autosize). Присваиваем ширину самого длинного слова исходном полю. Единственная проблема - почему-то полученное значение примерно на 15 пикселей меньше реального. Блин, во флеше постоянно какие-то проблемы с текстом были. Ужас просто.

incvizitor 27.08.2010 18:36

Цитата:

Блин, во флеше постоянно какие-то проблемы с текстом были. Ужас просто.
ыгы, вроде в CS5 аккуратней сделали))


Часовой пояс GMT +4, время: 12:22.

Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.