将旋转的文本绘制到父坐标系

时间:2012-07-19 07:54:04

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

我有一个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平移+高度来使书写显示在垂直线上。 我会继续努力,但仍然乐意得到答案。

编辑:感谢lawicko的单挑,我能够解决问题。有关详细信息,请参阅答案。

1 个答案:

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