重新排序后,uitableview中的单元格在滚动时位于customheaderviews的上方

重新排序后,uitableview中的单元格在滚动时位于customheaderviews的上方,uitableview,scroll,Uitableview,Scroll,我已经创建了一个UITableViewController。在其中,我创建了一个自定义视图,这些视图是从ViewForHeaderSection中为标题返回的。如果进入编辑模式并对单元格进行重新排序,则在滚动期间,重新排序的单元格会浮在自定义标题视图的上方。这将一直持续到使用[tableview reload]重新加载tableview。这就好像从重新排序中删除单元后,单元被移动到视图堆栈的顶部一样 我已经解决了moveRowAtIndexPath方法末尾的[tableView重载]问题,但我想

我已经创建了一个UITableViewController。在其中,我创建了一个自定义视图,这些视图是从ViewForHeaderSection中为标题返回的。如果进入编辑模式并对单元格进行重新排序,则在滚动期间,重新排序的单元格会浮在自定义标题视图的上方。这将一直持续到使用[tableview reload]重新加载tableview。这就好像从重新排序中删除单元后,单元被移动到视图堆栈的顶部一样


我已经解决了moveRowAtIndexPath方法末尾的[tableView重载]问题,但我想知道这是否是预期的行为。我在文档或谷歌搜索中找不到关于它的任何信息。

我认为这是UITableView中的一个bug。如果在moveRowAtIndexPath方法期间检查表的视图层次结构,则可以看到相关单元格靠近层次结构的顶部-这是为了在拖动单元格时支持其外观

在这种方法中,您也不能简单地将视图移动到层次的后面,因为视图上有一个动画,它似乎覆盖了该动画

我不习惯从数据更新方法中重新加载行,因此我的解决方案是包含以下代码:

UITableViewCell *movedCell = [tableView cellForRowAtIndexPath:fromIndexPath];
double delayInSeconds = 0.4;
dispatch_time_t popTime = dispatch_time(DISPATCH_TIME_NOW, (int64_t)(delayInSeconds * NSEC_PER_SEC));
dispatch_after(popTime, dispatch_get_main_queue(), ^(void){
    [tableView sendSubviewToBack:movedCell];
});
0.4秒的延迟是为了让动画在单元格上的位置上完成


雷达显示:

这是标题视图上的自动调整标志。在xib中删除它们。

是的,[tableview重新加载]当时对我来说不太合适。我确实喜欢你的方法。我发现设备上的延迟时间不够长-你可能希望在测试后进行调整。