为什么给addArcWithCenter一个0度的startAngle使它从90度开始?

zak*_*ces 22 geometry core-animation objective-c ios uibezierpath

我正在创建一个CAShapeLayer用作UIView图层的掩码.我用a UIBezierPath来绘制形状图层.它工作得很好,除了我画画时得到一些奇怪的结果.几何体的行为不符合预期.我正试图在右上角绘制简单的"馅饼切片":

#define degreesToRadians(x) ((x) * M_PI / 180.0)

...

// "layer" refer's to the UIView's root layer

CAShapeLayer *maskLayer = [CAShapeLayer layer];

maskLayer.frame =
    layer.presentationLayer ? 
    ((CAGradientLayer *)layer.presentationLayer).bounds : layer.bounds;
maskLayer.fillRule = kCAFillRuleEvenOdd;
maskLayer.needsDisplayOnBoundsChange = YES;

CGFloat maskLayerWidth = maskLayer.bounds.size.width;
CGFloat maskLayerHeight = maskLayer.bounds.size.height;
CGPoint maskLayerCenter = 
    CGPointMake(maskLayerWidth/2,maskLayerHeight/2);

UIBezierPath *path = [UIBezierPath bezierPath];

[path moveToPoint:maskLayerCenter];

[path addArcWithCenter:maskLayerCenter radius:(maskLayerWidth/2)
startAngle:degreesToRadians(0) endAngle:degreesToRadians(90) clockwise:YES];

[path closePath];


maskLayer.path = path.CGPath;

layer.mask = maskLayer;
Run Code Online (Sandbox Code Playgroud)

最终结果是在右下角绘制了饼图切片.弧的第一个点是以90度绘制的,然后是180度.即使我使用0度和90度角,它为什么会这样做?

Dav*_*ist 72

此图像直接来自文档.

图片

并讨论它是如何工作的(给定默认坐标系)

讨论
此方法添加从当前点开始的指定弧.创建的弧位于指定圆的周长.在默认坐标系中绘制时,起始角和终止角基于图1所示的单位圆.例如,指定0弧度的起始角度,π弧度的结束角度,并设置顺时针参数以YES绘制圆的下半部分.但是,指定相同的开始和结束角度,但设置clockwise参数集以NO绘制圆的上半部分.

这就是角度的工作方式addArcWithCenter:radius:startAngle:endAngle:clockwise:.如果那不是您所看到的,那么您正在错误地计算您的角度.


Mar*_*n R 9

看看图1bezierPathWithArcCenter:半径:由startAngle:endAngle:顺时针方向:文档:对于在右上角有一个"饼片"你必须使用的参数

startAngle:degreesToRadians(-90) endAngle:0 clockwise:YES
Run Code Online (Sandbox Code Playgroud)

(原因是iOS上的默认坐标系有一个指向右边的x轴,一个指向下方的y轴.)