【问题标题】:Determining text width in a UITextField确定 UITextField 中的文本宽度
【发布时间】: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 对象,除了更快。唯一的问题是现在显然没有办法确定文本字符串的文本宽度,即使 Adob​​e 记录了所有这些应该这样做的方法。

所以我的问题是,我上了谷歌,对此几乎没有评论,而且我在任何地方都没有看到任何解决方法。几年前,我确实在 actionscript.org 上看到了一个帖子,其他人也说所有这些宽度方法根本不起作用。有人对此进行了确认,但没有提供解决方案。 (注意:这张海报指出,错误似乎随着字体大小的增加而升级,并且在小字体大小时并不那么明显,我想这可以解释为什么它似乎没有被注意到。)

但我前段时间在这里下载了 Flex 4,问题仍然存在。所以只是想知道我是否真的是唯一一个意识到这一点的人,或者遇到过它,或者可能有人指出我错过了什么。我想 Flex Bug 跟踪系统对我来说是一个选择,但那可能是一个黑洞。

所以无论如何,只是想知道是否有人遇到过这种情况或找到了解决方法。

【问题讨论】:

  • 引用:“注意:我实际上并没有显示 UITextfield,而是将其用于幕后的文本处理”文本字段大小可能未初始化,请尝试将其添加到某处(如看不见的孩子),从父母那里调用 validateNow() 并在测量后删除。
  • 您不是唯一一个遇到 Flash/Flex 字体测量问题的人...有成千上万个。
  • 事实上,我确实将它添加为一个孩子,并在完成测量后按照您的建议将其删除。但是非常感谢您的反馈。我实际上正在设计一个测试用例,正如 Adob​​e 人员在他们的 Flex 论坛上所建议的那样,这就是我现在正在做的事情。回复:您的第二句话 - 知道这一点令人放心。
  • 我会尝试 ValidateNow 的事情

标签: apache-flex actionscript-3


【解决方案1】:

好的,我已经解决了我的问题。对于针对 Adob​​e 的咆哮,我深表歉意,但如果不这样,我可能无法解决这个问题。

这个问题相当模糊,几乎可以肯定与其他人无关,但这里是:

我试图查找包含某些字符的前缀的文本宽度,该前缀是我使用非常非标准属性创建的特殊非标准实用字体。 Mx:Text.textfield.getCharBoundaries 没有问题,但显然其他所有宽度方法都有。当然,Mx.Text.textField 实际上并不是TextField 或UITextField,而是IUITextField,也就是说它只是实现了接口。显然它的实现可能与 TextField 和 UITextField 的实现没有任何共同之处,它们都是直接相关的。

就这种非标准字体而言,我过去没有遇到任何问题,因此未能确定它是罪魁祸首。它的字符宽度与另一种字体的相同,这样就解决了我的问题。

【讨论】:

    【解决方案2】:

    我必须在这里提供更新。问题不在于我使用的字体,而在于它不是 Windows 系统字体。除非先前在用户自己的系统上安装了字体,否则 measureText、measureHTMLText 等将不起作用。如果字体嵌入在 Flex 应用程序中没有区别,最终用户必须已经在他自己的系统上安装了该字体,这些宽度方法才能工作。 MX:Text.textField.getCharBoundaries 是唯一一个不关心它是否是 systemFont 的。 (UITextField.getCharBoundaries 也要求它是系统字体。)

    【讨论】:

    • 确实找到了某人发布的似乎有效的解决方法:创建一个不可见的 TextField 并仅将文本放入您要测量的内容中。预先将 defaultTextFormat 设置为所需的 TextFormat 以及 autoSize="left"。我还在小时候添加了它,但它似乎正在工作。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-05-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-11-26
    • 2012-06-02
    相关资源
    最近更新 更多