我在查找UITextField对象中的文本字符串宽度时遇到问题。我知道有各种各样的方法记录表面上这样做,但它们根本不起作用。有一种且只有一种方法可以生成正确的值,但需要使用mx.controls.Text对象的textField属性。如果使用了textField,则getCharBoundaries可以正常工作,您只需将一系列调用返回的宽度相加即可得到一串文本的宽度。
但是,如果你只是在一个独立的TextField或UITextField上调用getCharBoundaries(即一个不属于MX:Text的属性),那么getCharBoundaries会返回一些完全不同的值,该值远小于在textField属性上调用的值。一个Mx:文本对象。它实际上比正确值小约25%,但这甚至不一致,因为改变字体大小和差异似乎是非线性变化的。那么getCharBoundaries实际上是在一个独立的UITextField的情况下返回的,我不知道。
但实际上,调用任何其他方法来确定TextField的文本宽度(MX:Text对象中的getCharBoundaries除外),你会得到相同的错误值:TextField.getUITextFormat()。measureHTMLText(... ).width(或measureText)和TextField.getLineMetrics(...)。width都返回相同的错误值。你可能会说,“好吧,他们可能只是将文本中最左边的像素的宽度返回到最右边的像素”,除非我开始说,在一个实例中,getCharBoundaries实际上是返回文本的总单元格宽度,这就是我想要的,(然后当从一个独立的Textfield调用一些完全不同的值时。)
但是当我尝试将MX:Text对象(我可以在其中成功调用getCharBoundaries)更改为UITextField时,我的问题首次出现。所以现在getCharBoundaries或其他任何东西都没有正确用于确定文本宽度。 (注意:我实际上并没有显示UITextfield,而是在幕后使用它进行文本处理,因为它比MX:Text快得多。我将UITextField.htmlText设置为一个值,然后进行一系列调用getTextFormat,setTextFormat和replaceText。除了更快的速度之外,它与以前一样使用Mx:Text对象。只有问题是现在显然无法确定文本字符串的文本宽度,即使Adobe记录了所有这些应该这样做的方法。
所以我的问题是,我上了google,而且对此的评论很少,而且我在任何地方都没有找到任何工作。几年前我确实在actionscript.org上看到了一个帖子,其他人也说过所有这些宽度方法根本不起作用。有人确认了此事,但未提供解决方案。 (注意:这张海报指出,错误似乎随着字体大小的增加而升级,并且在小字体大小时并不明显,我想这可能解释为什么它似乎没有被注意到。)
但我刚刚在这里下载了Flex 4,问题仍然存在。所以只是想知道我是否真的是唯一认识到这一点,或者遇到过它的人,或者可能有人指出了我所缺少的东西。我想Flex Bug跟踪系统对我来说是一个选择,但那可能是一个黑洞。
所以,无论如何,只是想知道是否有人遇到过这个或者找到了解决方法。
答案 0 :(得分:1)
这个问题相当模糊,几乎肯定与其他人无关,但这里是:
我试图找到一个前缀的文本宽度,该前缀包含我使用非标准属性创建的特殊非标准实用程序字体中的某些字符。 Mx:Text.textfield.getCharBoundaries对它没有任何问题,但显然每个其他宽度方法都有。当然,Mx.Text.textField实际上不是TextField或UITextField,而是IUITextField,这意味着它只是实现了接口。显然它的实现可能与TextField和UITextField的实现没有任何共同之处,它们都是直接相关的。
就这种非标准字体而言,我过去没有遇到任何问题,因此未能将其识别为罪魁祸首。它的字符宽度与另一种字体相同,因此解决了我的问题。
答案 1 :(得分:0)
我必须在这里提供更新。问题不是我使用的字体,而是它不是Windows系统字体。除非先前在用户自己的系统上安装了字体,否则measureText,measureHTMLText等将无法工作。如果字体嵌入在Flex应用程序中没有区别,最终用户必须已经在他自己的系统上安装了该字体才能使这些宽度方法起作用。 MX:Text.textField.getCharBoundaries是唯一一个不关心它是否为systemFont的人。 (UITextField.getCharBoundaries也要求它是一个系统字体。)