使用 UITableView 的老虎机动画

Slot machine animation using UITableView

我需要根据提供的设计和时间来实现老虎机动画。

它应该执行无限滚动,直到触发某些事件。在那个动画之后,它应该减速并停在定义的位置

对于这个任务,我使用了下一个解决方案:

var isRolling: Bool = false

func startScroll() {
    isRolling = true

    UIView.animate(
        withDuration: 0.05,
        delay: 0,
        options: .curveLinear,
        animations: {
            self.tableView.contentOffset.y -= self.rowHeight
    },
        completion: { _ in
            if self.isRolling {
                self.startScroll()
            } else {
                self.resetScrollPosition

                UIView.animate(
                    withDuration: 0.7,
                    delay: 0,
                    options: .curveEaseOut,
                    animations: {
                         self.tableView.contentOffset.y -= 8 * self.rowHeight
                },
                    completion: nil
                )
            }
    })
}

private func resetScrollPosition() {
    tableView.reloadData()

    tableView.contentOffset.y = startOffset
    tableView.reloadData()
}

func stopScroll() {
    isRolling = false
}

问题:

  1. 调用 resetScrollPosition 后,在动画完成块中,tableviews contentOffset.y 值已更新,但 tableView 保持在同一位置。我尝试将直接 contentOffset 更改为 setContentOffsetscrollToRowscrollToRect,将其包装在主队列中 - 没有更改
  2. 放慢动画应该滚动 8 个项目。它已执行,但前 6 个项目在动画期间不可见,只有最后两个。 检查问题gif(跳转2 -> 11 可以):

已将 UITableView 替换为 UIScrollView

已将代码上传到要点 - https://gist.github.com/OlesenkoViktor/76845c5448b421ead0a2303af2b1161d

感谢@Paulw11