CTFramesetterSuggestFrameSizeWithConstraints () von Core Text gibt immer die falsche Größe zurück

7

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

    
nsapplication 25.04.2010, 09:02
quelle

5 Antworten

13

versuche das .. scheint zu funktionieren:

%Vor%     
ing.conti 18.11.2010 12:58
quelle
5

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:

%Vor%

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 .

    
mohsenr 05.05.2010 02:45
quelle
3

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.

    
Chris DeSalvo 04.04.2012 21:21
quelle
0

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.

    
Sepehr Mahmoudian 04.09.2011 08:04
quelle
0

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).

    
andlabs 07.01.2017 18:17
quelle

Tags und Links