Ios 如何在进度条UIView中添加动画

Ios 如何在进度条UIView中添加动画,ios,swift,uiview,uiviewanimation,uibezierpath,Ios,Swift,Uiview,Uiviewanimation,Uibezierpath,我想在我的进度条中添加一个基于UIView的动画。 这是我的密码 @IBDesignable class PlainHorizontalProgressBar: UIView { @IBInspectable var color: UIColor = .green { didSet { setNeedsDisplay() } } var progress: CGFloat = 0 { didSet { setNeedsDisplay()

我想在我的进度条中添加一个基于UIView的动画。 这是我的密码

@IBDesignable class PlainHorizontalProgressBar: UIView {
    @IBInspectable var color: UIColor = .green {
        didSet { setNeedsDisplay() }
    }

    var progress: CGFloat = 0 {
        didSet { setNeedsDisplay() }
    }
    
    private let progressLayer = CALayer()
    private let backgroundMask = CAShapeLayer()
    
    override init(frame: CGRect) {
        super.init(frame: frame)
        setupLayers()
    }
    
    required init?(coder: NSCoder) {
        super.init(coder: coder)
        setupLayers()
    }
    
    private func setupLayers() {
        layer.addSublayer(progressLayer)
    }
    
    override func draw(_ rect: CGRect) {
        backgroundColor = .grey
        backgroundColor?.setFill()
        
        UIBezierPath(roundedRect: rect, cornerRadius: rect.height * 0.25).fill()
        
        backgroundMask.path = UIBezierPath(roundedRect: rect, cornerRadius: rect.height * 0.25).cgPath
        layer.mask = backgroundMask
    
        let progressRect = CGRect(origin: .zero, size: CGSize(width: rect.width * progress, height: rect.height))
    
        progressLayer.frame = progressRect
        layer.addSublayer(progressLayer)
        progressLayer.backgroundColor = color.cgColor
    }

}


这里的场景是,我有ViewController A和ViewController B,ViewController B上的进度条,我正在将一个值从ViewController A分配给ViewController B(例如:myView.progress=0.5),现在当我来到ViewController B时,我的进度条已经填满了一半,但我想要的是,当我来到ViewController B时,当我降落在ViewController B上时,这应该会在我的前面产生动画和填充。

这里的主要问题是您的
绘制
实现错误。或者,更好地说,您的
draw
实现应该根本不存在。在
draw
中唯一应该发生的事情就是绘图

如果要添加子层,则需要一个只调用一次的特定方法来添加子层

如果要更改其中一个子层的帧,则需要另一种特定方法来更改(已存在)子层的帧。一旦你将其分离,如何在帧中设置变化的动画就变得更加明显了。事实上,因为这是一个层,动画将自动发生


关于允许将
进度
值设置在1和100之间的部分是一个基本的算术问题,留给读者作为练习。

这个问题对我来说仍然存在,让我解释一下我的场景,我有ViewController a和ViewController B,我在ViewController B上有这个进度条,我正在将一个值从ViewController a分配给ViewController B(例如:
myView.progress=0.5
),现在当我来到ViewController B时,我的进度已经填充了一半,但我想要的是,当我来到ViewController B时,这应该会使我的前面和填充的一半都有动画效果,这在这里并没有发生。我写了一些工作代码,演示了如何将进度动画化。这就是我所感兴趣的。我不关心是否满足后来透露的其他规格。根据我的解释,很容易解决所有这些问题。
class PlainHorizontalProgressBar: UIView {
    
    var color: UIColor = .green {
        didSet { update() }
    }

    var progress: CGFloat = 0 {
        didSet { update() }
    }
    
    private let progressLayer = CALayer()
    private let backgroundMask = CAShapeLayer()
    
    override init(frame: CGRect) {
        super.init(frame: frame)
        setupLayers()
    }
    
    required init?(coder: NSCoder) {
        super.init(coder: coder)
        setupLayers()
    }
    
    private func setupLayers() {
        layer.addSublayer(progressLayer)
    }
    
    override func layoutSubviews() {
        super.layoutSubviews()
        backgroundMask.path = UIBezierPath(roundedRect: self.bounds, cornerRadius: self.bounds.size.height * 0.25).cgPath
        layer.mask = backgroundMask
        update()
    }
    
    func update() {
        let progressRect = CGRect(origin: .zero, size: CGSize(width: self.bounds.size.width * progress, height: self.bounds.size.height))
        progressLayer.frame = progressRect
        progressLayer.backgroundColor = color.cgColor
    }

}