Mikes Antwort ist großartig! Eine andere schöne und einfache Möglichkeit ist die Verwendung von drawRect in Kombination mit setNeedsDisplay (). Es scheint nachlässig, aber es ist nicht :-)
Wir wollen von oben beginnend einen Kreis zeichnen, der -90 ° beträgt und bei 270 ° endet. Der Mittelpunkt des Kreises ist (centerX, centerY) mit einem bestimmten Radius. CurrentAngle ist der aktuelle Winkel des Endpunkts des Kreises von minAngle (-90) bis maxAngle (270).
// MARK: Properties
let centerX:CGFloat = 55
let centerY:CGFloat = 55
let radius:CGFloat = 50
var currentAngle:Float = -90
let minAngle:Float = -90
let maxAngle:Float = 270
In drawRect geben wir an, wie der Kreis angezeigt werden soll:
override func drawRect(rect: CGRect) {
let context = UIGraphicsGetCurrentContext()
let path = CGPathCreateMutable()
CGPathAddArc(path, nil, centerX, centerY, radius, CGFloat(GLKMathDegreesToRadians(minAngle)), CGFloat(GLKMathDegreesToRadians(currentAngle)), false)
CGContextAddPath(context, path)
CGContextSetStrokeColorWithColor(context, UIColor.blueColor().CGColor)
CGContextSetLineWidth(context, 3)
CGContextStrokePath(context)
}
Das Problem ist, dass im Moment, da sich currentAngle nicht ändert, der Kreis statisch ist und nicht einmal angezeigt wird, da currentAngle = minAngle.
Wir erstellen dann einen Timer und erhöhen jedes Mal, wenn dieser Timer ausgelöst wird, currentAngle. Fügen Sie oben in Ihrer Klasse das Timing zwischen zwei Bränden hinzu:
let timeBetweenDraw:CFTimeInterval = 0.01
Fügen Sie in Ihrem Init den Timer hinzu:
NSTimer.scheduledTimerWithTimeInterval(timeBetweenDraw, target: self, selector: #selector(updateTimer), userInfo: nil, repeats: true)
Wir können die Funktion hinzufügen, die aufgerufen wird, wenn der Timer ausgelöst wird:
func updateTimer() {
if currentAngle < maxAngle {
currentAngle += 1
}
}
Leider wird beim Ausführen der App nichts angezeigt, da wir nicht angegeben haben, welches System erneut gezeichnet werden soll. Dies erfolgt durch Aufrufen von setNeedsDisplay (). Hier ist die aktualisierte Timer-Funktion:
func updateTimer() {
if currentAngle < maxAngle {
currentAngle += 1
setNeedsDisplay()
}
}
_ _ _
Der gesamte Code, den Sie benötigen, ist hier zusammengefasst:
import UIKit
import GLKit
class CircleClosing: UIView {
// MARK: Properties
let centerX:CGFloat = 55
let centerY:CGFloat = 55
let radius:CGFloat = 50
var currentAngle:Float = -90
let timeBetweenDraw:CFTimeInterval = 0.01
// MARK: Init
required init?(coder aDecoder: NSCoder) {
super.init(coder: aDecoder)
setup()
}
override init(frame: CGRect) {
super.init(frame: frame)
setup()
}
func setup() {
self.backgroundColor = UIColor.clearColor()
NSTimer.scheduledTimerWithTimeInterval(timeBetweenDraw, target: self, selector: #selector(updateTimer), userInfo: nil, repeats: true)
}
// MARK: Drawing
func updateTimer() {
if currentAngle < 270 {
currentAngle += 1
setNeedsDisplay()
}
}
override func drawRect(rect: CGRect) {
let context = UIGraphicsGetCurrentContext()
let path = CGPathCreateMutable()
CGPathAddArc(path, nil, centerX, centerY, radius, -CGFloat(M_PI/2), CGFloat(GLKMathDegreesToRadians(currentAngle)), false)
CGContextAddPath(context, path)
CGContextSetStrokeColorWithColor(context, UIColor.blueColor().CGColor)
CGContextSetLineWidth(context, 3)
CGContextStrokePath(context)
}
}
Wenn Sie die Geschwindigkeit ändern möchten, ändern Sie einfach die updateTimer-Funktion oder die Rate, mit der diese Funktion aufgerufen wird. Vielleicht möchten Sie auch den Timer ungültig machen, sobald der Kreis geschlossen ist, was ich vergessen habe :-)
Wichtiger Hinweis: Um den Kreis in Ihrem Storyboard hinzufügen, fügen Sie einfach einen Blick, wählen Sie es, gehen Sie zu seiner Identität Inspektor , und als Klasse , geben Sie CircleClosing .
Prost! Bruder