7

在 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 参数。对于如何解决这个问题,有任何的建议吗?

谢谢!

4

1 回答 1

9

这确实是由于 UIKit 与 Quartz 的翻转坐标系。来自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);
于 2013-06-07T00:22:45.950 回答