Iphone CGContextShowTextAtPoint für japanische Schriftzeichen
Frage
Ich arbeite an einer Anwendung, wo ich CGContextShowTextAtPoint
bin mit Text auf dem Bildschirm angezeigt werden soll. Ich möchte auch japanische Schriftzeichen angezeigt, aber CGContextShowTextAtPoint
nimmt als seine Eingabe ein C-String. Also entweder A) Wie kann ich japanische Zeichen in einem C-String ändern? Wenn dies nicht möglich ist, B) Wie kann ich manuell japanische Zeichen auf den Bildschirm (innerhalb der drawRect Methode drucken).
Vielen Dank im Voraus.
Lösung
Core können Ihnen helfen:
-
CTFontGetGlyphsForCharacters
(iOS 3.2 an) Karten Unicode-Zeichen Glyphen -
CTFontDrawGlyphs
(iOS 4.2 an) zieht die Glyphen in eine CGContext.
NB. CGContextShowGlyphs
sollte funktionieren, aber ich fand nie einen Weg, um meine Unichars zu Glyphen zu konvertieren. Mehr zu diesem hier :
Historisch, vor iOS 3.2 Antwort
Sie müssen UIKit hierfür verwenden.
Überprüfen Sie heraus [NSString drawAtPoint:...]
, um loszulegen.
Das SO Frage nützlich ist, auch.
Ich weiß nicht, was sie mit dem CoreGraphic Text Sachen dachten, es ist nutzlos.
Andere Tipps
Ich konnte diese Funktion erhalten, indem eine Neuimplementierung von CGFontGetGlyphsForUnichars von Jens Egeblad mit: GlyphDrawing.mm
Laden Sie zunächst in einer japanischen Schrift als OTF-Datei aus dem App-Bundle:
// Load font file from otf file
NSString *fontPath = [[NSBundle mainBundle] pathForResource:@"HStdNW8" ofType:@"otf"];
CGDataProviderRef fontDataProvider = CGDataProviderCreateWithFilename([fontPath UTF8String]);
CGFontRef _cgFont = CGFontCreateWithDataProvider(fontDataProvider);
CGDataProviderRelease(fontDataProvider);
Dann können Sie Ihre unichar Text Glyphen konvertieren und ziehen sie:
NSString *text = @"日本語"
CGContextSetFont(context, _cgFont);
CGContextSetFontSize(context, 12);
CGGlyph textGlyphs[[text length]];
unichar textChars[[text length]];
for(int i = 0; i < [text length]; i++) {
textChars[i] = [text characterAtIndex:i];
}
CMFontGetGlyphsForUnichars(_cgFont, textChars, textGlyphs, [text length]);
CGContextShowGlyphsAtPoint(context, xCoord, yCoord, textGlyphs, [text length]);
Für das, was es wert ist, verbrachte ich eine lange Zeit versucht, japanische Schriftzeichen zu bekommen in Core Graphics funktionieren gut, und wusste nicht wie, wo er mich verlassen hat.
Am Ende wechselte ich zu UILabels mit dem Text zu behandeln. Alle Core Graphics-ähnliche Sachen, die ich brauchte repliziert werden, um die Transformation und Animation Unterstützung verwendet wird, und am Ende der resultierende Code war viel einfacher.
Es kann für Ihre Situation nicht angemessen sein, aber es ist eine Überlegung wert.
Das vielleicht hilft Ihnen% Thema Starter%. Dank Rhythmische Fistman für gute Ratschläge!
CGContextRef context = UIGraphicsGetCurrentContext();
CGContextSelectFont (context, [self.font.fontName cStringUsingEncoding:NSASCIIStringEncoding], self.font.pointSize, kCGEncodingMacRoman);
CGContextSetCharacterSpacing(context, characterSpacing);
CGContextSetFillColorWithColor(context, [self.textColor CGColor]);
CGAffineTransform myTextTransform = CGAffineTransformScale(CGAffineTransformIdentity, 1.f, -1.f );
CGContextSetTextMatrix (context, myTextTransform);
CGGlyph glyphs[self.text.length];
CTFontRef fontRef = CTFontCreateWithName((CFStringRef)self.font.fontName, self.font.pointSize, NULL);
CTFontGetGlyphsForCharacters(fontRef, (const unichar*)[self.text cStringUsingEncoding:NSUnicodeStringEncoding], glyphs, self.text.length);
float centeredY = (self.font.pointSize + (self.frame.size.height- self.font.pointSize)/2)-2;
CGContextShowGlyphsAtPoint(context, rect.origin.x, centeredY, (const CGGlyph *)glyphs, self.text.length);
CFRelease(fontRef);