1

我有一个 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的提醒,我能够解决这个问题。有关详细信息,请参阅答案。

4

1 回答 1

0

我要感谢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。如果不是您的建议,我可能会永远搜索。也许这个答案会帮助遇到同样问题的其他人。

于 2012-07-20T07:05:00.630 回答