【问题标题】:How to rotate text drawn by Quartz on iPhone如何在 iPhone 上旋转 Quartz 绘制的文字
【发布时间】:2010-12-26 08:47:40
【问题描述】:

我想用 Quartz 画一些文字。现在应用程序绘制 ,但我希望它显示为“0123456789”。有什么方法可以显示它的正常方向吗?

这是我的代码:

    //set image view
 drawImage = [[UIImageView alloc] initWithImage:nil];
 drawImage.frame = self.view.frame;
 [self.view addSubview:drawImage];

 UIGraphicsBeginImageContext(self.view.frame.size);  // begin
 // current context
 CGContextRef context = UIGraphicsGetCurrentContext();

 CGContextSelectFont(context, "Courier", 40,  kCGEncodingMacRoman);
 CGFloat white[] = {1.0, 1.0, 1.0, 1.0};
 CGContextSetFillColor(context, white);
 CGContextShowTextAtPoint(context, 0, 30, "0123456789", strlen("0123456789"));

 // get image
 drawImage.image = UIGraphicsGetImageFromCurrentImageContext();
 UIGraphicsEndImageContext();    // end

【问题讨论】:

    标签: iphone objective-c text rotation quartz-graphics


    【解决方案1】:

    在 Quartz 中,图像会上下颠倒,因为它的 Y 轴是倒置的。

    iPhone 的 Y 轴从上到下为正,即原点位于左上角,而在 Quartz 和 OpenGL 中,坐标与良好的旧几何图形相同,即原点位于左下角。

    这里是一些解决 Quartz 反演问题的代码:

    CGContextRef ctx = UIGraphicsGetCurrentContext();
    // Tanslate and scale upside-down to compensate for Quartz's inverted coordinate system
    CGContextTranslateCTM(ctx, 0.0, rect.size.height);
    CGContextScaleCTM(ctx, 1.0, -1.0);
    

    这是一篇有趣的帖子,作者说新加坡的一个团队因为这个他们无法弄清楚的反转问题而放弃了一个 iPhone 项目:http://trandangkhoa.blogspot.com/2009/07/iphone-os-drawing-image-and-stupid.html

    【讨论】:

    • 非常感谢!
    【解决方案2】:

    另一种处理方法是将 Quartz 文本绘制代码(从 CGSelectFont() 到 CGContextShowTextAtPoint ())替换为类似

    [text drawAtPoint:CGPointMake(0.0f, 30.0f) withFont:[UIFont fontWithName:@"Courier" size:40.0f]];
    

    其中 text 是一个 NSString。在 iPhone 上,-drawAtPoint:withFont: 自动翻转文本以考虑 UIView 的倒 Y 轴。

    与纯 Quartz 文本绘图中的 MacRoman 编码相比,这种方法具有处理更广泛字符集的优势。但是,速度稍慢。

    【讨论】:

    • 肯定更慢,更慢,“测量并找出”更慢?只是想知道:如果可能,我确实喜欢短代码。
    • @Yar - 不幸的是,速度明显变慢了。系统似乎使用web渲染核心函数来显示文本,这里Quartz绘图调用直接绘制文本。这是完整的 Unicode 支持和快速绘图之间的权衡。有一种方法可以通过在 Mac 上预渲染字形并为它们提供每种字体和大小的应用程序来解决这个问题,但我自己没有尝试过。
    • 谢谢。我将保留此线程以进行优化。
    【解决方案3】:

    “将它们旋转到正常模式”到底是什么意思?

    假设您只是指在 2D 空间内旋转,您通常会使用变换矩阵。看看CGAffineTransformMakeRotation

    您可以将其应用到视图本身(通过设置transform 属性),或应用到您拥有的 CG 上下文。

    【讨论】:

    • 嗯...我截屏以使问题更清楚。我想画 0123456789 但结果是上图。我认为单次轮换不适用于此问题。我需要镜像当前图像并旋转它。
    • 对,是的,我现在明白了。在那种情况下,Chintan 的回答是准确的。
    【解决方案4】:

    这解决了我的问题

    CGContextSetTextMatrix(context, CGAffineTransformMake(1.0,0.0, 0.0, -1.0, 0.0, 0.0));
    

    【讨论】:

      猜你喜欢
      • 2010-10-09
      • 2010-12-14
      • 1970-01-01
      • 2010-11-08
      • 1970-01-01
      • 1970-01-01
      • 2013-08-10
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多