为什么UITableViewCell会在改变高度时闪烁?

时间:2014-02-25 07:54:13

标签: ios uitableview ios7

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

现在的问题是细胞会膨胀和折叠,但每次处理都会在细胞上产生难看的闪烁/闪烁。我已经尝试了beginupdates / endupdates,并使用[self.tableView reloadRowsAtIndexPaths:[NSArray arrayWithObjects:indexPath, nil] withRowAnimation:UITableViewRowAnimationNone];

重新加载该行

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

6 个答案:

答案 0 :(得分:5)

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

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

答案 1 :(得分:4)

我有一个类似的问题,有几个罪魁祸首:

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

答案 2 :(得分:1)

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

     [UIView setAnimationsEnabled:NO];
     [self.tableView beginUpdates];

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

重新加载单元格

时,上面的代码段在单元格上没有动画

答案 3 :(得分:0)

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

答案 4 :(得分:0)

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

我的子视图在重新加载动画期间消失了...... 如果我使用

,它不会消磨
before_script:
  - docker version

test:
  stage: test
  script:
    - docker-compose -f docker-compose.yml build my_job
    - docker-compose -f docker-compose.yml down
    - docker-compose -f docker-compose.yml up --remove-orphans --force-recreate --abort-on-container-exit

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

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

而不是:

[self.tableView reloadRowsAtIndexPaths:]
我以这种方式进行了计算:

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

答案 5 :(得分:-1)

我希望闪光灯是因为你没有选择动画,即UITableViewRowAnimationNone。尝试淡入淡出动画。

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

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

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