如何绘制旋转文本而不限于MacRoman字符集?

时间:2010-01-29 16:39:48

标签: iphone core-graphics quartz-graphics

我之前在这里提到过我的博客作为问题的答案。我无法链接到其中一个,因为这个表格声称我是垃圾邮件发送者。叹。无论如何,现在我想写一篇关于绘制旋转文本的权威博客文章,所以它也可以用于答案(嘿)。这是我的第一次尝试:

http://www.platinumball.net/blog/2009/06/01/drawing-nsstrings-in-unusual-rotations/

效果很好,它可以完成我想要的一切,除了因为它使用了CGContextSelectFont(),它将文本输出限制为MacRoman。那是Teh Sukk。

我近一年来一直在寻找这个问题的答案,包括多次搜索这个网站,但没有成功。我见过的例子似乎与我想要的很接近,但显然我太愚蠢了,不能屈服于我的意志。我在我编写的NSString类中包含了main方法,它显示了我正在做的事情。如果您需要查看其余代码,可以从我上面给出的博客链接下载。谢谢......

-(void)drawAtPoint:(CGPoint)point withFont:(UIFont*)font
 orientation:(WBOrientation)orient
{
    CGContextRef       ctxt = [self contextSave];
    const std::string  tbuf = toStdString(self, NSMacOSRomanStringEncoding);
    CGAffineTransform  tran = CGAffineTransformMake(1, 0, 0, -1, 0, 0);

    switch (orient)
    {
        case WBOrientUp:
        // nothing to do
        break;

        case WBOrientDown:
        tran = CGAffineTransformRotate(tran, degreesToRadians(180.0));
        break;

        case WBOrientLeft:
        tran = CGAffineTransformRotate(tran, degreesToRadians(90.0));
        break;

        case WBOrientRight:
        tran = CGAffineTransformRotate(tran, degreesToRadians(-90.0));
        break;

        default:
        assert(false);
        break;
    }

    contextFont(ctxt, font);
    CGContextSetTextDrawingMode(ctxt, kCGTextFill);
    CGContextSetTextMatrix(ctxt, tran);
    CGContextSetTextPosition(ctxt, point.x, point.y);
    CGContextShowText(ctxt, tbuf.c_str(), tbuf.length());

    [self contextRestore:ctxt];
}

2 个答案:

答案 0 :(得分:1)

我自己做了几天后才开始=)

这就是我解决它的方式:

view.layer.transform = CATransform3DRotate(view.layer.transform, 3.1415, 0,0,1); // this is for 180 degrees.

答案 1 :(得分:1)

使用the UIGraphicsPushContext function然后draw the string using UIKit将CGContext设置为当前图形上下文,然后使用the UIGraphicsPopContext function将上下文从堆栈中弹回。

AppKit(Mac)解决方案基本相同,步骤1使用NSGraphicsContext,步骤2使用AppKit's NSString additions。对于-[NSView drawRect:]中的窗口上下文,步骤3消失(你会在步骤1中从NSGraphicsPort获取CGContext,意味着它已经设置);对于其他上下文,例如位图或PDF上下文,您将在步骤1和步骤3中使用相同的NSGraphicsPort方法(setCurrentContext:)。