[英]Circular progress bar in Swift 5
我曾嘗試做一個圓形進度條,但是當我運行該應用程序時,它崩潰並顯示下一個錯誤:
致命錯誤:在隱式展開可選值時意外發現 nil:文件 /Users/marcoalonso/Documents/SWIFT_PROJECTS/CircularProgressView/CircularProgressView/ViewController.swift,第 15 行 2020-04-18 19:26:405.10369356-03 ] 致命錯誤:在隱式展開可選值時意外發現 nil:文件 /Users/marcoalonso/Documents/SWIFT_PROJECTS/CircularProgressView/CircularProgressView/ViewController.swift,第 15 行
我只有 2 個文件,它們是:
import UIKit
class ViewController: UIViewController {
@IBOutlet weak var containerView: UIView!
var circularView: CircularProgressView!
var duration: TimeInterval!
override func viewDidLoad() {
super.viewDidLoad()
circularView.center = view.center
containerView.addGestureRecognizer(UITapGestureRecognizer(target: self, action: #selector(handleTap)))
view.addSubview(circularView)
}
@objc func handleTap() {
duration = 3.0
circularView.progressAnimation(duration: duration)
}
}
和 CircularProgressView.swift:
import UIKit
class CircularProgressView: UIView {
// First create two layer properties
private var circleLayer = CAShapeLayer()
private var progressLayer = CAShapeLayer()
override init(frame: CGRect) {
super.init(frame: frame)
createCircularPath()
}
required init?(coder aDecoder: NSCoder) {
super.init(coder: aDecoder)
createCircularPath()
}
func createCircularPath() {
let circularPath = UIBezierPath(arcCenter: CGPoint(x: frame.size.width / 2.0, y: frame.size.height / 2.0), radius: 80, startAngle: -.pi / 2, endAngle: 3 * .pi / 2, clockwise: true)
circleLayer.path = circularPath.cgPath
circleLayer.fillColor = UIColor.clear.cgColor
circleLayer.lineCap = .round
circleLayer.lineWidth = 20.0
circleLayer.strokeColor = UIColor.black.cgColor
progressLayer.path = circularPath.cgPath
progressLayer.fillColor = UIColor.clear.cgColor
progressLayer.lineCap = .round
progressLayer.lineWidth = 10.0
progressLayer.strokeEnd = 0
progressLayer.strokeColor = UIColor.red.cgColor
layer.addSublayer(circleLayer)
layer.addSublayer(progressLayer)
}
func progressAnimation(duration: TimeInterval) {
let circularProgressAnimation = CABasicAnimation(keyPath: "strokeEnd")
circularProgressAnimation.duration = duration
circularProgressAnimation.toValue = 1.0
circularProgressAnimation.fillMode = .forwards
circularProgressAnimation.isRemovedOnCompletion = false
progressLayer.add(circularProgressAnimation, forKey: "progressAnim")
}
}
我希望有人可以幫助我!
在這里,您使用 nil circularView
來分配center
屬性,這是失敗的
override func viewDidLoad() {
super.viewDidLoad()
circularView.center = view.center
containerView.addGestureRecognizer(UITapGestureRecognizer(target: self, action: #selector(handleTap)))
view.addSubview(circularView)
}
您可以在circularView
不為 nil 時刪除該行並分配中心,或者先初始化circularView
然后使用中心。
只需在 ViewController 中初始化 circularView:
代替:
var circularView: CircularProgressView!
和:
var circularView = CircularProgressView()
您還沒有為循環視圖初始化任何 object。 您只說過 circleView 將有一個 CircularProgressView 類型的 object 但您沒有在那里存儲任何 object 。 因此,在使用 circularView 進行任何操作之前,先使用以下命令對其進行初始化:
circularView = CircularProgressView()
為了更清楚你的代碼應該是這樣的
import UIKit
class ViewController: UIViewController {
@IBOutlet weak var containerView: UIView!
var circularView: CircularProgressView!
var duration: TimeInterval!
override func viewDidLoad() {
super.viewDidLoad()
circularView = CircularProgressView()
circularView.center = view.center
containerView.addGestureRecognizer(UITapGestureRecognizer(target: self, action: #selector(handleTap)))
view.addSubview(circularView)
}
@objc func handleTap() {
duration = 3.0
circularView.progressAnimation(duration: duration)
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.