2

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

我正在经历“出血”/重叠,其中选择器将其中一个单元格隐藏在表格视图的下方。请参阅屏幕截图。

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

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

点击顶行 这是点击顶行以显示选择器后的样子

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

4

3 回答 3

2

我不知道为什么,但在我看来,选择器单元格覆盖了“选择产品”下方的单元格。如果确实如此,一种解决方法是显式设置单元格的 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;
}

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

于 2013-10-30T21:01:51.660 回答
2

After struggling with this problem, I realised that Apple's calendar application has the same issue

enter image description here

However, they minimise the side effects by inserting the row with a .fade animation.

tableView.insertRows(at: indexes, with: .fade)
于 2016-12-01T10:25:14.543 回答
1

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

就我而言,我有一个自定义单元格,其中包含在样式单元格之间或样式单元格与节页脚DatePicker之间插入/删除的内容,它按预期工作。Right DetailRight 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];

在此处输入图像描述

于 2014-11-07T00:25:59.410 回答