Ios 如何在进度条UIView中添加动画
我想在我的进度条中添加一个基于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()
@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
}
}