Hollow Circle with CoreDrawing and Swift
Thanks to Paintcode and a bit of thinking on my part, I was able to put my one-method-to-rule-them-all together. It draws a variable-size donut with a variable angle. The drawShadow bit is still in progress.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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() | |
} |