Swift 旋转进度条进行快速倒计时

Swift 旋转进度条进行快速倒计时,swift,progress-bar,Swift,Progress Bar,圆圈进度条内有一个不断变化的数字(例如250、300、1000)。每当我单击时,数字将减少,圆圈进度条将移动。我是用计时器做的。但我想用我的控制来做。所以当我点击按钮时,它会移动,如果我不点击,它不会移动。 我的代码: import UIKit class ViewController: UIViewController { let shapeLAyer = CAShapeLayer() let progressLayer = CAShapeLayer()

圆圈进度条内有一个不断变化的数字(例如250、300、1000)。每当我单击时,数字将减少,圆圈进度条将移动。我是用计时器做的。但我想用我的控制来做。所以当我点击按钮时,它会移动,如果我不点击,它不会移动。 我的代码:

import UIKit

class ViewController: UIViewController {

    let shapeLAyer = CAShapeLayer()
    
    let progressLayer = CAShapeLayer()
    
    override func viewDidLoad() {
        super.viewDidLoad()
        
       
        
        let center = view.center
        
        let circularPath = UIBezierPath(arcCenter: center, radius: 100, startAngle: -CGFloat.pi/2, endAngle: 2*CGFloat.pi, clockwise: true)
        
        progressLayer.path = circularPath.cgPath
        // ui edits
       
        progressLayer.strokeColor = UIColor.black.cgColor
        
        progressLayer.fillColor = UIColor.clear.cgColor
        
        //progressLayer.fillColor = UIColor.clear.cgColor
        
        progressLayer.lineCap = .round
        
        progressLayer.lineWidth = 20.0
        
        view.layer.addSublayer(progressLayer)
      
        
       
        
        
        shapeLAyer.path = circularPath.cgPath
        
        shapeLAyer.fillColor = UIColor.clear.cgColor
        
        shapeLAyer.strokeColor = UIColor.red.cgColor
        
        shapeLAyer.lineWidth = 10
        
        shapeLAyer.lineCap = .round
        
        shapeLAyer.strokeEnd = 0

        
        view.addGestureRecognizer(UITapGestureRecognizer(target: self, action: #selector(handle)))
        
        view.layer.addSublayer(shapeLAyer)
    }
    
    @objc func handle(){
        let basicAnimation = CABasicAnimation(keyPath: "strokeEnd")
        basicAnimation.toValue = 1
        
        basicAnimation.duration = 3
        
        shapeLAyer.add(basicAnimation, forKey: "urSoBasic")
        
        
    }

}

[![enter image description here][1][1]

您可以通过设置适当的“从值到值”以及使用
cabasicanition

在这里,我使用两个var,一个表示总数(总进度),一个表示当前进度

从这两个变量中,我将该值转换为0-1之间的值

首先,在您的代码
UIBezierPath
中,角度是错误的。 将该行替换为

let circularPath = UIBezierPath(arcCenter: center, radius: 100, startAngle: -CGFloat.pi/2, endAngle: 3*CGFloat.pi / 2, clockwise: true)
类ViewController:UIViewController{
//其他代码
私有出租总数:CGFloat=300.0
私有变量currentProgressNumber:CGFloat=0
私人租赁基础化=资本化(关键路径:“strokeEnd”)
//viewDidLoad代码
func播放动画(){
如果currentProgressNumber>totalNumber | | currentProgressNumber<0{
返回
}
basicAnimation.fromValue=basicAnimation.toValue
basicAnimation.toValue=currentProgressNumber/totalNumber
basicAnimation.isRemovedOnCompletion=false
碱化时间=3
basicAnimation.fillMode=CAMediaTimingFillMode.both
shapeLAyer.add(碱性化,forKey:“熊基”)
}
@iAction func onIncrement(\uSender:ui按钮){

currentProgressNumber+=15//您的问题不清楚,无法进入下表。您可以再清除一些吗?上面的代码:当我单击屏幕时,有一个圆圈进度条可以工作。我想到达数字300。为此,我按0-1-2-3-…-300按钮,从标签中圆圈中的0开始。我希望每次单击时圆圈进度条都会移动按你的意思是,如果总值是300,我按了150数字按钮,那么半个圆圈就满了,当我按100时,进度就会按照数字显示,对吗?就像这样:)但是数字会一个接一个地增加。唯一的问题是没有300就完成了。在255,公寓已经满了。谢谢你的关注。如果我们这也可以:)这是不可能的。你能附上SS吗?好吧,这是我的错,因为我没有改变'endAngle:3*CGFloat.pi/2':(。对不起。拉贾非常感谢你。你是个好人。是的。这个需要在你的代码中更正
class ViewController: UIViewController {
    
    // Other code
    
    private let totalNumber: CGFloat = 300.0
    private var currentProgressNumber: CGFloat = 0
    private let basicAnimation = CABasicAnimation(keyPath: "strokeEnd")
    
    // viewDidLoad code
    
    func playAnimation(){
        if currentProgressNumber > totalNumber || currentProgressNumber < 0 {
            return
        }
        basicAnimation.fromValue = basicAnimation.toValue
        basicAnimation.toValue = currentProgressNumber/totalNumber
        basicAnimation.isRemovedOnCompletion = false
        basicAnimation.duration = 3
        basicAnimation.fillMode = CAMediaTimingFillMode.both
        shapeLAyer.add(basicAnimation, forKey: "urSoBasic")
    }
    
    @IBAction func onIncrement(_ sender: UIButton) {
        currentProgressNumber += 15 //<-- Change your increment interval here
        playAnimation()
    }
    
    @IBAction func onDecrement(_ sender: UIButton) {
        currentProgressNumber -= 15 //<-- Change your increment interval here
        playAnimation()
    }
}