我的代码使用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,则绘制弧线,但如果_drawArcClockwise
为FALSE
则不绘制任何内容。
我还测试了等效的UIBezierPath函数,它给出了相同的结果。
您可以在名为ArcTest(链接)的仓库中看到一个在github上显示此问题的示例项目
答案 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属性,则无关紧要。)