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

大年夜家可以看看膳绫擎这张图的比较分析,数据是 iPhone6 的机子用 instruments 抓的,左边的是用 Auto Layout 绘制界面的数据分析,正常如不雅想腻滑滚动的话,fps 至少须要稳定在 55 阁下,我们可以发明,在没有缓存行高和异步衬着的情况下 fps 是最低的,可以说是比较卡顿了,至少是能肉眼感到出来,能知足腻滑滚动请求的也只有在缓存行高且异步衬着的情况下;右边的是没用 Auto Layout 直接用 frame 来绘制界面的数据分析,可以发明即使没有异步衬着,也能勉强知足腻滑滚动的请求,如不雅开启异步衬着的话,可以说是相当的丝滑了。
避免反复多次计算 cell 行高
TableView 行高计算可以说是个老生常谈的问题了, heightForRowAtIndexPath: 是个调用相当频繁的办法,在琅绫擎做过多的工作不免会造成卡顿。 在 iOS 8 中,我们可以经由过程设置下面两个属性来很轻松的实现高度自适应:
- self.tableView.estimatedRowHeight = 88;
- self.tableView.rowHeight = UITableViewAutomaticDimension;
固然很便利,不过如不雅你的页面对机能有必定请求,建议不要这么做,具体可以看看 sunnyxx 的 优化UITableViewCell高度计算的那些事 。文中针对 Auto Layout,供给了个 cell 行高的缓存库 UITableView-FDTemplateLayoutCell ,可以很好的赞助我们避免 cell 行高多次计算的问题。
如不雅不应用 Auto Layout,我们可以在请求完拿到数据后提前计算好页面个个控件的 frame 和 cell 高度,并且缓存在内存中,用的时刻直接在 heightForRowAtIndexPath: 掏出计算好的值就行,大年夜概流程如下:
模仿请求数据回调:
- - (void)viewDidLoad {
- [super viewDidLoad];
- [self buildTestDataThen:^(NSMutableArray <FDFeedEntity *> *entities) {
- self.data = @[].mutableCopy;
- @autoreleasepool {
- for (FDFeedEntity *entity in entities) {
- FrameModel *frameModel = [FrameModel new];
- frameModel.entity = entity;
- [self.data addObject:frameModel];
- }
- }
- [self.tvFeed reloadData];
- }];
- }
一个简单计算 frame 、cell 行高方法:
- //FrameModel.h
- @interface FrameModel : NSObject
- @property (assign, nonatomic, readonly) CGRect titleFrame;
- @property (assign, nonatomic, readonly) CGFloat cellHeight;
- @property (strong, nonatomic) FDFeedEntity *entity;
- @end
- //FrameModel.m
- @implementation FrameModel
- - (void)setEntity:(FDFeedEntity *)entity {
- if (!entity)
推荐阅读
【译者注】在本文中,作者介绍了即将在9.21宣布的Java 9新特点,除了最重要的模块化以外,还涉及到编译,对象,协定,缓存等新特点,也说起了在此次版本中移除的功能,供Java爱好者浏览和>>>详细阅读
本文标题:iOS中关于列表滚动流畅的一些探讨
地址:http://www.17bianji.com/lsqh/37290.html
1/2 1

网友点评
精彩导读
科技快报
品牌展示