【问题标题】:Draw rotated text to parent coordinate system将旋转的文本绘制到父坐标系
【发布时间】:2012-07-19 07:54:03
【问题描述】:

我有一个 UIView,我在“drawRect”函数中手动绘制它。 它基本上是一个坐标系,在 Y 轴上有“值”,在“X 轴”上有“时间”。

由于空间问题,我希望时间戳是垂直的,而不是水平的。 为此,我使用:

CGContextSaveGState(ctx);              //Saves the current graphic context state
CGContextRotateCTM(ctx, M_PI_2);       //Rotates the context by 90° clockwise
strPos = CGContextConvertPointToUserSpace(ctx, strPos); //SHOULD convert to Usercoordinates
[str drawAtPoint:strPos withFont:fnt]; //Draws the text to the rotated CTM
CGContextRestoreGState(ctx);           //Restores the CTM to the previous state.

ctx (CGContextRef)、strPos (CGPoint) 和 str (NSString) 是变量,已经为“水平文本”正确且正确地初始化,宽度为文本高度。

虽然这段代码在 iPhone 3 上完美运行,但在 iPhone 4 (Retina) 上却让我一团糟,因为 CGContextConvertPointToUserSpace 函数会产生完全不同的结果,即使 iPhone 的坐标系应该保持不变.

我也尝试使用 CGAffineTransform,但结果相同。

总结我的问题:如何将文本绘制到父坐标系中的计算位置(0、0 为左上角)?


在再次研究了有关 Quartz 2D 的 Apple 文档后,我开始意识到,Pi/2 的旋转将我所有的书写都移到了屏幕左侧。

我可以通过将 CTM 平移 +height 使文字出现在垂直线上。 我会继续努力,但仍然很乐意得到答案。

编辑:多亏了lawicko的提醒,我才能够解决这个问题。详情见答案。

【问题讨论】:

  • 如果您只希望时间戳是垂直的,为什么不只旋转时间戳而不是其他所有内容?
  • 哦,我是。但我需要将时间戳正确定位在父坐标处。但是我不能“只”旋转一个矩形,可以吗?非常感谢你的提问......我开始担心没人看到我的问题:D
  • 快速查看文档显示the methods for drawing and manipulating the text。看起来您可以在那里设置文本位置,也可以设置应该允许您旋转它的文本矩阵。我并不是说你的方法是错误的,我只是认为在这种情况下旋转文本更合乎逻辑。
  • @lawicko 我尝试了这些方法(如上次编辑中所述)。但它并不像我想要的那样工作。但真的,真的很感谢你花时间解决我的问题。

标签: objective-c position rotation quartz-2d


【解决方案1】:

感谢lawicko 指出这一点。 在我的测试中,我犯了两个错误……但他当然是正确的。使用 CGContextShowTextAtPoint 是最简单的解决方案,因为它不需要旋转整个 CTM。

再次感谢您。 现在,对于我的问题的实际答案。 要在 x/y 位置绘制旋转文本,以下代码适用于我。

CGAffineTransform rot = CGAffineTransformMakeRotation(M_PI_2);    //Creates the rotation
CGContextSelectFont(ctx, "TrebuchetMS", 10, kCGEncodingMacRoman); //Selects the font
CGContextSetTextMatrix(ctx, CGAffineTransformScale(rot, 1, -1));  //Mirrors the rotated text, so it will be displayed correctly.
CGContextShowTextAtPoint(ctx, strPos.x, strPos.y, TS, 5);         //Draws the text

ctx是CGContext,strPos是父坐标系中想要的位置,TS是一个char数组。

再次感谢您,lawicko。 如果不是您的建议,我可能会永远搜索。 也许这个答案会帮助遇到同样问题的其他人。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-02-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-14
    • 1970-01-01
    相关资源
    最近更新 更多