Search code examples
iosswiftuibezierpathcgpath

Cannot create two CGPathAddArc on the same CGMutablePathRef


I'm trying to understand why i'm seeing only one of mine CGPathAddArc.

Code :

  var r: CGRect = self.myView.bounds
 var lay: CAShapeLayer = CAShapeLayer()
        var path: CGMutablePathRef = CGPathCreateMutable()
        CGPathAddArc(path, nil, 30, 30, 30, 0, (360 * CGFloat(M_PI))/180, true    )
        CGPathAddArc(path, nil, 70, 30, 30, 0, (360 * CGFloat(M_PI))/180, true    )

        CGPathAddRect(path, nil, r2)
 CGPathAddRect(path, nil, r)
        lay.path = path
        lay.fillRule = kCAFillRuleEvenOdd
        self.myView.layer.mask = lay

result :

enter image description here

Any suggestions? Thanks!


Solution

  • If you push down the command key and click on CGPathAddArc function, you will see documentation.

    /* Note that using values very near 2π can be problematic. For example,
       setting `startAngle' to 0, `endAngle' to 2π, and `clockwise' to true will
       draw nothing. (It's easy to see this by considering, instead of 0 and 2π,
       the values ε and 2π - ε, where ε is very small.) Due to round-off error,
       however, it's possible that passing the value `2 * M_PI' to approximate
       2π will numerically equal to 2π + δ, for some small δ; this will cause a
       full circle to be drawn.
    
       If you want a full circle to be drawn clockwise, you should set
       `startAngle' to 2π, `endAngle' to 0, and `clockwise' to true. This avoids
       the instability problems discussed above. */
    

    Setting startAngle to 0, endAngle to 2π, and clockwise to true will draw nothing. If you want a full circle to be drawn clockwise, you should set startAngle to 2π, endAngle to 0, and clockwise to true. So that you can see all circles.