2009-08-06 4 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

Спасибо :)! Прочитав немного в Документах, кажется, что я закодировал что-то в соответствии с классом NSAttributedString, поэтому, я думаю, теперь я должен переключить весь свой код на это :( – kiyoshi

+0

Добро пожаловать. Ps На iPhone нет NSAttributeString, поэтому ознакомьтесь с NSLabel. –

+0

Процедуры рисования графических объектов Core Graphics давно существуют на Mac, я догадываюсь о том, что поддержка Unicode стала обычной, поэтому неудивительно, что они поддерживают только набор символов, который они выполняют. Вы также можете печатать пользовательские символы с помощью CGContextShowGlyphsAtPoint(), но проблема заключается в создании глифов на iPhone. У этого поста есть пример: http://www.gogo-robot.com/devblog/?p=5 –

1

Для чего это стоит, я потратил много времени на то, чтобы заставить японских персонажей хорошо работать в CoreGraphics, и мне не понравилось, где он оставил меня.

В конце я переключился на использование UILabels для обработки текста. Вся необходимая мне CoreGraphics информация могла быть реплицирована с использованием поддержки анимации преобразования &, и в итоге полученный код был намного проще.

Возможно, это не подходит для вашей ситуации, но это стоит учитывать.

3

Я был в состоянии получить эту работу, используя переопределение CGFontGetGlyphsForUnichars Йенс Egeblad: GlyphDrawing.mm

Первой загрузка в японском шрифте в виде файл OTF из приложения пачки:

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

Тогда вы может преобразовать ваш 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

Где можно загрузить GlyphDrawing.mm? Ссылка сломана. –

0

Это может помочь вам% topic starter%. Благодаря Ритмичному Фистману за отличный совет!

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