iOS: Wie messen Sie die Breite und Höhe eines Strings Quarz verwendet?
-
06-09-2019 - |
Frage
Bevor ich meine Fragen stellen, das ist von der Apple-Dokumentation Re: wie die Breite einer Zeichenkette bestimmen Quarz mit:
Wenn Text Messungen an Ihre Anwendung wichtig sind, ist es möglich, berechnen sie Funktionen Quartz 2D verwenden. Sie könnten jedoch auch zuerst mit ATSUI, deren Stärke in Textlayout betrachten und Messung. ATSUI hat mehrere Funktionen, die Textmetriken erhalten. Nicht nur können Sie nach-Layout-Textmetriken erhalten, aber in den seltenen Fällen, Sie brauchen sie, können Sie vor-Layout-Textmetriken erhalten. nicht wie Quarz, für die Sie die Berechnungen selbst durchführen müssen, ATSUI berechnet die Messungen für Sie. Zum Beispiel können Sie die erhalten Bild umschließende Rechteck für Text durch die ATSUI Funktion aufrufen ATSUMeasureTextImage.
Wenn Sie sich entscheiden, dass Quartz Text Ihre Bedürfnisse besser als ATSUI (oder Kakao), können Sie diese Schritte zur Messung der Breite des Textes folgen vor Quarz zieht es:
- Rufen Sie die Funktion CGContextGetTextPosition die aktuelle Textposition zu erhalten.
- Geben Sie den Text Zeichenmodus zu kCGTextInvisible die Funktion CGContextSetTextDrawingMode verwenden.
- Ziehen Sie den Text durch die Funktion CGContextShowText Aufruf den Text an der aktuellen Textposition zu ziehen.
- Bestimmen Sie die Endfassung Position durch die Funktion CGContextGetTextPosition aufrufen.
- Ziehen Sie die Startposition aus der Endposition die Breite des Textes zu bestimmen.
Hier sind meine Fragen:
-
Ist das wirklich der beste Weg, um die Breite einer Zeichenkette mit Core Graphics zu bestimmen? Es scheint, dünn und da mein Text koexistiert mit 2D grafischen Elementen, würde Ich mag den gleichen Kontext für all Rendering verwenden. Ich hatte gehofft, es würde einige kompakte Methode sein, wie:
CGContextGetTextWidthAndHeight(context, text);
-
Ich habe gelesen, dass ATSUI veraltet ist und geht von Core Text ersetzt werden. Ist das wahr und wenn ja, ist es in iOS?
Lösung
Auf dem iPhone SDK gibt es eine Familie von Verfahren auf NSString
das bieten, was Sie wollen.
Wie von iOS 7.0, diese Methoden sind :
- boundingRectWithSize:options:attributes:context:
- sizeWithAttributes:
Bei älteren Versionen von iOS wir diese hatten, jetzt veraltet:
– sizeWithFont:
– sizeWithFont:forWidth:lineBreakMode:
– sizeWithFont:constrainedToSize:
– sizeWithFont:constrainedToSize:lineBreakMode:
– sizeWithFont:minFontSize:actualFontSize:forWidth:lineBreakMode:
Andere Tipps
Bei der Durchführung von Operationen auf Threads außer dem UI-Thread zeichnen, müssen Sie die Technik verwenden, die Sie beschrieben. Dies ist besonders wichtig zu beachten, wenn Dinge wie CATiledLayer verwenden, die asynchron auf Hintergrund-Threads es Rendering durchführt, oder wenn aus irgendeinem anderen Grunde im Hintergrund eigene Grafiken zeichnen.
ich mit PGB zustimmen, wenn Sie den „einfachen“ Grafiken tun und Sie werden garantiert auf dem Haupt-Thread ausgeführt werden. Jedoch ist sizeWithFont das Gleiche wie die Technik tun Sie beschrieben - es tut es einfach für Sie mit UIGraphicsGetCurrentContext ()
.