为什么我的Arcs不是在64位iOS设备上绘图?

时间:2015-01-21 15:05:11

标签: ios

我的代码使用Core Foundation函数CGPathAddArc()来创建弧(a.k.a.semicircles)。在某些情况下,当代码在64位操作系统设备(iPad Air和Air 2,iPhone 5s,iPhone 6等)上运行时,弧线不会绘制,但它们确实在32位设备上绘制。

代码看起来像这样:

CGPathAddArc(path,
             nil,
             CGRectGetMidX(bounds),
             CGRectGetMidY(bounds),
             MIN(bounds.size.width/2, bounds.size.height/2),
             3*M_PI_2,
             -M_PI_2,
             _drawArcClockwise
             );

在该示例中,如果_drawArcClockwise为TRUE,则绘制弧线,但如果_drawArcClockwiseFALSE则不绘制任何内容。

我还测试了等效的UIBezierPath函数,它给出了相同的结果。

您可以在名为ArcTest(链接)的仓库中看到一个在github上显示此问题的示例项目

1 个答案:

答案 0 :(得分:4)

答案似乎是iOS的64位实现中存在错误。 (或者错误可能在32位实现中。)无论哪种行为正确,32位和64位设备在响应具有相同参数的相同调用时的行为都不同。

上面代码的修复是在顺时针== FALSE时交换startAngle和endAngle参数:

CGFloat startAngle, endAngle;
startAngle = _drawArcClockwise ? 3*M_PI_2 : -M_PI_2;
endAngle =   _drawArcClockwise ? -M_PI_2  : 3*M_PI_2;
CGPathAddArc(path,
             nil,
             CGRectGetMidX(bounds),
             CGRectGetMidY(bounds),
             MIN(bounds.size.width/2, bounds.size.height/2),
             startAngle,
             endAngle,
             _drawArcClockwise
             );

该代码适用于32位和64位平台。我还没有检查过在两个平台上绘制弧线的方向。 (通常情况并不重要,但如果您使用形状图层中的弧创建动画并操纵形状图层的strokeStart和/或strokeEnd属性,则无关紧要。)