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 重叠问题的主要内容,如果未能解决你的问题,请参考以下文章
iOS Swift:deleteRowsAtIndexPaths 崩溃 [重复]
在 iPhone 的 Objective-C 中在 (commitEditingStyle) 之外调用 (deleteRowsAtIndexPaths)
deleteRowsATIndexPaths 崩溃 [重复]