La risposta di Mike è fantastica! Un altro modo carino e semplice per farlo è usare drawRect combinato con setNeedsDisplay (). Sembra lento, ma non è :-)
Vogliamo disegnare un cerchio partendo dall'alto, che è -90 ° e termina a 270 °. Il centro del cerchio è (centerX, centerY), con un dato raggio. CurrentAngle è l'angolo corrente del punto finale del cerchio, che va da minAngle (-90) a 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, specifichiamo come dovrebbe essere visualizzato il cerchio:
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)
}
Il problema è che in questo momento, poiché currentAngle non sta cambiando, il cerchio è statico e non viene nemmeno visualizzato, come currentAngle = minAngle.
Quindi creiamo un timer e ogni volta che il timer si attiva, aumentiamo currentAngle. In cima alla classe, aggiungi il tempo tra due fuochi:
let timeBetweenDraw:CFTimeInterval = 0.01
Nel tuo init, aggiungi il timer:
NSTimer.scheduledTimerWithTimeInterval(timeBetweenDraw, target: self, selector: #selector(updateTimer), userInfo: nil, repeats: true)
Possiamo aggiungere la funzione che verrà chiamata quando il timer si attiva:
func updateTimer() {
if currentAngle < maxAngle {
currentAngle += 1
}
}
Purtroppo, durante l'esecuzione dell'app, non viene visualizzato nulla perché non abbiamo specificato il sistema che dovrebbe disegnare di nuovo. Questo viene fatto chiamando setNeedsDisplay (). Ecco la funzione timer aggiornata:
func updateTimer() {
if currentAngle < maxAngle {
currentAngle += 1
setNeedsDisplay()
}
}
_ _ _
Tutto il codice di cui hai bisogno è riassunto qui:
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)
}
}
Se vuoi cambiare la velocità, modifica semplicemente la funzione updateTimer o la velocità con cui questa funzione viene chiamata. Inoltre, potresti voler invalidare il timer una volta completato il cerchio, cosa che ho dimenticato di fare :-)
NB: Per aggiungere il cerchio nel tuo storyboard, aggiungi una vista, selezionala, vai al suo Ispettore di identità e, come Classe , specifica CircleClosing .
Saluti! Fra