La réponse de Mike est géniale! Un autre moyen simple et agréable de le faire est d'utiliser drawRect combiné avec setNeedsDisplay (). Cela semble lent, mais ce n'est pas :-)
Nous voulons dessiner un cercle partant du haut, qui fait -90 ° et se termine à 270 °. Le centre du cercle est (centerX, centerY), avec un rayon donné. CurrentAngle est l'angle actuel du point final du cercle, allant de minAngle (-90) à 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
Dans drawRect, nous spécifions comment le cercle est censé s'afficher:
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)
}
Le problème est que pour le moment, comme currentAngle ne change pas, le cercle est statique et ne s'affiche même pas, comme currentAngle = minAngle.
Nous créons ensuite une minuterie, et chaque fois que cette minuterie se déclenche, nous augmentons currentAngle. En haut de votre classe, ajoutez le temps entre deux incendies:
let timeBetweenDraw:CFTimeInterval = 0.01
Dans votre init, ajoutez le timer:
NSTimer.scheduledTimerWithTimeInterval(timeBetweenDraw, target: self, selector: #selector(updateTimer), userInfo: nil, repeats: true)
Nous pouvons ajouter la fonction qui sera appelée lorsque la minuterie se déclenchera:
func updateTimer() {
if currentAngle < maxAngle {
currentAngle += 1
}
}
Malheureusement, lors de l'exécution de l'application, rien ne s'affiche car nous n'avons pas spécifié le système à dessiner à nouveau. Cela se fait en appelant setNeedsDisplay (). Voici la fonction de minuterie mise à jour:
func updateTimer() {
if currentAngle < maxAngle {
currentAngle += 1
setNeedsDisplay()
}
}
_ _ _
Tout le code dont vous avez besoin est résumé ici:
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 vous souhaitez changer la vitesse, modifiez simplement la fonction updateTimer, ou la vitesse à laquelle cette fonction est appelée. De plus, vous voudrez peut-être invalider le minuteur une fois le cercle terminé, ce que j'ai oublié de faire :-)
NB: Pour ajouter le cercle dans votre storyboard, il suffit d'ajouter une vue, de la sélectionner, d'aller dans son inspecteur d'identité , et en tant que classe , de spécifier CircleClosing .
À votre santé! bRo