如何调整文本字段大小以适合所有文本的最佳方法

时间:2013-06-04 23:51:27

标签: actionscript-3 textfield

我有一个非常动态的textField(html文本),我必须调整框的大小来修复它并计算占用的空间。我正在使用......

myTextField.height = myTextField.textHeight;

但结果不是很精确,即使Adobe的描述说不是。还有更好的方法吗?这个班级有一些“自动调整大小”的适当性吗?而对于最后一个:如果它不提供真正的文本高度,这个“textHeight”的目的是什么?

4 个答案:

答案 0 :(得分:7)

TextField类有getLineMetrics()方法,返回TextLineMetrics

这两个页​​面都有很好的例子。

您可以使用numLines()方法获取多行文字字段中的文字行数。

enter image description here

答案 1 :(得分:3)

这样做:

myTextField.autoSize = TextFieldAutoSize.LEFT;
// if it should not be singleline then add this aswell
myTextField.wordWrap = true;
myTextField.multiline = true;

至于你的第二个问题:
textHeight以像素为单位返回文本的高度 检查文档中的示例 - > AS3 Docs TextField.textHeight

答案 2 :(得分:2)

如果您定义宽度,

textHeight将返回正确的值。我还添加了4-6的边距,具体取决于文本字段的文本格式,以确保显示我的所有文本。虽然它有点不稳定,但它也没有让我失去动态TF,但我只使用了text属性,而不是htmlText。关于自动调整大小 - textHeight就是出于此目的,但文本字段没有实际的自动调整大小。

答案 3 :(得分:1)

如果您想要更精确的内容,我会通过查看docstip来找到解决方案。

以下两种方法对我来说都非常适用于单行,多行自动换行(只是文本换行和\ 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高度为32,textHeight给出39,计算出的高度(上面的actualHeight)为34.对于高度为97.20的多行测试,textHeight为23.79,actualHeight是97.15。这个实际高度包括两侧的排水沟,但是如果有的话,它会去掉尾随的前端。