Код ниже создает круговой индикатор выполнения (с анимированной меткой) внутри ячеек UITableView. Этот индикатор выполнения имеет анимацию 2 с, показывающую прогресс выполнения индикатора выполнения. Все работает хорошо, пока ячейка не будет удалена из видимых ячеек. Когда это происходит, код удаляет анимацию и фигуру из вида. Когда эта ячейка снова становится видимой, анимация рисования не запускается, а я хочу, чтобы она запускалась каждый раз, когда мои ячейки становятся видимыми. Индикатор выполнения рисуется без анимации.
Я не понимаю, почему ...
Вот код:
class CircularProgressBarView : UIView {
var shapeLayer : CAShapeLayer!
var path : UIBezierPath!
var shapeColor = UIColor.black
var completionEnd : CGFloat = 1.0 {
didSet {
draw(frame)
}
}
let countdownLabel : Countdownlabel = {
let label = Countdownlabel()
label.frame = CGRect(x: 0, y: 0, width: 45, height: 15)
label.font = UIFont.systemFont(ofSize: 14)
return label
}()
public override func draw(_ rect: CGRect) {
super.draw(rect)
configureCountdownLabel()
path = UIBezierPath(arcCenter: .zero, radius: frame.width/2, startAngle: -CGFloat.pi/2, endAngle: CGFloat.pi * 1.5, clockwise: true)
drawCircleLayer(color: shapeColor, endValue: completionEnd)
backgroundColor = UIColor.clear
}
public func startLabelAnimation(endValue: Int) {
countdownLabel.startAnimation(endValue: endValue)
}
private func configureCountdownLabel() {
addSubview(countdownLabel)
countdownLabel.translatesAutoresizingMaskIntoConstraints = false
countdownLabel.centerXAnchor.constraint(equalTo: self.centerXAnchor).isActive = true
countdownLabel.centerYAnchor.constraint(equalTo: self.centerYAnchor).isActive = true
}
private func drawCircleLayer(color: UIColor, endValue: CGFloat) {
shapeLayer = CAShapeLayer()
shapeLayer.path = path.cgPath
shapeLayer.strokeColor = color.cgColor
shapeLayer.fillColor = UIColor.clear.cgColor
shapeLayer.lineWidth = 5
shapeLayer.strokeEnd = 0
shapeLayer.lineCap = kCALineCapRound
shapeLayer.position = center
self.layer.insertSublayer(shapeLayer, at: 0)
addDrawAnimation(until: endValue)
}
private func addDrawAnimation(until endValue: CGFloat) {
let basicAnimation = CABasicAnimation(keyPath: "strokeEnd")
basicAnimation.toValue = endValue
basicAnimation.duration = Constants.AnimationDuration.Shape
basicAnimation.fillMode = kCAFillModeForwards
basicAnimation.isRemovedOnCompletion = false
shapeLayer.add(basicAnimation, forKey: "CircularProgressBar")
}
public func remove() {
shapeLayer.removeAllAnimations()
shapeLayer.removeFromSuperlayer()
countdownLabel.stopAnimation()
}
}
class BirthdayTableViewCell: UITableViewCell {
...
let circularProgressBar : CircularProgressBarView = {
let progressBar = CircularProgressBarView()
progressBar.frame = CGRect(x: 0, y: 0, width: 40, height: 40)
return progressBar
}()
var birthday : Birthday! {
didSet {
circularProgressBar.shapeColor = color
circularProgressBar.completionEnd = birthday.progress
circularProgressBar.startLabelAnimation(endValue: birthday.countdown)
}
}
...
}
extension BirthdaysViewController: UITableViewDelegate, UITableViewDataSource {
func numberOfSections(in tableView: UITableView) -> Int {
return sectionBirthdayArray.count
}
func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return sectionBirthdayArray[section].count
}
func tableView(_ tableView: UITableView, didEndDisplaying cell: UITableViewCell, forRowAt indexPath: IndexPath) {
let birthdayCell = cell as! BirthdayTableViewCell
birthdayCell.circularProgressBar.remove()
}
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCell(withIdentifier: cellId, for: indexPath) as! BirthdayTableViewCell
cell.birthday = sectionBirthdayArray[indexPath.section][indexPath.row]
print("cellForRowAt() : \(indexPath)")
return cell
}
}
У вас есть идея?