Ответ Майка отличный! Другой хороший и простой способ сделать это - использовать drawRect в сочетании с setNeedsDisplay (). Вроде тормозит, но это не так :-)
Мы хотим нарисовать круг, начинающийся сверху, который составляет -90 ° и заканчивается 270 °. Центр круга (centerX, centerY) с заданным радиусом. CurrentAngle - это текущий угол конечной точки круга от 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
В drawRect мы указываем, как должен отображаться круг:
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)
}
Проблема в том, что прямо сейчас, поскольку currentAngle не меняется, круг статичен и даже не отображается, поскольку currentAngle = minAngle.
Затем мы создаем таймер, и всякий раз, когда он срабатывает, мы увеличиваем currentAngle. В верхней части класса добавьте время между двумя кострами:
let timeBetweenDraw:CFTimeInterval = 0.01
В вашем init добавьте таймер:
NSTimer.scheduledTimerWithTimeInterval(timeBetweenDraw, target: self, selector: #selector(updateTimer), userInfo: nil, repeats: true)
Мы можем добавить функцию, которая будет вызываться при срабатывании таймера:
func updateTimer() {
if currentAngle < maxAngle {
currentAngle += 1
}
}
К сожалению, при запуске приложения ничего не отображается, потому что мы не указали систему, которую оно должно рисовать снова. Это делается путем вызова setNeedsDisplay (). Вот обновленная функция таймера:
func updateTimer() {
if currentAngle < maxAngle {
currentAngle += 1
setNeedsDisplay()
}
}
_ _ _
Весь необходимый вам код обобщен здесь:
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)
}
}
Если вы хотите изменить скорость, просто измените функцию updateTimer или скорость, с которой эта функция вызывается. Кроме того, вы можете захотеть отключить таймер, когда круг будет завершен, что я забыл сделать :-)
NB: Чтобы добавить круг в раскадровку, просто добавьте представление, выберите его, перейдите в его инспектор идентичности и в качестве класса укажите CircleClosing .
Ура! bRo