माइक का जवाब बहुत अच्छा है! इसे करने का एक और अच्छा और सरल तरीका यह है कि ड्रॉइरेक्ट का उपयोग सेटनिड्सडिसप्ले () के साथ किया जाए। यह भारी लगता है, लेकिन इसके :-) नहीं
हम ऊपर से शुरू होने वाले एक वृत्त को खींचना चाहते हैं, जो -90 ° है और 270 ° पर समाप्त होता है। सर्कल का केंद्र एक दिए गए त्रिज्या के साथ (सेंटरएक्स, सेंटरवाई) है। 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
ड्राअरक्ट में, हम निर्दिष्ट करते हैं कि सर्कल को कैसे प्रदर्शित किया जाए:
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)
}
समस्या यह है कि अभी, जैसा कि करंट एंगल नहीं बदल रहा है, सर्कल स्थिर है, और यह भी नहीं दिखाता है, जैसा कि करंट एंगल = मिंजल है।
हम तब एक टाइमर बनाते हैं, और जब कभी भी उस टाइमर में आग लग जाती है, तो हम करंट को बढ़ा देते हैं। अपनी कक्षा के शीर्ष पर, दो आग के बीच का समय जोड़ें:
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)
}
}
यदि आप गति बदलना चाहते हैं, तो बस अद्यतन फ़ंक्शन को संशोधित करें, या जिस दर पर यह फ़ंक्शन कहा जाता है। सर्कल पूरा होने के बाद, आप टाइमर को अमान्य करना चाहते हैं, जिसे मैं भूल गया था :-)
NB: अपने स्टोरीबोर्ड में सर्कल जोड़ने के लिए, बस एक दृश्य जोड़ें, इसे चुनें, इसके पहचान निरीक्षक पर जाएं और कक्षा के रूप में , CircleClosing निर्दिष्ट करें ।
चीयर्स! भाई