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

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

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

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

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

点击第一行

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

【问题讨论】:

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

标签: ios objective-c uitableview ios7


【解决方案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];
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-10-13
      • 2012-02-16
      • 2014-01-15
      • 2011-01-13
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多