【发布时间】:2010-11-29 07:11:52
【问题描述】:
在 UITextField 对象中查找文本字符串的宽度时遇到问题。我知道有各种表面上记录的方法可以做到这一点,但它们根本不起作用。产生正确值的方法只有一种,但需要使用 mx.controls.Text 对象的 textField 属性。如果使用该 textField,则 getCharBoundaries 可以正常工作,您只需将一系列调用返回的宽度相加即可获得文本字符串的宽度。
但是,如果您只是在独立的 TextField 或 UITextField(即不是 MX:Text 的属性)上调用 getCharBoundaries,则 getCharBoundaries 返回一些完全不同的值,该值远小于在一个 Mx:Text 对象。实际上它比正确值小了大约 25%,但这甚至不一致,因为改变字体大小和差异似乎是非线性变化的。因此,对于独立的 UITextField,getCharBoundaries 实际上返回了什么,我不知道。
但实际上,调用任何其他方法来确定 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 记录了所有这些应该这样做的方法。
所以我的问题是,我上了谷歌,对此几乎没有评论,而且我在任何地方都没有看到任何解决方法。几年前,我确实在 actionscript.org 上看到了一个帖子,其他人也说所有这些宽度方法根本不起作用。有人对此进行了确认,但没有提供解决方案。 (注意:这张海报指出,错误似乎随着字体大小的增加而升级,并且在小字体大小时并不那么明显,我想这可以解释为什么它似乎没有被注意到。)
但我前段时间在这里下载了 Flex 4,问题仍然存在。所以只是想知道我是否真的是唯一一个意识到这一点的人,或者遇到过它,或者可能有人指出我错过了什么。我想 Flex Bug 跟踪系统对我来说是一个选择,但那可能是一个黑洞。
所以无论如何,只是想知道是否有人遇到过这种情况或找到了解决方法。
【问题讨论】:
-
引用:“注意:我实际上并没有显示 UITextfield,而是将其用于幕后的文本处理”文本字段大小可能未初始化,请尝试将其添加到某处(如看不见的孩子),从父母那里调用 validateNow() 并在测量后删除。
-
您不是唯一一个遇到 Flash/Flex 字体测量问题的人...有成千上万个。
-
事实上,我确实将它添加为一个孩子,并在完成测量后按照您的建议将其删除。但是非常感谢您的反馈。我实际上正在设计一个测试用例,正如 Adobe 人员在他们的 Flex 论坛上所建议的那样,这就是我现在正在做的事情。回复:您的第二句话 - 知道这一点令人放心。
-
我会尝试 ValidateNow 的事情
标签: apache-flex actionscript-3