¡La respuesta de Mike es genial! Otra forma agradable y sencilla de hacerlo es usar drawRect combinado con setNeedsDisplay (). Parece lento, pero no lo es :-)
Queremos dibujar un círculo empezando por la parte superior, que tiene -90 ° y termina en 270 °. El centro del círculo es (centerX, centerY), con un radio dado. CurrentAngle es el ángulo actual del punto final del círculo, que va desde 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
En drawRect, especificamos cómo se supone que se muestra el círculo:
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)
}
El problema es que en este momento, como currentAngle no cambia, el círculo es estático y ni siquiera se muestra, como currentAngle = minAngle.
Luego creamos un temporizador, y cada vez que se dispara, aumentamos currentAngle. En la parte superior de su clase, agregue el tiempo entre dos incendios:
let timeBetweenDraw:CFTimeInterval = 0.01
En su init, agregue el temporizador:
NSTimer.scheduledTimerWithTimeInterval(timeBetweenDraw, target: self, selector: #selector(updateTimer), userInfo: nil, repeats: true)
Podemos agregar la función que se llamará cuando se active el temporizador:
func updateTimer() {
if currentAngle < maxAngle {
currentAngle += 1
}
}
Lamentablemente, al ejecutar la aplicación, no se muestra nada porque no especificamos el sistema que debería dibujar nuevamente. Esto se hace llamando a setNeedsDisplay (). Aquí está la función de temporizador actualizada:
func updateTimer() {
if currentAngle < maxAngle {
currentAngle += 1
setNeedsDisplay()
}
}
_ _ _
Todo el código que necesita se resume aquí:
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)
}
}
Si desea cambiar la velocidad, simplemente modifique la función updateTimer o la velocidad a la que se llama a esta función. Además, es posible que desee invalidar el temporizador una vez que se complete el círculo, lo que olvidé hacer :-)
NB: Para agregar el círculo en su guión gráfico, simplemente agregue una vista, selecciónela, vaya a su Inspector de identidad y, como Clase , especifique CircleClosing .
¡Salud! bRo