Odpowiedź Mike'a jest świetna! Innym przyjemnym i prostym sposobem jest użycie drawRect w połączeniu z setNeedsDisplay (). Wydaje się, że jest opóźniony, ale nie :-)
Chcemy narysować okrąg zaczynający się od góry, który wynosi -90 °, a kończy się na 270 °. Środek okręgu to (centerX, centerY) o zadanym promieniu. CurrentAngle to bieżący kąt punktu końcowego okręgu, od minAngle (-90) do 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
W drawRect określamy, jak ma się wyświetlać okrąg:
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)
}
Problem polega na tym, że teraz, ponieważ currentAngle się nie zmienia, okrąg jest statyczny i nawet się nie wyświetla, jako currentAngle = minAngle.
Następnie tworzymy licznik czasu i ilekroć ten licznik jest uruchamiany, zwiększamy wartość currentAngle. U góry klasy dodaj czas między dwoma pożarami:
let timeBetweenDraw:CFTimeInterval = 0.01
W swoim init dodaj licznik czasu:
NSTimer.scheduledTimerWithTimeInterval(timeBetweenDraw, target: self, selector: #selector(updateTimer), userInfo: nil, repeats: true)
Możemy dodać funkcję, która zostanie wywołana po uruchomieniu timera:
func updateTimer() {
if currentAngle < maxAngle {
currentAngle += 1
}
}
Niestety, podczas uruchamiania aplikacji nic się nie wyświetla, ponieważ nie określiliśmy systemu, który ma rysować ponownie. Odbywa się to przez wywołanie setNeedsDisplay (). Oto zaktualizowana funkcja timera:
func updateTimer() {
if currentAngle < maxAngle {
currentAngle += 1
setNeedsDisplay()
}
}
_ _ _
Tutaj podsumowano cały potrzebny kod:
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)
}
}
Jeśli chcesz zmienić prędkość, po prostu zmodyfikuj funkcję updateTimer lub szybkość, z jaką ta funkcja jest wywoływana. Możesz również chcieć unieważnić licznik czasu, gdy koło się zakończy, o czym zapomniałem :-)
NB: Aby dodać okrąg do swojej scenorysu, po prostu dodaj widok, wybierz go, przejdź do jego Inspektora tożsamości i jako Klasa określ CircleClosing .
Twoje zdrowie! bracie