Gemäß den Dokumenten bestimmt CTFramesetterSuggestFrameSizeWithConstraints ()
"die Rahmengröße, die für einen Zeichenfolgenbereich benötigt wird".
Leider ist die von dieser Funktion zurückgegebene Größe nie genau. Hier ist was ich mache:
%Vor%Die zurückgegebene Größe hat immer die richtige Breite, die Höhe ist jedoch immer etwas kürzer als erwartet.
Ist dies der richtige Weg, diese Methode zu verwenden?
Gibt es eine andere Möglichkeit, Core Text zu gestalten?
Scheint, ich bin nicht der Einzige, der Probleme mit dieser Methode hat. Siehe Ссылка .
Bearbeiten:
Ich habe die gleiche Zeichenkette mit Quartz mit sizeWithFont:
gemessen und die Schriftart sowohl der attributierten als auch der Quartz-Zeichenkette zugewiesen. Hier sind die Messungen, die ich erhalten habe:
Kerntext: 133.569336 x 16.592285
Quarz: 135,000000 x 31,000000
Versuchen Sie für einen einzelnen Zeilenrahmen:
%Vor%Für mehrzeilige Frames müssen Sie auch den Zeilenumbruch hinzufügen (siehe Beispielcode in Kerntext-Programmieranleitung )
Aus irgendeinem Grund verwendet CTFramesetterSuggestFrameSizeWithConstraints()
die Differenz zwischen Aufstieg und Abstieg, um die Höhe zu berechnen:
Es könnte ein Fehler sein?
Ich habe einige andere Probleme mit der Breite des Rahmens; Es lohnt sich, es auszuprobieren, da es nur in speziellen Fällen angezeigt wird. Weitere Informationen finden Sie unter diese Frage .
Das Problem ist, dass Sie einen Absatzstil auf den Text anwenden müssen, bevor Sie ihn messen. Wenn Sie dies nicht tun, erhalten Sie den Standardwert von 0,0. Ich habe ein Codebeispiel für meine Antwort auf ein Duplikat dieser Frage hier Ссылка zur Verfügung gestellt.
Es mag seltsam erscheinen, aber ich habe festgestellt, dass es immer funktioniert, wenn Sie ceil
function zuerst verwenden und dann +1 zur Höhe addieren. Viele APIs von Drittanbietern verwenden diesen Trick.
Auferstehung.
Wenn man anfänglich feststellt, wo Linien innerhalb eines Rahmens platziert werden sollen, scheint Kerntext den Aufstieg + Abstieg für die Zwecke der Linienursprungberechnung zu massieren. Insbesondere scheint es, als ob 0,2 * (Aufstieg + Abstieg) zum Aufstieg hinzugefügt wird, und dann werden sowohl der Abstieg als auch der resultierende Aufstieg um floor(x + 0.5)
modifiziert, und dann werden die Grundlinienpositionen basierend auf diesen angepassten Anstiegen und Abstiegen berechnet. Beide dieser Schritte sind von bestimmten Bedingungen betroffen, deren Natur ich nicht sicher bin, und ich habe auch schon vergessen, an welcher Stelle Absatzstile berücksichtigt werden, obwohl ich erst vor ein paar Tagen darüber nachgedacht habe.
Ich habe mich bereits damit abgefunden, nur eine Linie in Betracht zu ziehen, die an der Basislinie beginnt und nicht versucht, herauszufinden, wo die tatsächlichen Linien landen. Leider scheint dies immer noch nicht genug zu sein: Absatzstile spiegeln sich nicht in CTLineGetTypographicBounds()
wider, und einige Schriften wie Klee, die ungleich null Zeichen haben, überqueren den Pfad rect! Ich bin mir nicht sicher, was ich tun soll ... wahrscheinlich für eine andere Frage.
AKTUALISIEREN
Es scheint, dass CTLineGetBoundsWithOptions(line, 0)
die richtigen Liniengrenzen erhält, aber nicht ganz vollständig: Es gibt eine Lücke zwischen den Linien, und bei einigen Schriften (Klee wieder) ist die Lücke negativ und die Linien überlappen ... Nicht sicher, was zu tun ist darüber. : | Zumindest sind wir etwas näher dran ??
Und selbst dann berücksichtigt es immer noch keine Absatzstile & gt;: |
CTLineGetBoundsWithOptions()
ist auf der Dokumentationswebsite von Apple nicht aufgeführt, möglicherweise aufgrund eines Fehlers in der aktuellen Version des Dokumentationsgenerators. Es ist jedoch eine vollständig dokumentierte API - Sie finden sie in den Header-Dateien und sie wurde auf der WWDC 2012-Sitzung 226 ausführlich besprochen.
Keine der Optionen ist für uns relevant: Sie reduzieren die Grenzen, indem Sie bestimmte Schriftdesignoptionen berücksichtigen (oder erhöhen Sie die Grenzen rect zufällig, im Falle der neuen kCTLineBoundsIncludeLanguageExtents
). Eine nützliche Option im Allgemeinen ist jedoch kCTLineBoundsUseGlyphPathBounds
, was äquivalent zu CTLineGetImageBounds()
ist, aber ohne Angabe von CGContext
(und somit ohne einer vorhandenen Textmatrix oder CTM unterliegen zu müssen).
Tags und Links cocoa cocoa-touch core-text