2009-08-06 55 views
8

我正在使用我使用CGContextShowTextAtPoint在屏幕上顯示文字的應用程序。我還想顯示日文字符,但CGContextShowTextAtPoint需要輸入一個C字符串。所以要麼A)如何將日文字符更改爲C字符串?如果這是不可能的,B)如何手動將日文字符打印到屏幕上(在drawRect方法中)。Iphone CGContextShowTextAtPoint日文字符

在此先感謝。

回答

5

CoreText可以幫助你:

  1. CTFontGetGlyphsForCharacters(iOS 3.2起)映射Unicode字符到字形
  2. CTFontDrawGlyphs(iOS 4.2的起)繪製的字形變成CGContext上。

NB。 CGContextShowGlyphs應該可以工作,但我從來沒有找到方法將我的UniChars轉換爲字形。更多關於該here

古代,前期的iOS 3.2的答案

你需要使用的UIKit這一點。

檢出[NSString drawAtPoint:...]開始。

這個SO question也很有用。

我不知道他們在用CoreGraphic文本的東西在想什麼,它沒用。

+0

謝謝:)!在閱讀了Docs之後,我似乎已經沿着NSAttributedString類的代碼編寫了一些東西,所以我想現在我應該將所有代碼切換到: – kiyoshi 2009-08-06 08:52:48

+0

不用客氣。ps iPhone上沒有NSAttributeString,所以看看NSLabel。 – 2009-08-06 09:01:19

+0

核心圖形文本繪圖程序已經在Mac上存在了很長一段時間,在Unicode支持變得很普遍之前我猜測,所以他們只支持他們所做的字符集並不奇怪。您也可以使用CGContextShowGlyphsAtPoint()來打印自定義字符,但挑戰是在iPhone上生成字形。這篇文章有一個例子:http://www.gogo-robot.com/devblog/?p=5 – 2009-08-06 13:08:38

1

爲了什麼是值得的,我花了很長時間試圖讓日本人在CoreGraphics中很好地工作,並且不喜歡它離開我的地方。

最後我切換到使用UILabels處理文本。我需要的所有類似CoreGraphics的東西都可以使用動畫支持進行復制,最終得到的代碼更加簡單。

它可能不適合您的情況,但值得考慮。

3

我能夠通過使用CGFontGetGlyphsForUnichars的重新實現由延Egeblad得到這個工作:

// 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); 

然後你:GlyphDrawing.mm

在日文字體從應用程序包的OTF文件先裝可以將您的unichar文本轉換爲字形並繪製它們:

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]); 
+1

Where我可以下載GlyphDrawing.mm嗎?鏈接被破壞。 – 2013-07-05 04:46:19

0

這可能會幫助您%topic starter%。感謝Rhythmic Fistman的偉大建議!

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