我的表格视图中有一个UISlider
可重复使用的单元格。
一旦值发生变化,就会调用自定义方法valueChanged()
,从而触发表格视图的reloadData()
方法。
reloadData()
调用cellForRowAtIndexPath
并且一旦加载滑块的单元格被加载,它就会激活两个约束,使得它看起来好像按钮从单元格的右侧滑入。
基本上,我试图创建的效果是,一旦用户开始滑动UISlider
动画就会发生并且按钮出现。
这里有一个问题:UISlider
' s isContinious
属性设置为true
以确保动画立即发生,并且在用户抓住滑块的手指之前不会延迟。但是,将isContinious
设置为true
会使reloadData()
(在我的自定义valueChanged()
中)被用户提交的每个小幻灯片调用很多时间。< br />
在做了一些研究,并尝试了很多调试策略后,我现在知道,只要reloadData()
被调用,任何正在运行的动画(当时仍然是动画的{{1}被调用)被中断并且只是在动画完成后移动到它应该处于的状态。
所以回顾一下情景:
1)滑块移动,2)reloadData()
触发valueChanged()
,
3)动画开始更新布局,4)reloadData()
立即再次调用会破坏在步骤3中开始的动画。
当reloadData()
设置为isContinious
时,一切都发生得如此之快,因此在再次调用true
之前,动画无法获得完成所需的时间。这会破坏动画并使其看起来好像按钮刚出现在屏幕上而没有动画,即使我知道reloadData()
会被调用并正常工作。我想知道是否有办法在不调用UIView.animate(withDuration:)
的情况下刷新表格,所以基本上是这种方法的替代方法(我已经尝试了reloadData()
,这具有完全相同的效果)。如果没有,有没有办法确保动画完成而不被任何其他布局更新方法中断?
答案 0 :(得分:0)
如果问题是刷新杀死动画,您可以推迟reloadRowsAtIndexPaths调用,直到动画完成执行。通常我会说你在动画块的完成处理程序中调用它,但似乎你的值更改可能会触发多个动画。相反,当您启动动画时,还会启动一个计时器,该计时器将运行一个块来执行重新加载。如果您启动新动画,请使旧计时器无效并创建一个新计时器。重新加载仅在最终动画完成时执行。
var timer = Timer()
func valueChanged() {
timer.invalidate()
timer = Timer.scheduledTimer(withTimeInterval: animationDuration, repeats: false) { _ in
//Call reload here
}
//Animate here
}