Begrenzungsrahmen für Zeichen mit diakritischen Zeichen unter Verwendung von CoreText

8

Ich versuche, die Bounding Box eines Charakters in MacOS X / iOS mit verschiedenen Techniken zu erhalten. Ich präsentiere jetzt alle meine Versuche. Bis jetzt schlägt der Code fehl, wenn ich die Größe von diakritischen Zeichen wie "Ä" bekommen möchte.

Verwendung von CTFontGetBoundingRectsForGlyphs

%Vor%

Ergebnis Es funktioniert irgendwie, aber es gibt einige Lücken, während das Glyph vom CATextLayer gerendert wird

Verwendung von CTFramesetterSuggestFrameSizeWithConstraints

%Vor%

Ergebnis Der Begrenzungsrahmen der Zeichenfolge ist korrekt. Es wird problematisch mit diakritischen Zeichen: das Ä fehlt seine Punkte, weil die Bounding Box nicht groß genug ist.

Verwendung von CTLineGetTypographicBounds

%Vor%

Ergebnis Der Begrenzungsrahmen der Zeichenfolge ist korrekt. Es wird problematisch mit diakritischen Zeichen: das Ä fehlt seine Punkte, weil die Bounding Box nicht groß genug ist.

Verwendung von CTFontGetBoundingRectsForGlyphs

%Vor%

Ergebnis Der Begrenzungsrahmen der Zeichenfolge ist korrekt. Es wird problematisch mit Diakritika, da die Diakritika selbst eine Glyphe und das Zeichen eine andere Glyphe sind, was bedeutet, dass Ä aus zwei Glyphen besteht. Wie könnte man das benutzen?

Gibt es noch andere Möglichkeiten, die ich übersehen habe und die es sich zu versuchen lohnt?

BEARBEITEN

Die dritte Option CTLineGetTypographicBounds scheint zu funktionieren. Ich laufe jedoch in einem anderen Problem, dass der ersten Zeile in einem CATextLayer die diakritischen Zeichen fehlen. Die erste Zeile ist irgendwie einfach nicht groß genug. Das würde bedeuten, dass ich hier den falschen Baum anbreche.

    
GorillaPatch 08.05.2012, 20:02
quelle

2 Antworten

4

Im ersten Beispiel scheinen Sie die Tatsache zu ignorieren, dass das umgebende Rechteck für Glyphen sehr wahrscheinlich einen negativen y-Ursprung hat. Das zurückgegebene Rect behandelt normalerweise y=0 als Basis für Text. Sie setzen also einen Offset in Grenzen rect und das ist wahrscheinlich auch der Grund, dass die Ebene einen Offset im Text hat. (habe es nicht versucht, denke aber so)

Wenn Sie nicht an den Grenzen eines bestimmten Textes interessiert sind, sondern eine Höhe wählen, die alle Arten von Text einschließt, können Sie auch nach CTFontGetBoundingBox suchen.

    
Max Seelemann 10.05.2012, 06:16
quelle
4

Versuchen Sie CTLineGetImageBounds. Beachten Sie jedoch, dass dies Teile eines Glyphs enthält, die sich unterhalb der Grundlinie erstrecken, was beispielsweise für den Kleinbuchstaben ä relevant ist.

Kurze Erklärung: Abgerundete Formen müssen sich über gerade Formen hinaus erstrecken, um mit dem gleichen visuellen Gewicht erscheinen zu können. Siehe zum Beispiel Kleinbuchstaben b oder d, die an der Grundlinie eine runde und eine gerade Form haben.

    
Martin Winter 10.05.2012 06:13
quelle

Tags und Links