我正在向我的tableViewCell
添加简单的堆栈动画,其中cells
等动画正在添加到堆栈中。当我点击UIButton
时,我将tableView
分开,我首先看到一个具有我的值的静态单元格,然后在一个小间隙后我的动画工作。我不知道为什么我的tableView
在动画之前会显示cell
?这是我的VC代码:
override func viewDidAppear(_ animated: Bool) {
animateTable()
}
func animateTable() {
let cells = tableView.visibleCells
let tableHeight: CGFloat = tableView.bounds.size.height
for i in cells {
let cell: UITableViewCell = i as UITableViewCell
cell.transform = CGAffineTransform(translationX: 0, y: tableHeight)
}
var index = 0
for a in cells {
let cell: UITableViewCell = a as UITableViewCell
UIView.animate(withDuration: 1, delay: 0.05 * Double(index), usingSpringWithDamping: 0.9, initialSpringVelocity: 0, options: .curveEaseInOut, animations: {
cell.transform = CGAffineTransform(translationX: 0, y: 0);
}, completion: nil)
index += 1
}
}
答案 0 :(得分:1)
当您显示view
时,通过调用UITableView
已填充reloadData
个数据。只有在animation
出现后才能执行view
。那么在那时,您将看到现有数据只有几分之一秒,然后animation
将启动。
如果您不希望在animation
运行之前显示数据,您可能希望在view
加载animation
之后不会通过执行以下操作来显示数据 - 这可能不是最好的解决方案,但它最容易实现:
1:添加一个新变量以指示您是否运行var wasAnimated = false
。
numberOfRowsInSection
2:如果return 0
尚未投放,请在animation
和override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
if !wasAnimated {
return 0
}
// Rest of the original code
}
中检查此变量。
animateTable
3:在执行reloadData
代码的其余部分之前,将标记设置在animation
的开头,然后设置为func animateTable() {
wasAnimated = true
tableView.reloadData()
// The rest of the original code
}
。
{{1}}
这应该让你得到你想要的行为:)