iPhone - 使用CGContextShowTextAtPoint绘制特殊字符

时间:2011-08-25 12:03:33

标签: iphone objective-c cocoa-touch uilabel

我正在为UILabel创建子类来调整字符间距。它运作良好。 但是当我使用西班牙语或日语的特殊字符时,它不是写作。只有英文字符写得正确。关于如何显示它们的任何解决方案?

- (void) drawRect:(CGRect)rect 
{

    // Drawing code
    CGContextRef context = UIGraphicsGetCurrentContext();
    CGContextSelectFont (context, [self.font.fontName cStringUsingEncoding:NSUTF8StringEncoding], self.font.pointSize, kCGEncodingMacRoman);
    CGContextSetCharacterSpacing(context, -1);
    CGContextSetFillColorWithColor(context, [[UIColor clearColor] CGColor]);
    CGAffineTransform myTextTransform = CGAffineTransformScale(CGAffineTransformIdentity, 1.f, -1.f );
    CGContextSetTextMatrix (context, myTextTransform);

    // draw 1 but invisbly to get the string length.
    const char* str = [self.text UTF8String];

    CGPoint p = CGContextGetTextPosition(context);
    float centeredY = (self.font.pointSize + (self.frame.size.height - self.font.pointSize)/2)-2;
    CGContextShowTextAtPoint(context, 0, centeredY, str, [self.text length]);
    CGPoint v = CGContextGetTextPosition(context);

    float centeredX = 0;
    if (self.centered) {
        float width = v.x - p.x;
        centeredX = (self.frame.size.width- width)/2;
    }
    // calculate width and draw second one.
    CGContextSetFillColorWithColor(context, [self.textColor CGColor]);
    CGContextShowTextAtPoint(context, centeredX, centeredY, str, [self.text length]);
}

2 个答案:

答案 0 :(得分:1)

CGContextShowTextAtPoint不直接支持这些语言 - MacRoman编码可能是一个提示。 CG只有基本的文本布局/绘图。

两个替代方案是Cocoa的文本绘图,或CoreText。

答案 1 :(得分:1)

迟到总比没有好;

使用CoreText代替drawFonts(特殊字符和Unicode)     http://developer.apple.com/library/ios/#documentation/GraphicsImaging/Conceptual/drawingwithquartz2d/dq_text/dq_text.html#//apple_ref/doc/uid/TP30001066-CH213-TPXREF101         “iOS 3.2及更高版本和Mac OS X都支持Core Text,这是一种用于布局文本和处理字体的高级低级技术.Core Text专为高性能和易用性而设计,允许您将Unicode文本直接绘制到图形如果您正在编写需要精确控制文本显示方式的应用程序,请参阅“核心文本编程指南”。“