2010-11-29 26 views
0

我在查找UITextField對象中文本字符串的寬度時遇到問題。我知道有很多方法記錄在表面上做到這一點,但他們根本行不通。有一種且只有一種方法可以生成正確的值,但需要使用mx.controls.Text對象的textField屬性。如果使用了textField,那麼getCharBoundaries可以正常工作,並且您可以將從一系列調用中返回的寬度加起來以獲取文本字符串的寬度。但是,如果您只是在獨立的TextField或UITextField(即不是MX:Text的屬性)上調用getCharBoundaries,則getCharBoundaries將返回一些完全不同的值,這比在textField屬性上調用時要小得多一個Mx:Text對象。實際上,它比正確的值小25%,但這甚至不一致,因爲改變字體大小和差異似乎非線性變化。所以getCharBoundaries實際上是在獨立的UITextField中返回的,我不知道。確定UITextField中的文本寬度

但實際上,調用任何其他方法來確定TextField的文本寬度(而不是MX:Text對象中的getCharBoundaries),並且會得到相同的錯誤值:TextField.getUITextFormat()。measureHTMLText(.. 。).width(或measureText)和TextField.getLineMetrics(...).width都返回相同的錯誤值。你可能會說:「好吧,它們可能只是將文本中最左邊的像素的寬度恢復爲最接近像素的寬度」,除非我之前說過,在一個實例中,getCharBoundaries實際上是返回文本的總寬度,這是我想要的,(然後當從獨立的Textfield調用一些完全不同的值時)。

但是我的問題第一次出現時,當我試圖改變MX:文本對象(我可以在其中成功調用getCharBoundaries )到一個UITextField。因此,現在既沒有getCharBoundaries也沒有任何其他工作正確地確定文本寬度。 (注意:我實際上並沒有顯示UITextfield,而是將它用於後臺的文本處理目的,因爲它比MX:Text快得多。我將UITextField.htmlText設置爲一個值,然後進行一系列調用getTextFormat,setTextFormat和replaceText,並且它與之前的Mx:Text對象一樣工作,除了速度更快之外,唯一的問題是現在顯然沒有辦法確定文本字符串的文本寬度,即使Adobe將所有這些文檔方法是應該做到這一點

所以我的問題是,我得到了谷歌,這方面的評論很少,並且根本沒有看到我在任何地方見過的所有工作。在幾年前的actionscript.org上,其他人也說過所有這些寬度方法都不起作用。有人對此進行了確認,但沒有分辨離子提供。 (注意:這張海報注意到,錯誤似乎隨着字體大小的增加而升高,並且在小字號處不明顯,我想這可能解釋爲什麼它似乎沒有被注意到。)

但我下載Flex 4在這裏前一陣子,問題仍然存在。所以只是想知道我是否真的是唯一認識到這一點,或者遇到過這種情況,或者有人指出我錯過了什麼。我想Flex Bug跟蹤系統對我來說是一個選擇,但那可能是一個黑洞。

因此無論如何,只是想知道是否有人遇到過這個問題或者找到了解決辦法。

+0

Quote:「注意:我實際上並沒有顯示UITextfield,而是在後臺使用它來進行文本處理」文本字段大小可能不是初始化,嘗試將它添加到某處(作爲不可見的孩子),從父項調用validateNow()並在測量後移除。 – alxx 2010-11-29 09:00:37

+0

你不是唯一一個遇到Flash/Flex字體測量問題的人......他們有成千上萬人。 – alxx 2010-11-29 09:01:36

回答

1

好的,我解決了我的問題。我對與Adobe的咆哮表示歉意,但我可能再也沒有解決過這個問題。

的問題是相當模糊的,幾乎可以肯定不相關的人,但在這裏它是:

我試圖找到一個前綴的文本寬度包含在我創建了一個特殊非標準工具字體一些字符非常不標準的屬性。 Mx:Text.textfield.getCharBoundaries對此沒有任何問題,但顯然,其他寬度方法都沒有問題。當然,Mx.Text.textField實際上不是一個TextField或一個UITextField,而是一個IUITextField,意味着它只是實現了接口。顯然它的實現可能與TextField和UITextField的實現沒有任何共同之處,這兩者都直接相關。

就這個非標準字體而言,過去我沒有任何問題,所以未能將其識別爲罪魁禍首。它的字符寬度與其他字體相同,因此可以解決我的問題。

0

我必須在此處提供更新。問題不在於我使用的字體,而在於它不是Windows系統字體。 measureText,measureHTMLText等將不起作用,除非先前在用戶自己的系統上安裝了字體。如果字體嵌入到Flex應用程序中,則沒有區別,最終用戶必須已將該字體安裝在他自己的系統上才能使用這些寬度方法。 MX:Text.textField.getCharBoundaries是唯一不關心它是否是systemFont的。 (UITextField.getCharBoundaries也要求它是一個系統字體)。