Відповідь Майка чудова! Ще один приємний і простий спосіб зробити це використовувати drawRect в поєднанні з setNeedsDisplay (). Це здається млявим, але його немає :-)
Ми хочемо намалювати коло, починаючи з вершини, яка дорівнює -90 °, а закінчується на 270 °. Центр кола - (centerX, центрY), із заданим радіусом. 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
Додайте таймер:
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 або швидкість, з якою ця функція викликається. Крім того, ви можете скасувати таймер, коли коло завершиться, що я забув зробити :-)
Примітка: Щоб додати коло у вашій дошці, просто додайте подання, виберіть його, перейдіть до його інспектора ідентичності та в якості класу вкажіть CircleClosing .
Ура! bRo