Câu trả lời của Mike thật tuyệt! Một cách đơn giản và hay khác là sử dụng drawRect kết hợp với setNeedsDisplay (). Nó có vẻ chậm, nhưng không phải :-)
Chúng tôi muốn vẽ một vòng tròn bắt đầu từ trên cùng, đó là -90 ° và kết thúc ở 270 °. Tâm của đường tròn là (tâmX, tâmY), với bán kính cho trước. CurrentAngle là góc hiện tại của điểm cuối của vòng tròn, đi từ minAngle (-90) đến 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
Trong drawRect, chúng tôi chỉ định cách hình tròn được hiển thị:
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)
}
Vấn đề là ngay bây giờ, vì currentAngle không thay đổi, vòng tròn là tĩnh và thậm chí không hiển thị, như currentAngle = minAngle.
Sau đó, chúng tôi tạo một bộ hẹn giờ và bất cứ khi nào bộ hẹn giờ đó kích hoạt, chúng tôi sẽ tăng currentAngle. Ở đầu lớp học của bạn, hãy thêm thời gian giữa hai lần kích hoạt:
let timeBetweenDraw:CFTimeInterval = 0.01
Trong init của bạn, thêm bộ đếm thời gian:
NSTimer.scheduledTimerWithTimeInterval(timeBetweenDraw, target: self, selector: #selector(updateTimer), userInfo: nil, repeats: true)
Chúng ta có thể thêm chức năng sẽ được gọi khi bộ hẹn giờ kích hoạt:
func updateTimer() {
if currentAngle < maxAngle {
currentAngle += 1
}
}
Đáng buồn thay, khi chạy ứng dụng, không có gì hiển thị vì chúng tôi không chỉ định hệ thống mà nó sẽ vẽ lại. Điều này được thực hiện bằng cách gọi setNeedsDisplay (). Đây là chức năng hẹn giờ được cập nhật:
func updateTimer() {
if currentAngle < maxAngle {
currentAngle += 1
setNeedsDisplay()
}
}
_ _ _
Tất cả mã bạn cần được tổng hợp ở đây:
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)
}
}
Nếu bạn muốn thay đổi tốc độ, chỉ cần sửa đổi hàm updateTimer hoặc tốc độ mà hàm này được gọi. Ngoài ra, bạn có thể muốn vô hiệu hóa bộ hẹn giờ sau khi vòng kết nối hoàn tất, điều mà tôi đã quên :-)
NB: Để thêm vòng kết nối vào bảng phân cảnh của bạn, chỉ cần thêm một chế độ xem, chọn nó, đi tới Trình kiểm tra danh tính của nó và với tư cách là Lớp , hãy chỉ định CircleClosing .
Chúc mừng! bRo