Created
December 27, 2018 06:30
-
-
Save mayoff/64e4ba28fee2ea3911053c55ba14665f to your computer and use it in GitHub Desktop.
Simon game wedges in iOS
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
import UIKit | |
import PlaygroundSupport | |
typealias Radians = CGFloat | |
extension UIBezierPath { | |
static func simonWedge(innerRadius: CGFloat, outerRadius: CGFloat, centerAngle: Radians, gap: CGFloat) -> UIBezierPath { | |
let innerAngle: Radians = CGFloat.pi / 4 - gap / (2 * innerRadius) | |
let outerAngle: Radians = CGFloat.pi / 4 - gap / (2 * outerRadius) | |
let path = UIBezierPath() | |
path.addArc(withCenter: .zero, radius: innerRadius, startAngle: centerAngle - innerAngle, endAngle: centerAngle + innerAngle, clockwise: true) | |
path.addArc(withCenter: .zero, radius: outerRadius, startAngle: centerAngle + outerAngle, endAngle: centerAngle - outerAngle, clockwise: false) | |
path.close() | |
return path | |
} | |
} | |
class SimonWedgeView: UIView { | |
override init(frame: CGRect) { | |
super.init(frame: frame) | |
commonInit() | |
} | |
required init?(coder decoder: NSCoder) { | |
super.init(coder: decoder) | |
commonInit() | |
} | |
var centerAngle: Radians = 0 { didSet { setNeedsDisplay() } } | |
var color: UIColor = #colorLiteral(red: 0.8549019694, green: 0.250980407, blue: 0.4784313738, alpha: 1) { didSet { setNeedsDisplay() } } | |
override func draw(_ rect: CGRect) { | |
let path = wedgePath() | |
color.setFill() | |
path.fill() | |
} | |
private func commonInit() { | |
contentMode = .redraw | |
backgroundColor = .clear | |
isOpaque = false | |
} | |
private func wedgePath() -> UIBezierPath { | |
let bounds = self.bounds | |
let outerRadius = min(bounds.size.width, bounds.size.height) / 2 | |
let innerRadius = outerRadius / 2 | |
let gap = (outerRadius - innerRadius) / 4 | |
let path = UIBezierPath.simonWedge(innerRadius: innerRadius, outerRadius: outerRadius, centerAngle: centerAngle, gap: gap) | |
path.apply(CGAffineTransform(translationX: bounds.midX, y: bounds.midY)) | |
return path | |
} | |
} | |
let rootView = UIView(frame: CGRect(x: 0, y: 0, width: 100, height: 100)) | |
rootView.backgroundColor = .white | |
func addWedgeView(color: UIColor, angle: Radians) { | |
let wedgeView = SimonWedgeView(frame: rootView.bounds) | |
wedgeView.color = color | |
wedgeView.centerAngle = angle | |
rootView.addSubview(wedgeView) | |
} | |
addWedgeView(color: #colorLiteral(red: 0.8549019694, green: 0.250980407, blue: 0.4784313738, alpha: 1), angle: 0) | |
addWedgeView(color: #colorLiteral(red: 0.5843137503, green: 0.8235294223, blue: 0.4196078479, alpha: 1), angle: 0.5 * .pi) | |
addWedgeView(color: #colorLiteral(red: 0.2588235438, green: 0.7568627596, blue: 0.9686274529, alpha: 1), angle: .pi) | |
addWedgeView(color: #colorLiteral(red: 0.9686274529, green: 0.78039217, blue: 0.3450980484, alpha: 1), angle: 1.5 * .pi) | |
PlaygroundPage.current.liveView = rootView |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Thank you for the time and energy you put into this! It's a massive help, I appreciate it!