Mike'ın cevabı harika! Bunu yapmanın bir başka güzel ve basit yolu da setNeedsDisplay () ile birlikte drawRect kullanmaktır. Gecikmiş gibi görünüyor, ama değil :-)
Yukarıdan -90 ° olan ve 270 ° ile biten bir daire çizmek istiyoruz. Dairenin merkezi, belirli bir yarıçapa sahip (centerX, centerY) dir. CurrentAngle, dairenin bitiş noktasının minAngle (-90) 'dan maxAngle (270)' e giden mevcut açısıdır.
// 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'te, dairenin nasıl görüntüleneceğini belirtiyoruz:
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)
}
Sorun şu ki, currentAngle değişmediğinden, çember statiktir ve currentAngle = minAngle olarak görünmez bile.
Daha sonra bir zamanlayıcı oluşturuyoruz ve bu zamanlayıcı her tetiklendiğinde, akım Açısını artırıyoruz. Sınıfınızın en üstüne, iki ateş arasındaki zamanlamayı ekleyin:
let timeBetweenDraw:CFTimeInterval = 0.01
Başlığınıza zamanlayıcıyı ekleyin:
NSTimer.scheduledTimerWithTimeInterval(timeBetweenDraw, target: self, selector: #selector(updateTimer), userInfo: nil, repeats: true)
Zamanlayıcı tetiklendiğinde çağrılacak işlevi ekleyebiliriz:
func updateTimer() {
if currentAngle < maxAngle {
currentAngle += 1
}
}
Ne yazık ki, uygulamayı çalıştırırken, yeniden çizmesi gereken sistemi belirtmediğimiz için hiçbir şey görüntülenmiyor. Bu, setNeedsDisplay () çağrılarak yapılır. İşte güncellenmiş zamanlayıcı işlevi:
func updateTimer() {
if currentAngle < maxAngle {
currentAngle += 1
setNeedsDisplay()
}
}
_ _ _
İhtiyacınız olan tüm kod burada özetlenmiştir:
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)
}
}
Hızı değiştirmek istiyorsanız, sadece updateTimer işlevini veya bu işlevin çağrılma hızını değiştirin. Ayrıca, daire tamamlandığında zamanlayıcıyı geçersiz kılmak isteyebilirsiniz ki bunu yapmayı unuttum :-)
Not: Çevreyi film şeridinize eklemek için bir görünüm ekleyin, seçin, Kimlik Denetçisine gidin ve Sınıf olarak CircleClosing'i belirtin .
Şerefe! kanka