【发布时间】:2016-10-27 06:09:34
【问题描述】:
我的表格视图的可重用单元格中有一个UISlider。
只要值发生变化,就会调用自定义方法valueChanged(),它会触发表格视图的reloadData() 方法。
reloadData() 调用 cellForRowAtIndexPath 并且一旦加载了更改滑块的单元格,它就会为两个约束设置动画,这应该使它看起来好像一个按钮从单元格的右侧滑入。
基本上,我想要创建的效果是,一旦用户开始滑动UISlider,动画就会发生并出现按钮。
不过,这里有一个问题:UISlider 的isContinious 属性设置为true 以确保动画立即发生,并且在用户将手指移到滑块之前不会延迟。但是,将isContinious 设置为true 使得reloadData()(在我的自定义valueChanged() 中)在用户提交的每一张小幻灯片中都会被调用很多次。
研究,并尝试了很多调试策略,我现在知道,一旦调用 reloadData(),任何正在运行的动画(在调用 reloadData() 时仍在动画中)都会被打断并进入它的状态应该在动画完成后进入。
所以回顾一下这个场景:
1) 滑块移动,
2) valueChanged() 触发 reloadData(),
3) 动画开始更新布局,
4) reloadData() 立即被再次调用,破坏了开始的动画第三步。
当isContinious 设置为true 时,一切都发生得如此之快,因此动画在reloadData() 再次被调用之前没有得到完成所需的时间。这会破坏动画并使它看起来好像按钮只是出现在屏幕上而没有动画,即使我知道UIView.animate(withDuration:) 确实被调用并正常工作。我想知道是否有一种方法可以在不调用reloadData() 的情况下刷新表格,所以基本上可以替代这种方法(我已经尝试过reloadCellAtIndexPath,效果完全相同)。如果没有,有没有办法绝对确保动画完成而不会被任何其他布局更新方法中断?
【问题讨论】:
标签: swift animation reloaddata