如何移动或删除IndexPathsForVisibleRows [0]时为UITableView行设置动画

时间:2018-02-20 20:57:18

标签: ios uitableview

我正在试验UITableView,但动画并没有像我期望的那样发生。

给定一个单元格列表,我想删除最顶部的单元格(IndexPathsForVisibleRows[0]处的项目),并将其下面的所有行设置为向上动画到新位置。 但是,似乎任何时候IndexPathsForVisibleRows[0](或任何不可见的单元格超过第一个可见的单元格)都被触摸(移动,删除等),UITableView拒绝设置事务结果的动画。

我已经包含了2个GIF来证明这个问题。

第一个GIF演示了所需的行为。我正在IndexPathsForVisibleRows[1](第二个屏幕上的单元格)移除单元格。 注意下面的所有单元格如何正确定位到位置。

Correct animation behavior

第二个GIF演示了删除最顶层单元格(IndexPathsForVisibleRows[0])时会发生什么。请注意下面的所有单元格如何在没有动画的情况下立即移动到新位置。

enter image description here

(注意:整个表更改包含在BeginUpdates / EndUpdates块中)。

我是否遗漏了导致2个场景表现不同的内容,或者我只是偶然发现了UITableView错误/限制?

1 个答案:

答案 0 :(得分:0)

经过大量调查,包括几个新的代码项目,将UITableView提炼到可能导致这种行为的各种不同因素,我找到了简单的答案。

不要使用UITableView

我和许多其他人一样,在很多应用程序中都非常依赖UITableView,因为它的简单性和性能,但是,如果你真的希望它以流畅,明智的方式运行,它就无法实现。 它的行为中存在一些固有的错误,似乎并没有被苹果公司解决 - 而且毫无疑问,当SDK中已经存在更好的替代方案时。

输入UICollectionView。

我采用了我的所有后端逻辑,并将其改为提供UICollectionView(所有工作大约需要半小时),并且看,所有内容都按照原定的方式工作

所以,我的所有代码都是正确的,UITableView只是挡路了。

现在的样子。请注意,所有删除方案都可以正确设置动画,没有笨拙。

UICollectionView correct row animation

我不是第一个发现缺少UITableView的人: https://pspdfkit.com/blog/2017/the-case-for-deprecating-uitableview/

UICollectionView的其他好处:

  • 可自定义的布局
  • 易于定制的单元格动画
  • 更新事务不会暂停当前正在运行的滚动动画(这个很棒,如果你有一个后台线程刷新数据,当行重新排列时你不会突然'突然')