Jawaban Mike bagus! Cara lain yang bagus dan sederhana untuk melakukannya adalah menggunakan drawRect yang dikombinasikan dengan setNeedsDisplay (). Tampaknya lamban, tetapi tidak :-)
Kami ingin menggambar lingkaran mulai dari atas, yaitu -90 ° dan berakhir pada 270 °. Pusat lingkaran adalah (centerX, centerY), dengan radius tertentu. CurrentAngle adalah sudut saat ini dari titik akhir lingkaran, mulai dari minAngle (-90) ke 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
Di drawRect, kami menentukan bagaimana lingkaran seharusnya ditampilkan:
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)
}
Masalahnya adalah saat ini, karena currentAngle tidak berubah, lingkarannya statis, dan bahkan tidak muncul, karena currentAngle = minAngle.
Kami kemudian membuat timer, dan setiap kali timer itu menyala, kami meningkatkan currentAngle. Di bagian atas kelas Anda, tambahkan waktu antara dua kebakaran:
let timeBetweenDraw:CFTimeInterval = 0.01
Di init Anda, tambahkan timer:
NSTimer.scheduledTimerWithTimeInterval(timeBetweenDraw, target: self, selector: #selector(updateTimer), userInfo: nil, repeats: true)
Kita dapat menambahkan fungsi yang akan dipanggil saat pengatur waktu menyala:
func updateTimer() {
if currentAngle < maxAngle {
currentAngle += 1
}
}
Sayangnya, saat menjalankan aplikasi, tidak ada yang ditampilkan karena kami tidak menentukan sistem yang harus digambar lagi. Ini dilakukan dengan memanggil setNeedsDisplay (). Berikut adalah fungsi pengatur waktu yang diperbarui:
func updateTimer() {
if currentAngle < maxAngle {
currentAngle += 1
setNeedsDisplay()
}
}
_ _ _
Semua kode yang Anda butuhkan diringkas di sini:
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)
}
}
Jika Anda ingin mengubah kecepatan, cukup ubah fungsi updateTimer, atau kecepatan pemanggilan fungsi ini. Juga, Anda mungkin ingin membatalkan pengatur waktu setelah lingkaran selesai, yang saya lupa lakukan :-)
NB: Untuk menambahkan lingkaran di storyboard Anda, cukup tambahkan tampilan, pilih, buka Identity Inspector , dan sebagai Class , tentukan CircleClosing .
Bersulang! bRo