Использование CADisplayLink в контроллере для запуска анимации в TableViewCells

Я смог получить CADisplayLink запустить анимацию индикатора выполнения в TableViewCells, Я написал всю анимацию в пользовательском файле ячейки. Вот код:

override init(style: UITableViewCell.CellStyle, reuseIdentifier: String?) {
    super.init(style: style, reuseIdentifier: reuseIdentifier)
    contentView.addSubview(timeRemainingView)
    contentView.addSubview(testlabel)
    contentView.bringSubviewToFront(testlabel)
    contentView.backgroundColor = .white

    let displayLink = CADisplayLink(target: self, selector: #selector(handleProgressAnimation))
    displayLink.add(to: .main, forMode: .defaultRunLoopMode)
    setupViews()

     }

var animationDuration = 60.0 //Just initialization value
let animationStartDate = Date()


@objc func handleProgressAnimation() {
    let currenttime = Date()
    let elapsed = currenttime.timeIntervalSince(animationStartDate)

    // do your animation logic here

    let percentage = elapsed / animationDuration
    timeRemainingView.frame.size.width = CGFloat(400 - (400 * percentage))

    if (percentage >= 1 )
    {
        self.timeDurationCompleted()
    }

}

Анимация работает хорошо, когда нет повторного использования ячейки.

введите описание изображения здесь

Однако, когда я прокручиваю и ячейки используются повторно, анимация теряет свою актуальность. Я знаю, что такие таймеры должны быть реализованы в контроллере. Мне просто нужна помощь, как это сделать, когда у вас есть CADisplayLink, каждый TableviewCell имеет пользовательское время, которое я устанавливаю из cellforrow в контроллере:

 func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    let cell = tableView.dequeueReusableCell(withIdentifier: cellid, for: indexPath) as! listTableViewCell
    cell.testlabel.text = "\(durationTime[indexPath.row])"
    cell.animationDuration = Double(durationTime[indexPath.row])

    return cell
}

durationTime - это просто целочисленный массив, который содержит все время в секундах.

Как я могу реализовать такую ​​анимацию с таймером CADisplayLink от контроллера, чтобы преодолеть проблему повторного использования ячеек.

0 ответов

Другие вопросы по тегам