替代UITableView的reloadData()?

时间:2016-10-27 06:09:35

标签: swift animation reloaddata

我的表格视图中有一个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(),这具有完全相同的效果)。如果没有,有没有办法确保动画完成而不被任何其他布局更新方法中断?

1 个答案:

答案 0 :(得分:0)

如果问题是刷新杀死动画,您可以推迟reloadRowsAtIndexPaths调用,直到动画完成执行。通常我会说你在动画块的完成处理程序中调用它,但似乎你的值更改可能会触发多个动画。相反,当您启动动画时,还会启动一个计时器,该计时器将运行一个块来执行重新加载。如果您启动新动画,请使旧计时器无效并创建一个新计时器。重新加载仅在最终动画完成时执行。

    var timer = Timer()

    func valueChanged() {
        timer.invalidate()
        timer = Timer.scheduledTimer(withTimeInterval: animationDuration, repeats: false) { _ in
            //Call reload here
        }
        //Animate here
    }