Skip to content

Instantly share code, notes, and snippets.

@drosenstark
Last active April 6, 2019 11:59
Show Gist options
  • Save drosenstark/9548f2dddf0630bd5ee2 to your computer and use it in GitHub Desktop.
Save drosenstark/9548f2dddf0630bd5ee2 to your computer and use it in GitHub Desktop.
(thanks to Paintcode) Draw a hollow circle in swift, or just a piece of one... angle starts at bottom and rotates around clockwise.
class func drawHollowCircle(circleColor: UIColor, rect: CGRect, startAngle: CGFloat = 1, endAngle: CGFloat = 360, outerRingProportion: CGFloat = 1, innerRingProportion: CGFloat = 0.5, drawShadow : Bool) {
//// Variable Declarations
let startAngleCalced: CGFloat = -startAngle + 270
let endAngleCalced: CGFloat = -endAngle + 270
let innerRingDiameter: CGFloat = rect.size.width * innerRingProportion
let innerRingOffset: CGFloat = 0.5 * (rect.size.width - innerRingDiameter)
let innerRingRect = CGRectMake(innerRingOffset, innerRingOffset, innerRingDiameter, innerRingDiameter)
let outerRingDiameter: CGFloat = rect.size.width * outerRingProportion
let outerRingOffset: CGFloat = 0.5 * (rect.size.width - outerRingDiameter)
let outerRingRect = CGRectMake(outerRingOffset, outerRingOffset, outerRingDiameter, outerRingDiameter)
//// Outer Circle Drawing
let outerCircleRect = outerRingRect
let outerCirclePath = UIBezierPath()
outerCirclePath.addArcWithCenter(CGPointMake(outerCircleRect.midX, outerCircleRect.midY), radius: outerCircleRect.width / 2, startAngle: -startAngleCalced * CGFloat(M_PI)/180, endAngle: -endAngleCalced * CGFloat(M_PI)/180, clockwise: true)
outerCirclePath.addLineToPoint(CGPointMake(outerCircleRect.midX, outerCircleRect.midY))
outerCirclePath.closePath()
//// InnerCircle Drawing
let innerCircleRect = innerRingRect
let innerCirclePath = UIBezierPath()
innerCirclePath.addArcWithCenter(CGPointMake(innerCircleRect.midX, innerCircleRect.midY), radius: innerCircleRect.width / 2, startAngle: -startAngleCalced * CGFloat(M_PI)/180, endAngle: -endAngleCalced * CGFloat(M_PI)/180, clockwise: true)
innerCirclePath.addLineToPoint(CGPointMake(innerCircleRect.midX, innerCircleRect.midY))
innerCirclePath.closePath()
// Clip out the innerCirclePath
outerCirclePath.appendPath(innerCirclePath)
outerCirclePath.addClip()
outerCirclePath.usesEvenOddFillRule = true;
if (drawShadow) {
CGContextSetShadowWithColor(UIGraphicsGetCurrentContext(), CGSizeZero, 0.25 * innerRingDiameter, circleColor.CGColor);
}
circleColor.setFill()
outerCirclePath.fill()
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment