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.

War es hilfreich?

Lösung

Core können Ihnen helfen:

  1. CTFontGetGlyphsForCharacters (iOS 3.2 an) Karten Unicode-Zeichen Glyphen
  2. 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);
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top