【问题标题】:draw an arc clockwise in iOS results in unclockwise arc在iOS中顺时针绘制弧会导致逆时针弧
【发布时间】:2014-07-16 14:03:13
【问题描述】:

我使用下面的代码在圆的下半部分画了一个圆弧。

根据 Apple 中的文档:

此方法创建一个开放的子路径。创建的弧位于 指定圆的周长。默认绘制时 坐标系,起点和终点角度以单位为单位 圆如图 1 所示。例如,指定起始角度为 0 弧度,π弧度的结束角度,并设置顺时针 参数 YES 绘制圆的下半部分。然而, 指定相同的开始和结束角度,但设置顺时针 设置为 NO 的参数绘制圆的上半部分。

我写了

    std::complex<double> start1(   std::polar(190.0,0.0) );


    CGPoint targetStart1 = CGPointMake(start1.real() + 342.0, start1.imag() + 220.);

    CGMutablePathRef path = CGPathCreateMutable();
    CGPathMoveToPoint(path, NULL, targetStart1.x, targetStart1.y);
    CGPathAddArc(path, NULL, 342.0, 220.0, 190, 0.0, PI_180,   YES );
    CGContextAddPath(context, path);
    CGContextSetLineWidth( context, 15.0  );

    // set the color for the stroked circle
    CGContextSetStrokeColorWithColor( context, [UIColor greenColor].CGColor);

    CGContextStrokePath(context);
    CGPathRelease(path);

但是,圆弧绘制在圆的上半部分(见绿色环)。我想知道我是否不小心在代码中的某个地方翻转了协调系统,但我不知道我应该搜索什么命令。

感谢您的帮助。

【问题讨论】:

  • 记住 UIKit 和 CoreGraphics 有不同的坐标系:informit.com/articles/article.aspx?p=2149190&seqNum=11
  • @Vinzzz 你的意思是在 CGPathAddArc 中顺时针表示逆时针吗?那为什么文件中没有提到呢?
  • @Vinzzz 但我认为 0,0 坐标在左上角。因为有了这个假设,targetStart1 的位置显然是正确的。

标签: ios cgpath


【解决方案1】:

根据 Vinzzz 的评论:由于某些不透明的原因,Apple 在 OS X 和 iOS 之间翻转了窗口管理器的坐标系。 OS X 使用坐标纸布局,原点位于左下方,正 y 向上进行。 UIKit 使用英文阅读顺序,原点在左上角,正 y 向下进行。

Core Graphics 保留了 OS X 的方法; UIKit 只是将其输出倒置。如果您真的想说服自己,请添加一些核心文本。

标准解决方案是在任何drawRect: 中将当前变换矩阵作为前两个步骤进行平移和缩放,有效地将原点移回该视图的左下方并翻转 y 坐标轴。

【讨论】:

  • 是的。在 Core Graphics 中,原点位于左下角。在 UIKit 中它位于左上角。所以 UIKit 会颠倒显示核心图形缓冲区。您的原点位于左上角证明这是您的问题。水平翻转顺时针变为逆时针,反之亦然。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-12-11
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多