22

のレイヤーのCAShapeLayerマスクとして使用する を作成しています。UIViewを使用し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;

最終結果として、パイのスライスが右下隅に描画されます。円弧の最初の点は 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:clockwise:ドキュメントの図 1を参照してください。

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

(理由は、iOS のデフォルトの座標系では、x 軸が右向きで、y 軸が下向きであるためです。)

于 2013-04-24T13:01:24.790 に答える