iOS:tableView刷新闪烁问题解决

作者: IOSMan | 来源:发表于2016-11-30 10:58 被阅读8178次

我做的是直播消息系统,每当有人评论、送礼物、第一次点赞直播消息列表都要及时显示。就像这样


消息系统效果

原来思路是这样的:图中红框是我们的消息列表,是一个tableView,每个消息是一个cell,每次接收到一条消息立刻添加到数据数组中,同时刷新tableView,滚动到底部。
原来的代码是这样写的:

   [chatDataArray addObject:chatModel];
   [chatTable reloadData];

   NSIndexPath *myIndexPath = [NSIndexPath indexPathForRow: chatDataArray.count - 1 inSection:0];
    [chatTable selectRowAtIndexPath:myIndexPath animated:YES scrollPosition:UITableViewScrollPositionBottom];

但是这样写有一个很大的问题就是:每次接受到消息时添加到数据数组中,同时刷新tableView的时候,整个tableView会闪烁一下,这个问题困扰我好久不知道怎么解决,期间用过很多办法(先隐藏再刷新,异步刷新),踩了很多坑,都解决不了问题,分析闪烁的根源是因为刷新的是整个tableView,想想如果只刷新最后一行就好了,但是局部刷新的方法的前提是这行cell原来是存在的,但是这个直播消息是每次有新消息后有刷新列表,一个新的消息产生后伴随着一个新的一行cell(其实是没产生新的cell,有复用机制,这里打个比方,不要误解)。今天不知道怎么开光了,突然想到tableView还有一个insert的方法,一直不怎么用竟然把她忘了。
解决后的代码如下:

[chatDataArray addObject:chatModel];

 NSIndexPath *myIndexPath = [NSIndexPath indexPathForRow: chatDataArray.count - 1 inSection:0];
 [chatTable insertRowAtIndexPath:myIndexPath withRowAnimation:UITableViewRowAnimationNone];
 [chatTable selectRowAtIndexPath:myIndexPath animated:YES scrollPosition:UITableViewScrollPositionBottom];

新的接受的消息cell直接插入到最后一行,然后再自动滚动到底部。不闪了,哈哈,so easy!完美解决!请记住整个伟大的方法
- (void)insertRowsAtIndexPaths:(NSArray<NSIndexPath *> *)indexPaths withRowAnimation:(UITableViewRowAnimation)animation;
希望这篇文章可以帮到你O(∩_∩)O

相关文章

网友评论

  • 生产八哥:estimatedRowHeight = 0 了解一哈
    f2yu:当tableView只要在当前可是区域类存在自动计算高度的cell时, insertRows / deleteRows可能发生闪动,另外如果 deleteRows 导致删除的最后一项存在于可视区时,可能会导致删除后的最后一项偏下,需要使用scrollToRow方法调整位置,和手机型号系统版本有关,不是所有机型都会
    d2d00a0a3626:我在调用 insertRows:withAnimation:时,就算是用UITableViewRowAnimationNone,cell照样有一个动画,从上向下。设置estimatedRowHeight = 0 那个动画就没了,没搞懂原因。是insert的bug还是什么?
  • 奔驰S350L:当有大量数据同时进来,界面卡死
  • 迷路的字母C:我遇到的问题和作者刚好相反啊。我开始用的insert那个方法,然后滚到到底部,界面发生了闪烁,只发生在低版本的设备。后来改用了reload方法,竟然神奇般的不闪了,想不通为啥。囧:joy:
    迷路的字母C:@IOSMan 我的闪烁情况是,能看见的每一个cell都会闪,不滚动就不会闪,不知道和你的一不一样。刚刚把这个问题弄好,其实我也是惊呆了:scream: 现在还在惊呆脸ing.....
    IOSMan:@迷路的字母C :scream:
  • 飞机飞机:理论上是不会闪的 我的im都是整个刷新的 也不会闪 lz好好分析下闪烁的原因 是不是cell渲染的太慢 table reload 有大量计算 或者view frame没有计算对
    飞机飞机:@IOSMan 搜噶
    IOSMan:@飞机飞机 如果只刷新不会闪烁,但是每次刷新后需要滚动到最后一行就会闪烁
  • xxttw:整个刷新时时闪烁一下
  • 你知道我知不知道:帮到我了
    IOSMan:@你知道我知不知道 :grin:
  • Eddie_吉:请问你的刷新闪烁什么样子? 目前我在开发即时通讯,正在写聊天界面,每当我发送消息的时候,如果是发送者就是从左向右闪,接收的消息就是从右向左闪,像是动画一样,但不知道什么原因
    羽辰梦: 大神 解决没 我也遇到了同样的问题 蛋疼啊 求大神指导!
    Eddie_吉:@IOSMan 好吧
    IOSMan:@Eddie_吉 我的闪烁是整体闪烁
  • Sunrain16:您好,您有礼物特效的demo吗?找了好久没有找到,今天看到您的帖子,希望您可以给我发一个demo,可以吗?
    029219492fe0:@IOSMan 23333我记得看到过。因为再搜索这个东西。。
    029219492fe0:我记得cocoa上面有

本文标题:iOS:tableView刷新闪烁问题解决

本文链接:https://www.haomeiwen.com/subject/srazpttx.html