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