【问题标题】:Why does UITableViewCell flash on changing height?为什么 UITableViewCell 在改变高度时会闪烁?
【发布时间】:2014-03-27 07:15:30
【问题描述】:

我有一个带有 UITableViewCells 的简单 UITableView。对于表格视图中的第 0 行,我为单元格设置了背景颜色。现在点击第 0 行,我只想扩展该行。为了实现这一点,我使用here 描述的相同技术来更改第 0 行高度。

现在的问题是单元格扩展和折叠,但每个进程都会在单元格上出现难看的闪光/闪烁。我已经尝试了 beginupdates/endupdates 并使用 [self.tableView reloadRowsAtIndexPaths:[NSArray arrayWithObjects:indexPath, nil] withRowAnimation:UITableViewRowAnimationNone]; 重新加载了那一行。

是什么导致点击时闪烁/闪烁?我该如何摆脱它?是的,我忘了提,我已将单元格的选择样式设置为无。所以这不是造成这种情况的原因。

【问题讨论】:

  • 如果您将 UITableViewRowAnimation 更改为例如UITableViewRowAnimationMiddle?
  • 不闪烁但呈现另一种动画,就好像我在尝试插入新行一样。
  • 您能否展示来自didSelectRowAtIndex...cellForRowAtIndex... 的代码或与创建单元格相关的任何其他内容。
  • 你能解决这个问题吗?我也面临同样的问题。
  • 我也有这个问题

标签: ios uitableview ios7


【解决方案1】:

我不确定这是否与我今天早上遇到的问题相同,但我的解决方案可能会对某人有所帮助...

在重新加载动画时,我的子视图消失了... 我用过也没关系

[self.tableView beginUpdates];
[self.tableView endUpdates];

[self.tableView reloadRowsAtIndexPaths:]

最后我发现我修改了单元格子视图的框架以计算正确的大小......我更改了它并开始使用其他视图进行计算,它解决了我的问题。

代替:

self.leftLabel.frame = CGRectMake(0, 0, innerWidth, CGFLOAT_MAX);
[self.leftLabel sizeToFit];

我是这样计算的:

UILabel * tmpLabel = [[UILabel alloc] initWithFrame:CGRectMake(0, 0, innerWidth, CGFLOAT_MAX)];
tmpLabel.numberOfLines = self.leftLabel.numberOfLines;
tmpLabel.attributedText = self.leftLabel.attributedText;
[tmpLabel sizeToFit];

self.leftLabel.frame = tmpLabel.frame;

【讨论】:

    【解决方案2】:

    如果您不想要动画并阻止单元格闪烁,您可以使用以下解决方案 -

         [UIView setAnimationsEnabled:NO];
         [self.tableView beginUpdates];
    
         [self.tableView reloadRowsAtIndexPaths:[NSArray arrayWithObjects:indexPath, nil]
                                                   withRowAnimation:UITableViewRowAnimationNone];
         [self.tableView endUpdates];
         [UIView setAnimationsEnabled:YES];
    

    上面的sn-p在重新加载单元格时不会在单元格上产生动画

    【讨论】:

      【解决方案3】:

      在使用单元格的非透明背景颜色时,我遇到了同样的问题。解决方案是使用backgroundView 属性,而不是backgroundColor

      UIView *backgroundView = [[UIView alloc] initWithFrame:cell.frame];
      backgroundView.backgroundColor = [[UIColor whiteColor] colorWithAlphaComponent:0.1f];
      cell.backgroundView = backgroundView;
      cell.backgroundColor = [UIColor clearColor];
      

      【讨论】:

        【解决方案4】:

        我也遇到过类似的问题,有几个罪魁祸首:

        • 确保所有的 tableview 调用都在主线程上。
        • 检查您的单元高度逻辑,如果存在不一致可能会导致类似问题。请记住,在要求表格重新加载行之前,需要将单元格高度更新为最终高度。
        • 使用纯色单元格背景颜色。如果单元格背景颜色不完全不透明,iOS 7 似乎会出现问题。 (我在使用非透明背景颜色时找不到解决方案。我怀疑这可能是 iOS 7 的错误。)

        【讨论】:

        • 这是什么意思?请记住,在要求表格重新加载行之前,需要将单元格高度更新为最终高度。
        • 我想我的意思是在调用 [tableview beginUpdates] 之前,您需要确保您的委托已设置为返回新的高度。
        • 从 iOS 10 开始,在添加或删除行时,为单元格使用非透明背景颜色仍会导致闪烁问题。
        【解决方案5】:

        我希望使用 Flash,因为您没有选择动画,即 UITableViewRowAnimationNone。试试淡入淡出动画。

        [self.tableView reloadRowsAtIndexPaths:[NSArray arrayWithObjects:indexPath, nil] withRowAnimation:UITableViewRowAnimationFade]];
        

        如果仍然不好看,请尝试为所有可见行设置动画:

        [self.tableView reloadRowsAtIndexPaths:[self.tableView indexPathsForVisibleRows] withRowAnimation:UITableViewRowAnimationFade]];
        

        【讨论】:

        • 它仍然闪烁。无论动画选择如何,或者仅针对该行或可见行进行。
        【解决方案6】:

        我认为您不应该在调用 reloadData 之前使用 beginUpdate/endUpdates 方法并手动执行动画。单元格的最终状态(动画后)由数据源定义。 我希望这会对你有所帮助。

        【讨论】:

        • 我没有使用 beginUpdate/endUpdate(尽管这也引起了我在问题中提到的问题)。我正在使用 reloadrowsat... 来重新加载特定的行。
        • 那么我建议你应用简单的动画可能会这样解决你的问题: [UIView animateWithDuration:1.0 animations:^{ [self.tableView setContentOffset:CGPointMake(0, newDistance) animated:NO ]; [self.tableView setRowHeight:newHeight]; }];
        • 或者我建议您可以在 UITableViewCell 中添加背景视图,并使用 backgroundColor。然后在您的 tableView: didSelectRowAtIndexPath: 中,您可以使用 UIView 中的动画 API 为隐藏或 alpha 设置动画。动画结束后,您可以将 hidden 设置为 TRUE 或将 alpha 设置为 0 以获得闪光效果
        猜你喜欢
        • 1970-01-01
        • 2013-05-26
        • 1970-01-01
        • 1970-01-01
        • 2019-09-07
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2022-12-10
        相关资源
        最近更新 更多