gpt4 book ai didi

swift - UITableView 的 reloadData() 的替代方案?

转载 作者:行者123 更新时间:2023-11-28 08:25:04 26 4
gpt4 key购买 nike

我的 TableView 的可重用单元格中有一个 UISlider
一旦值发生变化,就会调用自定义方法 valueChanged(),这会触发 TableView 的 reloadData() 方法。reloadData() 调用 cellForRowAtIndexPath 并且一旦更改了 slider 的单元格被加载,它就会激活两个约束,这应该使它看起来就像一个按钮在滑动从单元格右侧输入。

基本上,我试图创建的效果是,一旦用户开始滑动 UISlider,动画就会发生,按钮就会出现。
不过这里有一个问题: UISliderisContinious 属性设置为 true 以确保动画立即发生,并且不会延迟到用户将手指放在 slider 。但是,将 isContinious 设置为 true 会使其成为 reloadData()(在我的自定义 valueChanged() 中) 在用户提交的每一张小幻灯片中都会被调用很多次。

在做了一些研究并尝试了很多调试策略之后,我现在知道一旦 reloadData() 被调用时,任何正在运行的动画(在 reloadData() 被调用时仍在动画中)都会被中断,并在动画完成后移动到它应该处于的状态。

所以回顾一下场景:

1) slider 移动,
2) valueChanged() 触发reloadData()
3) 动画开始更新布局,
4) reloadData() 立即再次被调用,破坏了在步骤 3 中启动的动画。

isContinious 设置为 true 时,一切都发生得如此之快,因此动画无法在 reloadData()< 之前完成它需要的时间 再次被调用。这会破坏动画并使其看起来好像按钮只是出现在没有动画的屏幕上,即使我知道 UIView.animate(withDuration:) 确实被调用并正常工作。我想知道是否有一种方法可以在不调用 reloadData() 的情况下刷新表格,所以基本上是这种方法的替代方法(我已经尝试过 reloadCellAtIndexPath 并且它具有确切的一样的效果)。如果不是,有没有办法绝对确保动画完成而不会被任何其他布局更新方法打断?

最佳答案

如果问题是刷新杀死了动画,您可以推迟 reloadRowsAtIndexPaths 调用,直到动画完成执行。通常我会说在你的动画 block 的完成处理程序中调用它,但看起来你的值改变可能会触发多个动画。相反,当您启动动画时,还会启动一个计时器,该计时器将运行一个 block 来执行重新加载。如果你开始一个新的动画,让旧的计时器失效并制作一个新的。重新加载只会在最终动画完成时执行。

    var timer = Timer()

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

关于swift - UITableView 的 reloadData() 的替代方案?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40277315/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com