作家
登录

iOS中关于列表滚动流畅的一些探讨

作者: 来源: 2017-09-11 10:00:56 阅读 我要评论

如不雅说有什么好的博客文┞仿推荐,ibireme 的 iOS 保持界面流畅的技能 这篇堪称业界毒瘤,墙裂推荐反复浏览。这篇文┞仿中讲解了很多的优化点,我本身总结了下收益最大年夜的两个优化点:

  • 避免反复多次计算 cell 行高
  • 文本异步衬着

iOS 中关于列表滚动流畅的一些商量

大年夜家可以看看膳绫擎这张图的比较分析,数据是 iPhone6 的机子用 instruments 抓的,左边的是用 Auto Layout 绘制界面的数据分析,正常如不雅想腻滑滚动的话,fps 至少须要稳定在 55 阁下,我们可以发明,在没有缓存行高和异步衬着的情况下 fps 是最低的,可以说是比较卡顿了,至少是能肉眼感到出来,能知足腻滑滚动请求的也只有在缓存行高且异步衬着的情况下;右边的是没用 Auto Layout 直接用 frame 来绘制界面的数据分析,可以发明即使没有异步衬着,也能勉强知足腻滑滚动的请求,如不雅开启异步衬着的话,可以说是相当的丝滑了。

避免反复多次计算 cell 行高

TableView 行高计算可以说是个老生常谈的问题了, heightForRowAtIndexPath: 是个调用相当频繁的办法,在琅绫擎做过多的工作不免会造成卡顿。 在 iOS 8 中,我们可以经由过程设置下面两个属性来很轻松的实现高度自适应:

  1. self.tableView.estimatedRowHeight = 88; 
  2. self.tableView.rowHeight = UITableViewAutomaticDimension; 

固然很便利,不过如不雅你的页面对机能有必定请求,建议不要这么做,具体可以看看 sunnyxx 的 优化UITableViewCell高度计算的那些事 。文中针对 Auto Layout,供给了个 cell 行高的缓存库 UITableView-FDTemplateLayoutCell ,可以很好的赞助我们避免 cell 行高多次计算的问题。

如不雅不应用 Auto Layout,我们可以在请求完拿到数据后提前计算好页面个个控件的 frame 和 cell 高度,并且缓存在内存中,用的时刻直接在 heightForRowAtIndexPath: 掏出计算好的值就行,大年夜概流程如下:

模仿请求数据回调:

  1. - (void)viewDidLoad { 
  2.     [super viewDidLoad]; 
  3.      
  4.     [self buildTestDataThen:^(NSMutableArray <FDFeedEntity *> *entities) { 
  5.         self.data = @[].mutableCopy; 
  6.         @autoreleasepool { 
  7.             for (FDFeedEntity *entity in entities) { 
  8.                 FrameModel *frameModel = [FrameModel new]; 
  9.                 frameModel.entity = entity; 
  10.                 [self.data addObject:frameModel]; 
  11.             } 
  12.         } 
  13.         [self.tvFeed reloadData]; 
  14.     }]; 

一个简单计算 frame 、cell 行高方法:

  1. //FrameModel.h 
  2.  
  3. @interface FrameModel : NSObject 
  4.  
  5. @property (assign, nonatomic, readonly) CGRect titleFrame; 
  6. @property (assign, nonatomic, readonly) CGFloat cellHeight; 
  7. @property (strong, nonatomic) FDFeedEntity *entity; 
  8.  
  9. @end 
  10.  
  11. //FrameModel.m 
  12.  
  13. @implementation FrameModel 
  14.  
  15. - (void)setEntity:(FDFeedEntity *)entity { 
  16.     if (!entity) 
     1/4    1 2 3 4 下一页 尾页

      推荐阅读

      Java 9的JDK中值得期待的:不仅是模块化

    【译者注】在本文中,作者介绍了即将在9.21宣布的Java 9新特点,除了最重要的模块化以外,还涉及到编译,对象,协定,缓存等新特点,也说起了在此次版本中移除的功能,供Java爱好者浏览和>>>详细阅读


    本文标题:iOS中关于列表滚动流畅的一些探讨

    地址:http://www.17bianji.com/lsqh/37290.html

关键词: 探索发现

乐购科技部分新闻及文章转载自互联网,供读者交流和学习,若有涉及作者版权等问题请及时与我们联系,以便更正、删除或按规定办理。感谢所有提供资讯的网站,欢迎各类媒体与乐购科技进行文章共享合作。

网友点评
自媒体专栏

评论

热度

精彩导读
栏目ID=71的表不存在(操作类型=0)