2009-08-06 40 views
8

Tôi đang làm việc trên một ứng dụng mà tôi đang sử dụng CGContextShowTextAtPoint để hiển thị văn bản cho màn hình. Tôi cũng muốn hiển thị các ký tự tiếng Nhật, nhưng CGContextShowTextAtPoint lấy làm đầu vào của nó là một chuỗi C. Vì vậy, hoặc là A) Làm thế nào để thay đổi các ký tự tiếng Nhật thành một chuỗi C? Nếu điều này là không thể, B) Làm thế nào tôi có thể tự in các ký tự tiếng Nhật vào màn hình (trong phương thức drawRect).Iphone CGContextShowTextAtPoint cho các ký tự tiếng Nhật

Xin cảm ơn trước.

Trả lời

5

CoreText có thể giúp bạn:

  1. CTFontGetGlyphsForCharacters (iOS 3.2 trở đi) bản đồ ký tự Unicode để glyphs
  2. CTFontDrawGlyphs (iOS 4.2 trở đi) rút glyphs thành một CGContext.

NB. CGContextShowGlyphs nên hoạt động, nhưng tôi chưa bao giờ tìm thấy cách chuyển đổi UniChars thành glyph. Thêm vào đó here:

cổ đại, trước khi iOS 3.2 Câu trả lời

bạn cần phải sử dụng UIKit cho việc này.

Khám phá [NSString drawAtPoint:...] để bắt đầu.

Điều này cũng có ích SO question.

Tôi không biết họ đang nghĩ gì với công cụ văn bản CoreGraphic, nó vô dụng.

+0

Cảm ơn :)! Sau khi đọc một chút về Tài liệu, có vẻ như tôi đã mã hóa một cái gì đó dọc theo dòng của lớp NSAttributedString vì vậy tôi đoán bây giờ tôi nên chuyển đổi tất cả mã của tôi thành: ( – kiyoshi

+0

) Chào mừng bạn. Không có NSAttributeString trên iPhone, vì vậy hãy kiểm tra NSLabel. –

+0

Các thói quen vẽ văn bản đồ họa cốt lõi đã tồn tại trên Mac trong một thời gian dài, tôi đoán trước khi hỗ trợ Unicode trở nên phổ biến, do đó, nó không quá ngạc nhiên khi họ chỉ hỗ trợ bộ ký tự mà họ làm. Bạn cũng có thể in các ký tự tùy chỉnh bằng CGContextShowGlyphsAtPoint(), nhưng thử thách đang tạo ra các glyph trên iPhone. Bài viết này có một ví dụ: http://www.gogo-robot.com/devblog/?p=5 –

1

Đối với những gì nó đáng giá, tôi đã dành một thời gian dài cố gắng để có được các ký tự tiếng Nhật để làm việc tốt trong CoreGraphics, và không thích nơi nó để lại cho tôi.

Cuối cùng, tôi đã chuyển sang sử dụng UILabels để xử lý văn bản. Tất cả những thứ giống như CoreGraphics mà tôi cần có thể được nhân rộng bằng cách sử dụng sự hỗ trợ chuyển đổi hoạt hình & và cuối cùng mã kết quả đơn giản hơn rất nhiều.

Điều này có thể không phù hợp với hoàn cảnh của bạn, nhưng đáng xem xét.

3

tôi đã có thể làm việc này bằng cách sử dụng một reimplementation của CGFontGetGlyphsForUnichars bởi Jens Egeblad: GlyphDrawing.mm

tải đầu tiên trong một phông chữ tiếng Nhật như một tập tin OTF từ gói ứng dụng:

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

Sau đó, bạn có thể chuyển đổi văn bản unichar thành glyphs và vẽ chúng:

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

Ở đâu tôi có thể tải xuống GlyphDrawing.mm không? Liên kết bị hỏng. –

0

Điều này có thể giúp bạn% đề tài khởi động%. Cảm ơn Rhythmic Fistman vì lời khuyên tuyệt vời!

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); 
Các vấn đề liên quan