2010-11-29 10 views
0

Ich habe Probleme, die Breite einer Textfolge in einem UITextField-Objekt zu finden. Ich weiß, dass verschiedene Methoden dokumentiert sind, um dies scheinbar zu tun, aber sie funktionieren einfach nicht. Es gibt eine und nur eine Methode, die einen korrekten Wert erzeugt, aber die textField-Eigenschaft eines mx.controls.Text-Objekts erfordert. Wenn dieses textField verwendet wird, funktioniert getCharBoundaries korrekt, und Sie können die zurückgegebenen Breiten einfach aus einer Reihe von Aufrufen addieren, um die Breite einer Textzeichenfolge zu erhalten.Ermitteln der Textbreite in einem UITextField

Wenn Sie jedoch getCharBoundaries nur auf einem eigenständigen TextField oder UITextField aufrufen (dh eines, das keine Eigenschaft von MX: Text ist), gibt getCharBoundaries einen völlig anderen Wert zurück, der wesentlich geringer ist als bei der textField -Eigenschaft eines Mx: Textobjekts. Es ist tatsächlich etwa 25% kleiner als der korrekte Wert, aber das ist nicht einmal konsistent, weil sich die Schriftgröße ändert und die Diskrepanz nichtlinear zu variieren scheint. Also, was getCharBoundaries tatsächlich im Falle eines eigenständigen UITextField zurückgibt, habe ich keine Ahnung.

Aber tatsächlich, rufen Sie eine andere Methode zum Ermitteln der Textbreite eines TextField (anders als getCharBoundaries innerhalb eines MX: Text -Objekts), und Sie erhalten den gleichen fehlerhaften Wert: TextField.getUITextFormat(). MeasureHTMLText (.. .). width (oder measureText) und TextField.getLineMetrics (...). width alle geben denselben fehlerhaften Wert zurück. Und Sie könnten sagen: "Nun, sie geben wahrscheinlich nur die Breite von den meisten Pixeln im Text zu den meisten Pixeln zurück", außer wie gesagt, in einem Fall gibt getCharBoundaries tatsächlich die gesamte Zellenbreite des Textes zurück, was ist das, was ich will, (und dann, wenn von einem Stand-alone-Textfeld ein völlig anderer Wert aufgerufen.)

Aber mein Problem erschien zuerst, wenn ich versuchte, ein MX: Text-Objekt (innerhalb der ich getCharBoundaries erfolgreich aufrufen konnte) zu einem UITextField. So funktioniert jetzt weder getCharBoundaries noch irgendetwas anderes zur Bestimmung der Textbreite. (Hinweis: Ich zeige das UITextfield eigentlich nicht an, sondern verwende es im Hintergrund für die Textverarbeitung, da es wesentlich schneller ist als MX: Text. Ich setze UITextField.htmlText auf einen Wert und führe dann eine Reihe von Anrufen durch getTextFormat, setTextFormat und replaceText, und alles funktioniert wie vorher mit dem Mx: Text-Objekt, außer viel schneller.Das einzige Problem ist, gibt es jetzt anscheinend keine Möglichkeit, die Textbreite für eine Textkette zu bestimmen, obwohl Adobe all diese Dokumente dokumentiert Methoden, die das tun sollen

Und so ist meine Frage ist, bekomme ich auf Google, und es gibt sehr wenig Kommentar zu diesem Thema, und überhaupt keine Arbeit, die ich irgendwo dokumentiert gesehen habe.Ich sah einen Thread auf actionskript.org von vor ein paar Jahren, wo jemand anderes auch gesagt hat, dass alle diese Breitenmethoden einfach nicht funktionieren.Es gab eine Bestätigung von jemandem, aber keine Auflösung Ion bereitgestellt. (Hinweis: Dieses Poster bemerkte, dass der Fehler mit zunehmenden Schriftgrößen zu eskalieren schien und bei kleinen Schriftgraden nicht so auffällig war, was vielleicht erklären könnte, warum es nicht bemerkt zu sein scheint.)

Aber ich habe heruntergeladen Flex 4 hier vor einer Weile, und das Problem ist immer noch da. Ich frage mich also nur, ob ich wirklich die einzige Person bin, die sich dessen bewusst ist, oder dass sie mir begegnet ist, oder vielleicht jemand, der darauf hinweist, was ich vermisse. Ich denke, das Flex-Bug-Tracking-System wäre eine Option für mich, aber das wäre wahrscheinlich ein Black Hole.

Also sowieso, nur wundern, wenn jemand dies gefunden oder eine Arbeit gefunden hat.

+0

Quote: "Anmerkung: Ich zeige nicht wirklich das UITextfield an, aber verwende es es für Textverarbeitungszwecke hinter den Kulissen" Textfeldgröße möglicherweise nicht initialisiert, versuche es irgendwo hinzuzufügen (als unsichtbares Kind), rufe validateNow() von Eltern auf und entferne es nach dem Messen. – alxx

+0

Sie sind nicht die Einzigen, die Probleme mit der Schriftmessung mit Flash/Flex haben ... es gibt Tausende von ihnen. – alxx

+0

Ich füge es tatsächlich als ein Kind hinzu und entferne es, wie du es nach der Messung auch vorgeschlagen hast. Aber vielen Dank für die Rückmeldung. Ich erstelle gerade einen Testfall, wie eine Adobe-Person in ihrem Flex-Forum vorgeschlagen hat, also daran arbeite ich gerade. Re: Ihre zweite Bemerkung - das ist beruhigend zu wissen. – Mark

Antwort

1

OK, ich habe mein Problem gelöst. Ich entschuldige mich für die Tirade gegen Adobe, aber dann hätte ich das vielleicht nicht anders gelöst.

Das Problem war ziemlich dunkel und mit ziemlicher Sicherheit für andere nicht relevant, aber hier ist es:

Ich habe versucht, die Textbreite eines Präfix zu finden, die einige Zeichen in einem speziellen Nicht-Standard-Dienstprogramm Font enthält ich mit erstellt sehr untypische Attribute. Mx: Text.textfield.getCharBoundaries hatte kein Problem damit, aber jede andere Breitenmethode hat offensichtlich funktioniert. Natürlich ist Mx.Text.textField kein TextField oder UITextField, sondern ein IUITextField, dh es implementiert nur die Schnittstelle. Offensichtlich hat seine Implementierung nichts mit der Implementierung von TextField und UITextField gemeinsam, die beide in direktem Zusammenhang stehen.

Soweit diese nicht standardmäßige Schriftart, hatte ich in der Vergangenheit kein Problem damit, so versäumt, es als der Schuldige zu identifizieren. Seine Zeichenbreiten sind identisch mit denen anderer Schriften, so dass mein Problem gelöst wird.

0

Ich muss hier ein Update zur Verfügung stellen. Das Problem war nicht die Schriftart, die ich benutzte, sondern dass es keine Windows-Systemschrift war. measureText, measureHTMLText usw. funktionieren nur, wenn zuvor eine Schriftart auf dem eigenen System eines Benutzers installiert wurde. Es macht keinen Unterschied, ob die Schriftart in die Flex-Anwendung eingebettet ist, der Endbenutzer muss diese Schriftart bereits auf seinem eigenen System installiert haben, damit diese Breitenmethoden funktionieren. MX: Text.textField.getCharBoundaries ist der einzige, der es egal ist, ob es ein SystemFont ist oder nicht. (UITextField.getCharBoundaries erfordert auch, es eine Systemschriftart zu sein.)

+0

Wurde eine Umgehungslösung gefunden, die scheinbar funktioniert hat: Erstellen Sie ein unsichtbares TextField und legen Sie nur den Text in den Text, den Sie messen möchten. Setze defaultTextFormat vorher auf das gewünschte TextFormat und auch autoSize = "left". Ich habe es auch als Kind hinzugefügt, aber es scheint zu funktionieren. – Mark

Verwandte Themen