使用 UITableView 的老虎机动画
Slot machine animation using UITableView
我需要根据提供的设计和时间来实现老虎机动画。
它应该执行无限滚动,直到触发某些事件。在那个动画之后,它应该减速并停在定义的位置
对于这个任务,我使用了下一个解决方案:
UITableView
与 fixed-height
单元格。它是同一个单元格,唯一的区别是图标或文本(取决于 indexPath.row
)
Scroll
只是自下而上,这就是为什么我在 resetScrollPosition
方法 中使用最后一个单元格作为起点
- 如果到达第一个元素,滚动位置将重置为起点
- 动画执行
contentOffset
随线性选项变化。在完成块中,如果仍然需要动画,则再次调用它。如果不需要 - 使用 easeOut
选项开始减慢动画速度
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
}
问题:
- 调用
resetScrollPosition
后,在动画完成块中,tableviews contentOffset.y
值已更新,但 tableView
保持在同一位置。我尝试将直接 contentOffset
更改为 setContentOffset
、scrollToRow
、scrollToRect
,将其包装在主队列中 - 没有更改
- 放慢动画应该滚动 8 个项目。它已执行,但前 6 个项目在动画期间不可见,只有最后两个。
检查问题gif(跳转2 -> 11 可以):
已将 UITableView
替换为 UIScrollView
已将代码上传到要点 - https://gist.github.com/OlesenkoViktor/76845c5448b421ead0a2303af2b1161d
感谢@Paulw11
我需要根据提供的设计和时间来实现老虎机动画。
它应该执行无限滚动,直到触发某些事件。在那个动画之后,它应该减速并停在定义的位置
对于这个任务,我使用了下一个解决方案:
UITableView
与fixed-height
单元格。它是同一个单元格,唯一的区别是图标或文本(取决于indexPath.row
)Scroll
只是自下而上,这就是为什么我在resetScrollPosition
方法 中使用最后一个单元格作为起点
- 如果到达第一个元素,滚动位置将重置为起点
- 动画执行
contentOffset
随线性选项变化。在完成块中,如果仍然需要动画,则再次调用它。如果不需要 - 使用easeOut
选项开始减慢动画速度
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
}
问题:
- 调用
resetScrollPosition
后,在动画完成块中,tableviewscontentOffset.y
值已更新,但tableView
保持在同一位置。我尝试将直接contentOffset
更改为setContentOffset
、scrollToRow
、scrollToRect
,将其包装在主队列中 - 没有更改 - 放慢动画应该滚动 8 个项目。它已执行,但前 6 个项目在动画期间不可见,只有最后两个。
检查问题gif(跳转2 -> 11 可以):
已将 UITableView
替换为 UIScrollView
已将代码上传到要点 - https://gist.github.com/OlesenkoViktor/76845c5448b421ead0a2303af2b1161d
感谢@Paulw11