deleteRowsAtIndexPaths 重叠问题

Posted

技术标签:

【中文标题】deleteRowsAtIndexPaths 重叠问题【英文标题】:deleteRowsAtIndexPaths Overlap Issue 【发布时间】:2013-10-30 19:17:02 【问题描述】:

试图成为 ios7 风格,我在点击表格中的单元格时将 UIPickerView 插入到 UITableView 中。这工作正常并且动画效果很好。但是,当我通过调用 deleteRowsAtIndexPaths 收回单元格时会出现问题。

我遇到了“出血”/重叠,其中选择器将其中一个单元格隐藏在表格视图的下方。查看屏幕截图。

我没有做任何超级定制的事情,所以我想知道这是否是 iOS7 的错误。所有单元格都有纯色背景(白色)。

任何帮助将不胜感激。谢谢!

点击第一行

这是收回时的中间动画。注意底部单元格的重叠和选择器溢出

【问题讨论】:

动画结束后,所有的表格单元格都应该是这样吗?只是动画本身的问题吗? 另外,您将哪种动画类型传递给 deleteRowsAtIndexPaths:withRowAnimation:,例如,自动、底部、顶部等? 动画完成后,一切都很好,UI 看起来应该是正常的。我尝试了所有动画类型,它们都产生相同的结果。 我还注意到调用 deleteRowsAtIndexPaths:withRowAnimation: 时出现的不规则动画。我在这里发布了一个关于这个问题的问题:***.com/q/19474665/1239263 这个问题引起的关注太少,以至于我因此获得了 Tumbleweed 徽章。我仍然没有解决方案。 我很想看看这个视图是什么样子的 【参考方案1】:

我不知道为什么,但在我看来,选择器单元格覆盖了“选择产品”下方的单元格。如果确实如此,一种解决方法是显式设置单元格的 z 顺序,将选取器单元格放在所有其他单元格的下方:

#import <QuartzCore/QuartzCore.h>

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath

    UITableViewCell *cell = ...;// your logic for getting a cell
    BOOL isPickerCell = ...;// your logic for identifying if this is the picker cell
    cell.layer.zPosition = isPickerCell ? 0 : 1;

如果选择器靠近表格底部,它仍然可以显示在最后一个单元格下方,因为那里没有任何东西可以覆盖它。例如,如果“选择产品”是最后一个单元格。您可以通过在底部插入空白单元格来解决此问题。这是具有不同高度的单元格的普遍问题。

【讨论】:

同样的问题,我正在使用带有自定义标题视图的默认高度单元格。DeleteRow/Section 动画真的很糟糕【参考方案2】:

在解决这个问题后,我意识到苹果的日历应用程序也有同样的问题

但是,它们通过插入带有.fade 动画的行来最小化副作用。

tableView.insertRows(at: indexes, with: .fade)

【讨论】:

【参考方案3】:

我有类似的问题(iOS 8、iPhone 6 模拟器)

在我的例子中,我有一个包含 DatePicker 的自定义单元格在 Right Detail 样式单元格之间或 Right Detail 样式单元格和节页脚之间插入/删除,这按预期工作强>。

[self.table beginUpdates];

if (isVisible) 
    [self.table insertRowsAtIndexPaths:@[index]
                      withRowAnimation:UITableViewRowAnimationMiddle];
 else 
    [self.table deleteRowsAtIndexPaths:@[index]
                      withRowAnimation:UITableViewRowAnimationMiddle];


[self.table endUpdates];

但我也有Right Detail 样式单元格在Right Detail 样式单元格和部分末尾之间插入/删除,使用相同的代码没有按预期工作。出现/消失的单元格在上面的单元格顶部/通过上面的单元格可见,并且单元格移动了应有的两倍。在下图中,人物出现在动画中间的隐私下方。

但是,我注意到当 beginUpdates/endUpdates 被注释掉时,单元格只移动了大约一半的单元格高度而不是两倍的单元格高度,这意味着它看起来有了很大的改进。

我还尝试设置 zPosition,这似乎会在单元格重叠时降低可见性。

// [self.table beginUpdates];

if (isVisible) 
    [self.table insertRowsAtIndexPaths:@[index]
                      withRowAnimation:UITableViewRowAnimationMiddle];
 else 
    cell = [self.table cellForRowAtIndexPath:peopleIndex];
    cell.layer.zPosition = -1;
    [self.table deleteRowsAtIndexPaths:@[peopleIndex]
                      withRowAnimation:UITableViewRowAnimationMiddle];


// [self.table endUpdates];

【讨论】:

以上是关于deleteRowsAtIndexPaths 重叠问题的主要内容,如果未能解决你的问题,请参考以下文章

一次调用多个 deleteRowsAtIndexPaths

iOS Swift:deleteRowsAtIndexPaths 崩溃 [重复]

在 iPhone 的 Objective-C 中在 (commitEditingStyle) 之外调用 (deleteRowsAtIndexPaths)

deleteRowsATIndexPaths 崩溃 [重复]

动态更改数据源导致 deleteRowsAtIndexPaths:indexes 崩溃

无法将 tableView.deleteRowsAtIndexPaths 与 coreData 一起使用