迈克的答案很棒!另一种不错的简单方法是将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函数或该函数的调用速率即可。另外,您可能希望在圈圈完成后使计时器失效,而我忘记这样做了:-)
注意:要将圆形添加到情节提要中,只需添加一个视图,将其选中,转到其Identity Inspector,然后将Class指定为CircleClosing作为Class。
干杯! 博罗