Swift анимированный круговой индикатор выполнения

David Ruland спросил: 11 марта 2019 в 07:30 в: swift

Я создал в Swift круговую диаграмму выполнения, которая анимировалась в течение 1,5 секунд до значения 1, когда пользователь удерживал вид. Но я хочу добавить новый viewcontroller, когда анимация будет завершена, и перезапустить мой круговой индикатор выполнения, если пользователь завершил работу рано. Кто-нибудь может мне помочь?

Индикатор выполнения циркуляров работает с анимацией, когда пользователь удерживает вид и останавливается при отпускании.

    class CounterView: UIView {
        var bgPath: UIBezierPath!
        var shapeLayer: CAShapeLayer!
        var progressLayer: CAShapeLayer!
       var done : Bool = false
        override init(frame: CGRect) {
            super.init(frame: frame)
            bgPath = UIBezierPath()
            self.simpleShape()
        }        required public init?(coder aDecoder: NSCoder) {
            super.init(coder: aDecoder)
            bgPath = UIBezierPath()
            self.simpleShape()
        }        func simpleShape()
        {
            createCirclePath()
            shapeLayer = CAShapeLayer()
            shapeLayer.path = bgPath.cgPath
            shapeLayer.lineWidth = 5
            shapeLayer.fillColor = nil
            shapeLayer.strokeColor = UIColor.clear.cgColor            progressLayer = CAShapeLayer()
            progressLayer.path = bgPath.cgPath
            progressLayer.lineCap = kCALineCapRound
            progressLayer.lineWidth = 5
            progressLayer.fillColor = nil
            progressLayer.strokeColor = UIColor.yellow.cgColor
            progressLayer.strokeEnd = 0.0            self.layer.addSublayer(shapeLayer)
            self.layer.addSublayer(progressLayer)
        }        private func createCirclePath()
        {            let x = self.frame.width/2
            let y = self.frame.height/2
            let center = CGPoint(x: x, y: y)
            print(x,y,center)
            bgPath.addArc(withCenter: center, radius: x/CGFloat(2), startAngle: CGFloat(0), endAngle: CGFloat(6.28), clockwise: true)
            bgPath.close()
        }    var animationCompletedCallback: (() -> Void)?
    func setProgressWithAnimation(duration: TimeInterval, value: Float)  {        CATransaction.setCompletionBlock {
           if let callBack = animationCompletedCallback { callBack() }
        }        CATransaction.begin()        let  animation = CABasicAnimation (keyPath: "strokeEnd")
        animation.duration = duration
        animation.fromValue = 0
        animation.toValue = value
        animation.repeatCount = .infinity
        animation.timingFunction = CAMediaTimingFunction (name: kCAMediaTimingFunctionLinear)
        progressLayer.strokeEnd = CGFloat(value)
        progressLayer.add(animation, forKey: "animateprogress")        CATransaction.commit()
}
}     class ViewController: UIViewController {            @IBOutlet weak var counterView: CounterView!
            @IBOutlet weak var holdView: UIView!            override func viewDidLoad() {
                super.viewDidLoad()
                addLongPressGesture()
               addCounterViewCallback()            }                @objc func longPress(gesture: UILongPressGestureRecognizer) {
                if gesture.state == UIGestureRecognizerState.began {
                   self.counterView.setProgressWithAnimation(duration: 1.5, value: 1.0)                }                  if gesture.state == UIGestureRecognizerState.ended {
                       ///addFlashView()                }            }            func addLongPressGesture(){
                let lpgr = UILongPressGestureRecognizer(target: self, action: #selector(longPress(gesture:)))
                lpgr.minimumPressDuration = 0
                self.holdView.addGestureRecognizer(lpgr)
            }
private func addCounterViewCallback() {
        counterView.animationCompletedCallback = { [weak self] in
            guard let weakSelf = self else {return}
            weakSelf.addFlashView()
        }
    }             func addFlashView(){
                let storyBoard : UIStoryboard = UIStoryboard(name: "Main", bundle:nil)                let resultViewController = storyBoard.instantiateViewController(withIdentifier: "ResultView") as! Flash                self.present(resultViewController, animated:true, completion:nil)
            }

Добавьте новый viewcontroller после завершения анимации и перезапустите анимацию, если пользователь отключил просмотр, и снова удерживайте его.

0 ответов