Search code examples
iosuikitcore-graphicscgcontextquartz-2d

Core graphics draw concentric circles and fill the gap between them


I need to draw 2 circles and fill the area between inner and outer circle with yellow color, that is the area which is not in the intersection. How do I do that using core graphics? I tried this but it doesn't work:

   override func draw(_ rect: CGRect) {
    // Drawing code

    guard let context = UIGraphicsGetCurrentContext() else { return }

    context.setFillColor(UIColor.yellow.cgColor)

    let path = CGMutablePath()
    let radius = min(rect.width/2, rect.height/2)

    let center = CGPoint(x: rect.width/2, y: rect.height/2)
    path.addEllipse(in: CGRect(x: center.x - radius, y: center.y - radius, width: 2*radius, height: 2*radius))
    context.addPath(path)

   // context.drawPath(using: .fill)

    let path2 = CGMutablePath()
    path2.addEllipse(in: CGRect(x: center.x - radius/2, y: center.y - radius/2, width: radius, height: radius))


    context.addPath(path2)

    context.clip()

    context.drawPath(using: .fill)
}

Solution

  • You can use the following code:

      let path = CGMutablePath()
        let radius = min(rect.width/2, rect.height/2)
    
        let center = CGPoint(x: rect.width/2, y: rect.height/2)
        path.addEllipse(in: CGRect(x: center.x - radius, y: center.y - radius, width: 2*radius, height: 2*radius))
    
    
        let path2 = CGMutablePath()
        path2.addEllipse(in: CGRect(x: center.x - radius/2, y: center.y - radius/2, width: radius, height: radius))
    
       path.addPath(path2)
        context.addPath(path)
    
        context.drawPath(using: .eoFill)
    
    
    //inner part
       let path3 = CGMutablePath()
        path3.addEllipse(in: CGRect(x: center.x - radius/2, y: center.y - radius/2, width: radius, height: radius))
          context.addPath(path3)
        context.setFillColor(UIColor.green.cgColor)
    context.fillPath()