3

伙计们!我需要向 CGContext 绘制一些图像。这是相关代码:

CGContextSaveGState(UIGraphicsGetCurrentContext());

CGContextRef ctx = UIGraphicsGetCurrentContext();

CGRect rect = r;

CGContextRotateCTM(ctx, DEGREES_TO_RADIANS(350));
[image drawInRect:r];


CGContextRestoreGState(UIGraphicsGetCurrentContext());

实际上,矩形是旋转并显示在一个区域上,这不是我的目的。我只想旋转图像并显示在同一位置。有任何想法吗 ?????

4

3 回答 3

21

旋转是关于上下文的原点,这是矩形相对的同一点。如果您想象背景中有一张方格纸,您可以更清楚地看到发生了什么:

旋转上下文,背景是方格纸网格,前景是矩形

这条线是你的窗口/视图/层/上下文的“底部”(y=0)。当然,您可以根据需要在底部下方绘制,如果您的上下文以正确的方式转换,您甚至可以看到它。

无论如何,我假设你想要做的是将矩形旋转到位,相对于未旋转的世界,而不是旋转世界和其中的一切。

旋转任何东西的唯一方法是旋转世界,这就是你需要这样做的方式:

  1. 保存图形状态。

  2. 将原点平移到要绘制矩形的点。(您可能想要转换到它的中心点,而不是矩形的原点。)

    带有方格纸背景的翻译上下文,显示矩形中心的原点

  3. 旋转上下文。

    带有方格纸背景的翻译和旋转上下文,显示轴现在像以前一样向上倾斜,但现在翻译的原点也像矩形一样移动

  4. 绘制以原点为中心的矩形。换句话说,你的矩形的原点应该是宽度的一半和高度的一半(即(CGPoint){ width / -2.0, height / -2.0 })——不要使用它之前的原点,因为你已经在翻译步骤中使用了它。

    在其位置绘制的矩形,删除了方格纸背景和原点线

  5. 恢复 gstate,以便以后的绘图不会旋转。

于 2013-03-29T16:29:24.300 回答
1

对我有用的是首先使用旋转矩阵来计算保持图像居中所需的平移量。下面我假设您已经将 centerX 和 centerY 计算为绘图框的中心,并且“theta”是您想要的以弧度为单位的旋转角度。

let newX = centerX*cos(theta) - centerY*sin(theta)
let newY = centerX*sin(theta) + centerY*cos(theta)

CGContextTranslateCTM(context,newX,newY)
CGContextRotateCTM(context,theta)
<redraw your image here>

对我来说工作得很好。希望能帮助到你。

于 2015-08-11T11:52:47.713 回答
-1

使用以下代码旋转您的图像

// 将度数转换为弧度

CGFloat DegreesToRadians(CGFloat degrees)
{
    return degrees * M_PI / 180;
};

用drawRect方法写

 // create new context
CGContextRef context = UIGraphicsGetCurrentContext();
// define rotation angle
CGContextRotateCTM(context, DegreesToRadians(45));
// get your UIImage
UIImage *img = [UIImage imageNamed:@"yourImageName"];
// Draw your image at rect
CGContextDrawImage(context, CGRectMake(100, 0, 100, 100), [img CGImage]);
// draw context
UIGraphicsGetImageFromCurrentImageContext();
于 2013-03-29T04:16:16.323 回答