CGContext绘图围绕任意点旋转

时间:2012-01-30 10:22:08

标签: objective-c ios quartz-2d

我有一个非常讨厌的问题,试图绘制一个位图CGContext。我想要做的是我有几个图像绘制成图像的完整大小。一个人可以进入任何UIImageOrientation并且我已经编写了正确旋转的代码,但是我正在努力尝试在其中心的任意旋转处绘制另一个视图的第二个位。

另一个视图包含可能在其边界之外绘制的图像。我遇到的问题是以旋转的角度绘制它们,好像它是一个应用了仿射变换的UIView。例如想象一下大小为{20,20}的{100,300}的UIView和旋转45度的仿射变换。它会旋转大约{110,310}。

我试过的是:

- (void)drawOtherViewInContext:(CGContextRef)context atRect:(CGRect)rect withRotation:(CGFloat)rotation contextSize:(CGSize)contextSize {
    CGRect thisFrame = <SOLVED_FEATURE_FRAME_RELATIVE_TO_RECT_SIZE>;
    thisFrame.origin.y = contextSize.height - thisFrame.origin.y - thisFrame.size.height;

    CGRect rotatedRect = CGRectApplyAffineTransform(CGRectMake(0.0f, 0.0f, rect.size.width, rect.size.height), CGAffineTransformMakeRotation(-rotation));

    CGAffineTransform transform = CGAffineTransformIdentity;
    transform = CGAffineTransformTranslate(transform, rect.origin.x, contextSize.height - rect.origin.y - rect.size.height);
    transform = CGAffineTransformTranslate(transform, 
                                           +(rotatedRect.size.width/2.0f), 
                                           +(rotatedRect.size.height/2.0f));
    transform = CGAffineTransformRotate(transform, -rotation);
    transform = CGAffineTransformTranslate(transform, 
                                           -(rect.size.width/2.0f), 
                                           -(rect.size.height/2.0f));

    CGContextConcatCTM(context, transform);
    CGContextDrawImage(context, thisFrame, theCGImageToDraw);
    CGContextConcatCTM(context, CGAffineTransformInvert(transform));
}

我认为我在那里做的是:

  1. 翻译到rect的左下角,这是该视图的绘制位置。

  2. 将旋转的尺寸换成x和y的一半。

  3. 按所需角度旋转。

  4. 在x和y中翻译原始大小的一半。

  5. 我认为这就是我想要做的事情,因为第一步将坐标系转换为相对于我们被告知绘制的地方正确绘制thisFrame({{1方法参数)。然后围绕矩形的中心进行非常正常的旋转。

    问题是,当旋转45度时,图像会略微偏离原位。这几乎是正确的,但不完全正确。当处于0度,90度,180度或270度时,该位置几乎可以点亮,可能是几个像素,但是当处于45度,135度,225度,315度时,位置太远而且向右。

    谁能看到我在这里做错了什么?

    更新

    傻傻的我,它更大,因为我传递的是错误的直肠!编辑摆脱对它的引用是错误的大小。但它仍然不是在正确的位置。

1 个答案:

答案 0 :(得分:4)

好的我已经修好了。第一点是我首先在错误的矩形中传递,因为我从UIView抓取框架,其中应用了仿射变换,并且我们都知道在这种情况下框架是未定义的。更可能的是来自CGRectApplyAffineTransform(bounds, transform)的CGRect,但无论如何,我修复了那个。

然后通过将我的变换改为:

来修正绘制偏移的主要问题
CGAffineTransform transform = CGAffineTransformIdentity;
transform = CGAffineTransformTranslate(transform, rect.origin.x, contextSize.height - rect.origin.y - rect.size.height);
transform = CGAffineTransformTranslate(transform, 
                                       +(rect.size.width/2.0f), 
                                       +(rect.size.height/2.0f));
transform = CGAffineTransformRotate(transform, -rotation);
transform = CGAffineTransformTranslate(transform, 
                                       -(rect.size.width/2.0f), 
                                       -(rect.size.height/2.0f));

这就是我原本以为我应该做的事情,但出于某种原因我改变它以使用旋转的CGRect。