22

我正在创建一个CAShapeLayer用作 aUIView图层的蒙版。我正在使用 aUIBezierPath来绘制形状图层。它工作得很好,除了我在画画时得到了一些奇怪的结果。几何图形未按预期运行。我正在尝试在右上角绘制简单的“饼图”:

#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;

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

4

2 回答 2

75

此图像直接来自文档

图片

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

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

这就是角度的工作原理addArcWithCenter:radius:startAngle:endAngle:clockwise:。如果这不是您所看到的,那么您计算的角度不正确。

于 2013-04-24T13:02:05.023 回答
9

bezierPathWithArcCenter:radius:startAngle:endAngle:顺时针看一下图 1 :文档:对于右上角的“饼图”,您必须使用参数

startAngle:degreesToRadians(-90) endAngle:0 clockwise:YES

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

于 2013-04-24T13:01:24.790 回答