WARNUNG! Dies ist eine falsche Lösung. Ebenen werden in der drawRect
Methode unendlich hinzugefügt (jedes Mal, wenn die Ansicht gezeichnet wird). Sie sollten der drawRect
Methode NIEMALS Ebenen hinzufügen . Verwenden Sie layoutSubview
stattdessen.
Sie können damit einen Kreis zeichnen ( Swift 3.0+ ):
let circlePath = UIBezierPath(arcCenter: CGPoint(x: 100, y: 100), radius: CGFloat(20), startAngle: CGFloat(0), endAngle: CGFloat(Double.pi * 2), clockwise: true)
let shapeLayer = CAShapeLayer()
shapeLayer.path = circlePath.cgPath
shapeLayer.fillColor = UIColor.clear.cgColor
shapeLayer.strokeColor = UIColor.red.cgColor
shapeLayer.lineWidth = 3.0
view.layer.addSublayer(shapeLayer)
Mit dem Code, den Sie gepostet haben, beschneiden Sie die Ecken von UIView
und fügen der Ansicht keinen Kreis hinzu.
Hier ist ein vollständiges Beispiel für die Verwendung dieser Methode:
class Ring: UIView {
override func drawRect(rect: CGRect) {
drawRingFittingInsideView()
}
internal func drawRingFittingInsideView() -> () {
let halfSize:CGFloat = min( bounds.size.width/2, bounds.size.height/2)
let desiredLineWidth:CGFloat = 1
let circlePath = UIBezierPath(
arcCenter: CGPoint(x:halfSize,y:halfSize),
radius: CGFloat( halfSize - (desiredLineWidth/2) ),
startAngle: CGFloat(0),
endAngle:CGFloat(M_PI * 2),
clockwise: true)
let shapeLayer = CAShapeLayer()
shapeLayer.path = circlePath.CGPath
shapeLayer.fillColor = UIColor.clearColor().CGColor
shapeLayer.strokeColor = UIColor.redColor().CGColor
shapeLayer.lineWidth = desiredLineWidth
layer.addSublayer(shapeLayer)
}
}
Beachten Sie jedoch, dass es einen unglaublich praktischen Anruf gibt:
let circlePath = UIBezierPath(ovalInRect: rect)
das macht die ganze Arbeit, den Weg zu machen. (Vergessen Sie nicht, es für die Linienstärke einzufügen, was auch mit unglaublich einfach ist CGRectInset
.)
internal func drawRingFittingInsideView(rect: CGRect) {
let desiredLineWidth:CGFloat = 4
let hw:CGFloat = desiredLineWidth/2
let circlePath = UIBezierPath(ovalInRect: CGRectInset(rect,hw,hw))
let shapeLayer = CAShapeLayer()
shapeLayer.path = circlePath.CGPath
shapeLayer.fillColor = UIColor.clearColor().CGColor
shapeLayer.strokeColor = UIColor.redColor().CGColor
shapeLayer.lineWidth = desiredLineWidth
layer.addSublayer(shapeLayer)
}
In der Praxis dieser Tage in Swift würden Sie sicherlich @IBDesignable
und verwenden @IBInspectable
. Mit diesen können Sie tatsächlich das Rendering im Storyboard sehen und ändern!
Wie Sie sehen können, werden dem Inspektor im Storyboard neue Funktionen hinzugefügt, die Sie im Storyboard ändern können:
@IBDesignable class Dot: UIView {
@IBInspectable var mainColor: UIColor = UIColor.blueColor() {
didSet {
print("mainColor was set here")
}
}
@IBInspectable var ringColor: UIColor = UIColor.orangeColor() {
didSet {
print("bColor was set here")
}
}
@IBInspectable var ringThickness: CGFloat = 4 {
didSet {
print("ringThickness was set here")
}
}
@IBInspectable var isSelected: Bool = true
override func drawRect(rect: CGRect) {
let dotPath = UIBezierPath(ovalInRect:rect)
let shapeLayer = CAShapeLayer()
shapeLayer.path = dotPath.CGPath
shapeLayer.fillColor = mainColor.CGColor
layer.addSublayer(shapeLayer)
if (isSelected) {
drawRingFittingInsideView(rect)
}
}
internal func drawRingFittingInsideView(rect: CGRect) {
let hw:CGFloat = ringThickness/2
let circlePath = UIBezierPath(ovalInRect: CGRectInset(rect,hw,hw) )
let shapeLayer = CAShapeLayer()
shapeLayer.path = circlePath.CGPath
shapeLayer.fillColor = UIColor.clearColor().CGColor
shapeLayer.strokeColor = ringColor.CGColor
shapeLayer.lineWidth = ringThickness
layer.addSublayer(shapeLayer)
}
}
Beachten Sie schließlich, dass Sie, wenn Sie ein UIView
(das quadratisch ist und das Sie im Storyboard auf rot setzen) haben und es einfach in einen roten Kreis verwandeln möchten, einfach Folgendes tun können:
class Dot: UIView {
override func layoutSubviews() {
layer.cornerRadius = bounds.size.width/2
}
}