deleteRowsAtIndexPaths重叠问题

时间:2013-10-30 19:17:03

标签: ios objective-c uitableview ios7

尝试使用ios7-esque时,我在点击表格中的单元格时将UIPickerView插入UITableView。这很好,动画效果很好。但是,当我通过调用deleteRowsAtIndexPaths来撤消单元格时会出现问题。

我遇到了“出血”/重叠,其中选择器在表格视图中向下隐藏其中一个单元格。请参阅屏幕截图。

我没有做任何超级自定义,所以我想知道这是否是iOS7错误。所有细胞都有纯色背景(白色)。

非常感谢任何帮助。谢谢!

点击第一行 This is what it looks like after tapping the top row to reveal the picker

这是缩回时的动画中期。注意重叠和拾取器在底部的单元格上渗出 Strange overlap

3 个答案:

答案 0 :(得分: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;
}

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

答案 1 :(得分:2)

在努力解决这个问题之后,我意识到Apple的日历应用程序存在同样的问题

enter image description here

但是,他们通过插入带有 <include android:id="@+id/app_bar" layout="@layout/custome_app_bar" /> 动画的行来最小化副作用。

.fade

答案 2 :(得分:0)

我有类似的问题(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样式单元格,但是使用相同的代码并没有按预期工作。在上面的细胞顶部/通过上面的细胞可以看到出现/消失的细胞,并且细胞移动了两倍。在下图中,人物出现在隐私,动画中期。

enter image description here

然而,我注意到当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];

enter image description here