ไมค์ตอบโจทย์มาก! อีกวิธีที่ดีและง่ายในการทำคือใช้ 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 หรืออัตราที่เรียกใช้ฟังก์ชันนี้ นอกจากนี้คุณอาจต้องการยกเลิกการจับเวลาเมื่อวงกลมเสร็จสมบูรณ์ซึ่งฉันลืมทำ :-)
หมายเหตุ: ในการเพิ่มแวดวงในสตอรีบอร์ดของคุณเพียงเพิ่มมุมมองเลือกจากนั้นไปที่ตัวตรวจสอบข้อมูลประจำตัวและระบุCircleClosingในฐานะคลาส CircleClosing
ไชโย! bRo