关闭

Masonry和UITableView-FDTemplateLayoutCell结合使用时遇过的坑

标签: UITableView-FDTemplaMasonry优化自动约束
3072人阅读 评论(0) 收藏 举报
分类:

前言

    纯代码自动布局,首选框架当然是Masonry,这是一个很赞的框架。

    UITableView-FDTemplateLayoutCell也是一个很高端且很实用的框架。

    那么,很多时候我们在同一个项目中需要同时使用着两个框架。其实这两个框架同时使用并没有什么特殊技巧,使用起来也很简单。不会用的童鞋可以参考如下博客:

http://www.cnblogs.com/geshihuayoutiao/p/4671246.html

    本文要说的呢,是这两个框架一起使用的时候,在某种特定情况下产生的问题,以及问题解决的方法。


情景再现

    一个聊天界面,用的tableView,cell高度计算使用UITableView-FDTemplateLayoutCell,tableView的数据源方法中向cell传递数据是通过setMessageModel:方法传递。这个时候,tableView获取cell高度的代理方法实现就是下面的样子:

- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath {
    DPNMessageModel *messageModel = [_dataArray objectAtIndex:indexPath.row];
    NSString *identifier = [DPNChatRoomCellBase cellIdentifierForMessageConfiguration:messageModel];
    //计算高度并返回
    return [tableView fd_heightForCellWithIdentifier:identifier cacheByIndexPath:indexPath configuration:^(DPNChatRoomCellBase *cell) {
	    [cell setMessageModel:messageModel];//重点在这!!!
    }];
}

    从代码中看出,计算cell高度的方法是UITableView-FDTemplateLayoutCell提供的方法,这个方法的block回调调用setMessageModel:方法。

    从断点实验中得出,计算一个cell的高度,这个block会回调两次,也就是说setMessageModel:要执行两次。

    这好像没啥问题,两次也不多,加上数据源方法,配置一个cell,setMessageModel:方法总共执行三次。一般情况下,setMessageModel:方法肯定很简单,无非就是传递一些属性值。

    但是,但是,问题就来了!

    如果cell较为复杂,而且cell的约束需要根据setMessageModel:传来的值进行调整(这是问题重点)。这种情况下,就需要在setMessageModel:方法中主动调用设置约束的方法,不管你是重写updateConstrains还是自己写的设置约束方法,总之就是在执行setMessageModel:方法的时候设置约束的方法得再执行一次。这样的话,每配置一个cell,花的时间就有点长了,页面就显得不那么流畅了,压力测试的时候界面就很卡。


问题解决

    计算cell高度的时候,调用两侧setMessageModel:方法,这个没办法。所以配置一个cell需要调用三次setMessageModel:也是没办法的。那么,就必须从setMessageModel:内部入手。

  • 一是要精简setMessageModel:方法内部的效率。这个没啥说的。
  • 二是要减少自动约束设置方法执行次数,设置约束还是挺耗时的,所以这个是优化重点。

    刚才说了,由于约束要根据setMessageModel:传进来的属性值做调整,所以在setMessageModel:方法中得主动调用约束设置方法。比如说聊天界面,群聊的时候,别人发来的消息,需要显示发送人的昵称,自己发送的消息,不需要显示昵称。所以在设置约束的方法中得判断消息的发送者是谁,根据这个判断结果来决定昵称的约束形式。

    我优化后的处理方法是:通过cell的reuseIdentifier把消息发送者的信息传进来,这样就可以在执行setMessageModel:前获得消息发送者的信息。系统的updateConstrains或是自己写的设置约束方法的首次调用都会在setMessageModel:前执行。所以,setMessageModel:就不需要再主动调用约束设置方法。

    约束设置方法执行次数少了,效率明显会提高。


总结

    上述的问题可以简述为:在我们自己程序设计优化度不够或者一些特殊情景下,UITableView-FDTemplateLayoutCell与Masonry结合使用会导致Masonry设置约束多次执行,从而降低了程序运行效率、界面流畅度下降。

    解决办法:尽可能减少设置约束的方法的调用次数。

    上面讲了使用cell的reuseIdentifier提前传进来了关键参数。以后还可能遇到不能用reuseIdentifier传进来的关键参数,那就得想别的办法。只要不会增加设置约束方法执行次数就OK。 

1
0
查看评论

UITableView+FDTemplateLayoutCell 框架学习

UITableView+FDTemplateLayoutCell 框架学习
  • qq_23292307
  • qq_23292307
  • 2017-03-17 18:30
  • 1024

UITableView-FDTemplateLayoutCell 使用

基本用法 If you have a self-satisfied cell, then all you have to do is: #import "UITableView+FDTemplateLayoutCell.h" - (CGFloat)t...
  • muzhenhua
  • muzhenhua
  • 2016-01-22 17:50
  • 3741

iOS UITableView-FDTemplateLayoutCell框架 cell重叠 高度返回0.5问题解决

针对需要动态改变cell高度的需求, 相对来说使用UITableView-FDTemplateLayoutCell框架来解决还是比较便捷的, 他可以支持AutoLayout和 frame layout, 具体使用可以看作者demo, 今天这里主要说下在使用中遇到的问题, 这个问题搞了我一下午框架地址...
  • Corey_Jia
  • Corey_Jia
  • 2015-10-18 23:08
  • 1608

UITableView-FDTemplateLayoutCell 与Masonry 一起解决不定高度的cell

控制器// // ViewController.m // shiyan // // Created by aimee on 16/9/28. // Copyright © 2016年 aimee. All rights reserved. //#import "ViewC...
  • lybeen2007
  • lybeen2007
  • 2016-09-29 16:44
  • 886

UITableView-FDTemplateLayoutCell----UITableViewCell高度计算的那些事

我是前言 这篇文章是我和我们团队最近对 UITableViewCell 利用 AutoLayout 自动高度计算和 UITableView 滑动优化的一个总结。 我们也在维护一个开源的扩展,UITableView+FDTemplat...
  • zhaojian3513012
  • zhaojian3513012
  • 2015-12-12 20:26
  • 818

iOS UITableView+FDTemplateLayoutCell 配合AutoLayout分分钟教你实现类似微信朋友圈的动态高度自适应

UITableView里面的Cell固定高度那是基本不可能了,很多功能和界面都会涉及到高度自适应,而且电商类的尤其普遍,之前都是自己算啊算,代码写的非常多,逻辑还没写,光这布局UI和高度计算都能接近1000了,写完之后关键出点Bug整个人都不好了 当时的是这样的: 突然在github上看到UIT...
  • Deft_MKJing
  • Deft_MKJing
  • 2016-06-02 19:35
  • 11743

iOS -UITableView-FDTemplateLayoutCell 的使用

基本应用import “UITableView+FDTemplateLayoutCell.h” (CGFloat)tableView:(UITableView )tableView heightForRowAtIndexPath:(NSIndexPath )indexPath { return ...
  • qq_34008733
  • qq_34008733
  • 2016-04-26 19:06
  • 1595

Masonry与UITableView+FDTemplateLayoutCell搭配使用

Masonry是一款轻量级的布局框架,上手简单。本文只是对此的基本使用,具体可看以下两篇技术博客: iOS 源代码分析----Masonry:http://draveness.me/ios-yuan-dai-ma-fen-xi-masonry/ Masonry介绍与使用实践(快速上手Au...
  • sinat_32526807
  • sinat_32526807
  • 2016-08-31 18:36
  • 728

Masonry和UITableView-FDTemplateLayoutCell的结合使用

Masonry和UITableView+FDTemplateLayoutCell.h的结合使用,进行计算cell高度
  • J1angLei
  • J1angLei
  • 2017-07-25 17:00
  • 198

iOS 基于MVVM设计模式练习UITableView使用 —— HERO博客

iOS 基于MVVM设计模式练习UITableView使用。
  • hero_wqb
  • hero_wqb
  • 2016-03-14 21:53
  • 4483
    个人资料
    • 访问:292698次
    • 积分:2765
    • 等级:
    • 排名:第15411名
    • 原创:64篇
    • 转载:12篇
    • 译文:3篇
    • 评论:64条
    联系方式
    544043963@qq.com
    最新评论