CGContextAddArc逆时针而不是顺时针方向

时间:2013-06-07 00:11:01

标签: ios calayer quartz-graphics cgcontext

在CALayer子类内部绘制函数内部绘制弧时,我遇到了问题。该绘图函数的实现如下:

-(void)drawInContext:(CGContextRef)ctx
{
    CGPoint center = CGPointMake(self.bounds.size.width/2, self.bounds.size.height/2);
    CGFloat radius = MIN(center.x, center.y);

    CGContextBeginPath(ctx);

    CGContextAddArc(ctx, center.x, center.y, radius, DEG2RAD(0), DEG2RAD(90), YES);

    CGContextSetStrokeColorWithColor(ctx, [UIColor whiteColor].CGColor);
    CGContextSetLineWidth(ctx, 5);

    CGContextDrawPath(ctx, kCGPathStroke);
}

这里没什么特别开创性的,但奇怪的是,即使我指的是顺时针方向,它也是逆时针绘制圆弧的。相反,当我为顺时针参数指定NO时,它顺时针绘制圆弧。我对翻转坐标系进行了一些研究,并认为可能是这里的问题,但我不想只是硬编码我所说的相反的bool参数。有关如何解决此问题的任何建议吗?

谢谢!

1 个答案:

答案 0 :(得分:8)

这确实是由于UIKit与Quartz的翻转坐标系统。来自docs for CGContext

  

顺时针参数决定了弧的创建方向;最终路径的实际方向取决于图形上下文的当前变换矩阵。例如,在iOS上,UIView通过将Y值缩放-1来翻转Y坐标。在翻转坐标系中,指定顺时针圆弧会在应用变换后产生逆时针弧。

您可以使用转换矩阵翻转上下文来缓解代码中的错误:

CGContextTranslateCTM(ctx, 0.0, self.bounds.size.height);
CGContextScaleCTM(ctx, 1.0, -1.0);

您可能想在完成绘图时将其翻转,即

CGContextSaveGState(ctx);
CGContextTranslateCTM(ctx, 0.0, self.bounds.size.height);
CGContextScaleCTM(ctx, 1.0, -1.0);

// Draw...

CGContextRestoreGState(ctx);