【问题标题】:CGContextAddArc counterclockwise instead of clockwiseCGContextAddArc 逆时针而不是顺时针
【发布时间】:2013-06-07 00:11:00
【问题描述】:

在 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 参数。有关如何解决此问题的任何建议?

谢谢!

【问题讨论】:

    标签: ios calayer quartz-graphics cgcontext


    【解决方案1】:

    这确实是由于 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);
    

    【讨论】:

    • 感谢超级快速的回复和解释!我尝试添加您发布的代码,它现在按预期顺时针绘制,但不是绘制一个象限(0-90 度范围内预期的圆的右下象限),而是顺时针绘制 0-270 度范围。任何想法为什么?
    • 我刚试过这个,它从正东(0度)顺时针到正北(90度)画了3/4的圆。如果你想要圆的右下象限,它应该是顺时针从 0 度到 270 度(正南)。顺时针参数不会改变角度的解释方式,只会绘制圆的“一半”。
    • 哦,好吧,我想我明白为什么会这样了……通过翻转变换,90 度和 270 度的位置被交换,而 x 被单独留下。对此感到抱歉。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-06-28
    • 1970-01-01
    • 2012-12-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-26
    相关资源
    最近更新 更多