在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参数。有关如何解决此问题的任何建议吗?
谢谢!
答案 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);