Проблема анимации формы внутри пользовательской ячейки таблицы после удаления - PullRequest
0 голосов
/ 31 августа 2018

Код ниже создает круговой индикатор выполнения (с анимированной меткой) внутри ячеек 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
    }
}

У вас есть идея?

...