【发布时间】:2016-09-08 18:18:55
【问题描述】:
最新编辑:
经过更多实验后,我确信我遇到了触摸处理问题。
我创建了一个自定义单元格,其子视图填充了内容视图宽度的一半。我正在为该子视图而不是内容视图设置动画。
在触摸单元格右侧的同时滚动表格视图可以正常工作。
滚动单元格左侧(动画视图所在的位置)的表格视图会导致延迟。
编辑: 最后,我正在尝试制作类似to this one 的动画。 该问题中接受的答案与我要问的问题相同。 下面的代码是重现问题的最简单的代码。
在dequeCellForIndexPath 而不是willDisplayCell 中制作动画没有区别。
在willDisplayCell 中制作动画时,表格视图滚动动画会变慢。当您尝试在 tableview 中快速滚动时,滚动会失去加速度。
重现该问题的一些示例代码:
class ViewController: UIViewController, UITableViewDataSource, UITableViewDelegate {
@IBOutlet var tableView: UITableView!
func tableView(tableView: UITableView, willDisplayCell cell: UITableViewCell, forRowAtIndexPath indexPath: NSIndexPath) {
cell.contentView.layer.opacity = 0.0
UIView.animateWithDuration(0.3) {
cell.contentView.layer.opacity = 1.0
}
}
func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
let cell = UITableViewCell()
cell.textLabel?.text = "\(indexPath.row)"
return cell
}
func tableView(tableView: UITableView, heightForRowAtIndexPath indexPath: NSIndexPath) -> CGFloat {
return 300
}
func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return 5000
}
}
当单元格的高度很大时,问题会变得最严重。
有没有办法避免这种情况,或者有更好的功能来做单元格动画?
相关:Blogpost on doing animations like this
编辑 2: 说明问题的 GIF:
在所有 3 种情况下,我都尽可能快地在手机上滚动。
通过 willDisplayCell 中的动画,我到达第 60 行
没有动画,我到达第 400 行以上
willDisplayCell 中随机延迟 0 - 0.3 秒,阻塞主队列,我到达第 120 行
我猜想某处的触摸处理存在问题。
即使the library I use to visualize how fast I'm scrolling,在willDisplayCell 中使用动画时也会中断。
【问题讨论】:
-
"医生医生,我这样做会很痛!" “所以不要那样做!”说真的——在滚动时为已经发生的事情添加动画是一个可怕的想法。
-
@matt 很多应用程序都有用于单元格外观的自定义动画。 UITableView 动画单元格插入/删除。你能解释一下为什么动画出现在屏幕上的单元格是一个可怕的想法吗?
-
因为它压倒了渲染树和滚动卡顿——正如你自己所说的那样。
-
渲染不是这里的瓶颈。如果我在 willDisplayCell 方法中调用
NSThread.sleepForTimeInterval(0.1),表格会严重滞后,但不会在滚动过程中失去加速度。 -
你不知道瓶颈是什么,除非你使用 Instruments 找出来。而且我没有看到任何证据表明你这样做了。
标签: ios swift uitableview uikit core-animation