【问题标题】:cgcontext rotate rectanglecgcontext 旋转矩形
【发布时间】:2013-03-29 03:25:19
【问题描述】:

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

CGContextSaveGState(UIGraphicsGetCurrentContext());

CGContextRef ctx = UIGraphicsGetCurrentContext();

CGRect rect = r;

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


CGContextRestoreGState(UIGraphicsGetCurrentContext());

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

【问题讨论】:

  • 您可能想尝试用您的母语输入您的问题文本,然后使用 Google 翻译将其转换为英语,因为在这里很难理解您要问什么。
  • 这里也有一个很好的答案 - teamtreehouse.com/community/…
  • 我也有类似的问题,不知道你现在有解决这个问题的办法吗?

标签: ios rotation core-graphics cgcontext rect


【解决方案1】:

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

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

无论如何,我假设您要做的是相对于未旋转的世界旋转矩形,而不是旋转世界及其中的所有内容。

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

  1. 保存图形状态。

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

  3. 旋转上下文。

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

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

【讨论】:

  • 我可以用这个逻辑旋转矩形,但是一旦我把手指抬起,旋转手势结束,矩形就会消失(消失)?有什么想法吗?
【解决方案2】:

对我有用的是首先使用旋转矩阵来计算保持图像居中所需的平移量。下面我假设您已经将 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>

对我来说工作得很好。希望对您有所帮助。

【讨论】:

    【解决方案3】:

    使用以下代码旋转图像

    // 将度数转换为弧度

    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();
    

    【讨论】:

    • 这与问题中的代码所做的有什么显着不同,当问题中的代码不能正常工作时,是什么让这段代码正常工作?
    • 我正在使用上下文和 imageRef 绘制图像,其中有问题的图像不存在。
    • 使用 CGContext 和 CGI​​mage 绘制图像与告诉 UIImage 自己绘制有何不同,以及更好?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-08-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多