マイクの答えは素晴らしいです!それを行うもう1つの素晴らしく単純な方法は、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を増やします。クラスの上部に、2つの火災のタイミングを追加します。
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を指定します。
乾杯!bRo