2009-10-14 5 views
6

Ich zeichne einen String mit CGContextShowTextAtPoint. Also muss ich meinen NSString konvertieren, den ich in c Strings zeichnen möchte. Leider werden spezielle Symbole wie das Euro-Währungssymbol nicht korrekt angezeigt.Konvertieren eines NSString in eine cString für die Verwendung mit CGContextShowTextAtPoint

CGContextSelectFont(currentContext, "TrebuchetMS", 15, kCGEncodingMacRoman); 

CGContextShowTextAtPoint(currentContext, 0, 0, [myString cStringUsingEncoding:[NSString defaultCStringEncoding]], [myString length]); 

Ich versuchte es mit der kCGEncodingFontSpecific Codierung in der CGContextSelectFont Funktion aber, dass entweder nicht funktioniert hat.

Aus Leistungsgründen muss ich die CG-Funktion verwenden, nicht die DrawInRect-Funktionen von NSString.

Vielleicht können Sie mir helfen!

PS: Ich weiß, dass dies ein oft ausgestelltes Thema ist, aber ich kann, warum ich es nicht herausfinden, nicht funktioniert ...

+1

Zwei Dinge: 1. es gibt keine Garantie, dass defaultCStringEncoding entweder UTF-8 oder MacRoman ist, und 2. die als letztes Argument an CGContextShowTextAtPoint() übergebene Länge sollte die Länge der C-Zeichenfolge in Bytes und nicht die Zeichenlänge sein der NSString. –

+1

Ja, für die MacRoman-Codierung sollten Sie NSMacOSRomanStringEncoding anstelle von [NSString defaultCStringEncoding] verwenden. –

Antwort

6

Die „Sonderzeichen“ Sie durch die Unicode unterstützt Codierung erhalten kann, sind unter Bezugnahme auf von NSString, aber nicht die MacRoman-Codierung, die von Ihren Zeichensatzroutinen für Core Graphics verwendet wird (die einzigen beiden Codierungen, die Sie mit CGContextSelectFont() festlegen können, sind kCGEncodingMacRoman und kCGEncodingFontSpecific). Das ist der Nachteil der CGContextShowTextAtPoint() - Route zum Zeichnen von Text. Aus diesem Grund benutze ich die NSString-Methode drawAtPoint: immer dann, wenn ich Text innerhalb eines Core Graphics-Kontextes manuell zeichnen muss.

Soweit die Leistung geht, in einem Kommentar auf an earlier answer, hatte Kyle BenchmarkAndPoint: wie Zeichnen 75 Mal pro Sekunde gegen CGContextShowTextAtPoint() Zeichnung 99 Mal pro Sekunde. Das ist kein großer Unterschied in der Zuggeschwindigkeit, also gewinnst du nicht viel, indem du so gehst. Nach meiner Erfahrung war -drawAtPoint: für meine Anwendungen mehr als schnell genug.

EDIT (14.10.2009): Wie von Sixten Otto aufgezeigt, habe ich meinen eigenen Code falsch gelesen. UTF-8 unterstützt den vollen Zeichenbereich, das MacRoman der Schriftart nicht.

+0

Jedes Unicode-Zeichen kann in UTF-8 ausgedrückt werden. –

+0

Also wäre das Problem nicht gelöst, wenn ich meine NSStrings in c-Strings mit Unicode-Encodierung konvertiert hätte? – Erik

+0

Hängt davon ab, ob die CoreGraphics-Textzeichnung a) Unicode-fähig ist und b) fehlende Glyphen aus anderen Schriften bezieht. TrebuchetMS enthält möglicherweise keine Zeichen für alle Zeichen, die Sie zeichnen möchten. Auch hier wären Sie mit den NSString-Methoden viel besser dran. –