TextField Multiline + Wrap получить высоту текста - PullRequest
4 голосов
/ 25 августа 2010

У меня есть TextField с включенным многострочным и переносом слов и фиксированной шириной. Я хочу рассчитать общую высоту текста внутри него.

Я пытался использовать TextField.textHeight, но это дает мне высоту одной строки. Из-за переноса я не могу легко рассчитать количество строк, чтобы умножить его на высоту строки. TextField.height просто дает мне фиксированную высоту поля по умолчанию, 100 пикселей.

Так как это сделать?

Ответы [ 3 ]

4 голосов
/ 25 августа 2010

В вашем коде должна быть ошибка, так как textHeight должен возвращать вашу высоту TextField, а не только высоту строки.

1 голос
/ 07 сентября 2010

убедитесь, что вы включили wordWrap

это трассировка txt.textHeight = 135

var format:TextFormat = new TextFormat();
format.font = new Bauhaus ().fontName;

var txt:TextField = new TextField();
txt.embedFonts = true;
txt.multiline = true;
txt.defaultTextFormat = format;
txt.wordWrap = true;
txt.width = 100;
txt.text = "Lorem ipsum dolor sit amet, consectetur adipiscing elit. Morbi metus diam, condimentum sagittis rutrum vitae, vehicula et velit.";
addChild(txt);

trace("txt.textHeight "+txt.textHeight);
0 голосов
/ 13 октября 2016

Я нашел решение, посмотрев на Документы , и этот совет .

Оба следующих варианта отлично работают для меня с однострочным, многострочным переносом слов (просто перенос текста и \ n) и многострочным переносом без слов (просто \ n).

Краткая предположительная версия (не используйте это):

var totalLines = textField.bottomScrollV - textField.scrollV + textField.maxScrollV;
var metrics    = textField.getLineMetrics(0);
var gutter     = 2;
var actualHeight = (metrics.ascent + metrics.descent) * totalLines + (totalLines - 1) * metrics.leading + 2 * gutter;

Более длинная, лучшая версия, где строки имеют разные метрики (используйте это):

var gutter  = 2;
var totalLines = textField.bottomScrollV - textField.scrollV + textField.maxScrollV;

var actualHeight = 0;
var prevLeading = 0;
for (var i = 0; i < totalLines; i += 1)
{
    var metrics = textField.getLineMetrics(i);
    actualHeight += metrics.ascent + metrics.descent + prevLeading;
    prevLeading = metrics.leading;
}
actualHeight += 2 * gutter;

Для однострочного теста со встроенным изображением, где textField height дает мне 32, textHeight дает мне 39, вычисленная высота (currentHeight выше) равна 34. Для многострочного теста, где height составляет 97,20, textHeight составляет 23,79, actualHeight 97,15. Эта фактическая высота включает в себя водосточный желоб с обеих сторон, но удаляет задний ведущий, если он есть.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...