【问题标题】:How can I draw rotated text without being limited to the MacRoman character set?如何在不受 MacRoman 字符集限制的情况下绘制旋转文本?
【发布时间】:2010-01-29 16:39:47
【问题描述】:

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

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

效果很好,它可以满足我的所有需求,除了因为它使用 CGContextSelectFont(),它将文本输出限制为 MacRoman。那是德苏克。

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

-(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];
}

【问题讨论】:

  • 艾伦:浏览了你的博文。你说你需要 const char * 并且很难得到它们。 NSString 有一个方法-cStringUsingEncoding:,它似乎可以直接做你需要的事情(请参阅有关它的内存管理的文档)。仅供参考。

标签: iphone core-graphics quartz-graphics


【解决方案1】:

我自己做了几天后 =)

我就是这样解决的:

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

【讨论】:

  • 你能解释一下我将如何使用它吗?我可能必须创建一个我不熟悉的图层。以及如何设置 180 度以外的旋转。我想我应该提到我是一个完全的数学白痴。可能是为什么我在一年的尝试中无法解决这个问题。
  • @Allen:所有 UIView 都由核心动画层支持,该层可通过 .layer 属性访问。 360 度等于 2*pi 弧度。 180 度是 pi,即 3.1415。
  • 好的,如果我在 UIView 中绘图,这将起作用。但似乎我无法使我的原始 API 工作,即绘制到当前上下文中,因为它可能不是是一个视图。如果有人知道如何在不一定是视图的上下文中进行这项工作,我很想听听。
  • 嗯,这行代码的基本概念是您操作核心动画层的变换。因此,如果您使用 Core Animation 层,此代码将起作用。 (我对 Core Animation YET 还不是很有经验,但这对我来说是一个不错的小开始 =)
  • 我建议使用 M_PI 常数来获得更准确的 pi 切片。
【解决方案2】:

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

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

【讨论】:

  • 听起来不错,但我做不到。我删除了这一行: CGContextShowText(ctxt, tbuf.c_str(), tbuf.length());并将其替换为: UIGraphicsPushContext(ctxt); [self drawAtPoint:point withFont:font]; UIGraphicsPopContext();进行这些更改后,将绘制文本,但不再旋转。我还尝试删除 contextFont() 调用,但这两种方式都没有效果。我正在 iPhone 模拟器中进行测试。
  • Allen Brunson:好吧,既然您的问题中有代码,我可以看到您不需要设置当前上下文,因为您从 UIGraphicsGetCurrentContext 获得了上下文——也就是说,它已经当前的。所以,剪掉PushContextPopContext 调用,只使用UIKit 绘图方法。 “UIKit 不提供以标准水平方向以外的任何其他方向绘制文本的方法。” …在上下文的坐标系中,您可以通过更改其上下文的当前变换矩阵来旋转它。
  • 对不起,这也不起作用! (自从我第一次发布该代码示例以来,它就一直存在问题中。)我正在尝试重新投入我的大脑,我想我在最初编写该类别时尝试过这个。 UIStringDrawing 方法似乎不尊重当前上下文的旋转。这就是我使用低级 CG 方法的原因。我很想在这里被证明是错误的。也许还有其他一些细节我弄错了?写一个替换我的方法,但是以不同的旋转绘制文本,你就赢得了互联网。
  • 你能用 UIKit 字符串绘制语句展示修改后的方法吗?
  • 给你:platinumball.net/txt/textdrawing.txt 回顾一下:我粘贴到问题中的方法有效,除了文本仅限于 MacRoman。我在那里给出的链接中显示的方法有效,除了文本没有旋转。
猜你喜欢
  • 2016-04-12
  • 1970-01-01
  • 2015-03-23
  • 1970-01-01
  • 1970-01-01
  • 2013-07-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多