Я нашел решение, посмотрев на Документы , и этот совет .
Оба следующих варианта отлично работают для меня с однострочным, многострочным переносом слов (просто перенос текста и \ 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. Эта фактическая высота включает в себя водосточный желоб с обеих сторон, но удаляет задний ведущий, если он есть.