一、使用xib或者storyboard自定义非等高的cell实现方式差不多,这里简单介绍一下通过xib文件实现的方法

<1.1>创建一个继承自UITableViewCell的子类,比如ChaosWeiboCell

<1.2>在模型中增加一个cellHeight属性,用来存放对应的cell的高度

  1. #import <UIKit/UIKit.h> // 这里修改成UIKit框架
  2.  
  3. @interface ChaosWeibo : NSObject // 模型类
  4. /** 正文 */
  5. @property(nonatomic,strong) NSString *text;
  6. /** 头像 */
  7. @property(nonatomic,strong) NSString *icon;
  8. /** 配图 */
  9. @property(nonatomic,strong) NSString *picture;
  10. /** 用户名 */
  11. @property(nonatomic,strong) NSString *name;
  12. /** VIP */
  13. @property(nonatomic,assign,getter=isVIP) BOOL vip;
  14. // CGFloat在CG框架里面 NSString *在Foundation框架里面,UIKit框架包含了这两个框架
  15. /** cell的高度 */
  16. @property(nonatomic,assign) CGFloat cellHeight;
  17.  
  18. // 提供一个将字典数据转换成模型数据的类方法
  19. + (instancetype)WeiboWithDict:(NSDictionary *)dict;
  20. @end

  

<2>创建一个xib文件(文件名建议跟cell的类名一样),比如ChaosWeiboCell.xib

  <2.1>拖拽一个UITableViewCell出来

  <2.2>修改cell的class为ChaosWeiboCell

  <2.3>设置cell的重用标识

  <2.4>往cell中添加需要用到的子控件

<3>在控制器中

  <3.1>利用registerNib...方法注册xib文件

  <3.2>利用重用标识找到cell(如果没有注册xib文件,就需要手动去加载xib文件)

  <3.3>给cell传递模型数据

  <3.4>在控制器中实现tableView:estimatedHeightForRowAtIndexPath:方法,返回一个估计高度,比如200

  1. // 给cell一个估计高度
  2. // 这个方法的意义在于:没有这个方法,程序的执行顺序是1、heightForRowAtIndexPath:方法得到cell的高度(高度不准确,有几个就获得几个的cell高度,消耗内存)2、然后cellForRowAtIndexPath:方法根据不准确的高度创建cell
  3. // 有了这个方法程序会根据这个大约的高度先去执行cellForRowAtIndexPath:方法,然后再执行heightForRowAtIndexPath:方法返回真正的cell高度
  4. - (CGFloat)tableView:(UITableView *)tableView estimatedHeightForRowAtIndexPath:(NSIndexPath *)indexPath
  5. {
  6. return 200;
  7. }
  8. @end

  <3.5>在控制器中实现tableView:heightForRowAtIndexPath:方法,返回cell的真实高度(模型中的cellHeight属性)

  1. - (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
  2. {
  3. ChaosWeibo *weibo = self.weiboArray[indexPath.row];
  4. return weibo.cellHeight;
  5. }

  

<4>在ChaosWeiboCell中

  <4.1>将xib中的子控件连线到类扩展中

  <4.2>需要提供一个模型属性,重写set方法,在这个方法中设置模型属性到子控件上

    并且在set方法中调用[self layoutIfNeed]方法强制布局,然后计算出模型的cellHeight属性值

  1. - (void)setWeibo:(ChaosWeibo *)weibo
  2. {
  3. // 重写set方法不可少的代码
  4. _weibo = weibo;
  5. // 设置头像
  6. self.headView.image = [UIImage imageNamed:weibo.icon];
  7. // 设置昵称
  8. self.nameLabel.text = weibo.name;
  9. // 设置会员标志
  10. if (weibo.isVIP) {
  11. self.vipView.hidden = NO; // 重新将hidden属性设置为NO,因为cell是通过缓存池回收过来的,万一之前是hidden,这里没有这一句就不行了
  12. self.vipView.image = [UIImage imageNamed:@"vip"];
  13. self.nameLabel.textColor = [UIColor orangeColor];
  14. } else{
  15. self.vipView.hidden = YES;
  16. self.nameLabel.textColor = [UIColor whiteColor];
  17. }
  18. // 设置正文内容
  19. self.contentLabel.text = weibo.text;
  20. if (weibo.picture) {
  21. self.iconView.hidden = NO; // 同理
  22. self.iconView.image = [UIImage imageNamed:weibo.picture];
  23. } else {
  24. self.iconView.hidden = YES;
  25. }
  26. // 将绑定好数据的cell进行强制布局
  27. [self layoutIfNeeded];
  28.  
  29. // 计算cell的高度
  30. if (self.iconView.hidden) { // 没有配图的情况
  31. weibo.cellHeight = CGRectGetMaxY(self.contentLabel.frame) + 10;
  32. } else { // 有配图的情况
  33. weibo.cellHeight = CGRectGetMaxY(self.iconView.frame) + 10;
  34. }
  35. }

  

  <4.3>也可以将创建获得cell的代码封装起来(比如cellWithTableView:方法)

<5>需要注意的一点就是label的宽度问题,由于layoutIfNeed方法的原因,系统有时候算出的高度会于实际不符。因为系统算的高度是根据文字宽度算的。

解决办法,通过调用一下方法:

  1. // 这个方法是自定义控件从xib文件初始化完后调用的方法,通过这个方法解决多行label算的高度不准的情况
  2. - (void)awakeFromNib
  3. {
  4. // 设置每一行label文字的最大宽度
  5. // 保证算出来的label的高度 跟 显示出来的效果一样
  6. self.contentLabel.preferredMaxLayoutWidth = [UIScreen mainScreen].bounds.size.width - 20;
  7. }

  

iOS边练边学--自定义非等高的cell的更多相关文章

  1. iOS边练边学--自定义等高的cell

    一.storyboard自定义cell <1>创建一个继承自UITableViewCell的子类,比如ChaosDealCell <2>在storyboard中 <2.1 ...

  2. 自定义非等高 Cell

    1.自定义非等高 Cell介绍 1.1 代码自定义(frame) 新建一个继承自 UITableViewCell 的类. 重写 initWithStyle:reuseIdentifier: 方法. 添 ...

  3. iOS边练边学--CALayer,非根层隐式动画,钟表练习

    一.CALayer UIView之所以能显示在屏幕上,完全是因为他内部的一个图层 在创建UIView对象时,UIView内部会自动创建一个图层(即CALayer对象),通过UIView的layer属性 ...

  4. iOS边练边学--(Quartz2D)基本图形的绘制#附加自定义进度控件的练习

    一.Quartz2D使用须知 Quartz2D的API是纯C语言的 Quartz2D的API来自于Core Graphics框架 二.<1>通过原始的方法(C语言)绘制简单图形--了解 & ...

  5. iOS边练边学--父子控制器之自定义控制器的切换

    一.如图所示的界面,按钮One.Two.Three分别对应三个控制器的view,点击实现切换.个人感觉父子控制器的重点在于,控制器的view们之间建立了父子关系,控制器不建立的话,发生在view上面的 ...

  6. iOS边练边学--应用数据存储的常用方式(plist,Preference,NSKeyedArchiver)其中的三种

    iOS应用数据存储的常用方式: XML属性列表(plist)归档 Preference(偏好设置) NSKeyedArchiver归档(NSCoding) SQLite3--这里暂且不讲 Core D ...

  7. iOS边练边学--多线程介绍、NSThread的简单实用、线程安全以及线程之间的通信

    一.iOS中的多线程 多线程的原理(之前多线程这块没好好学,之前对多线程的理解也是错误的,这里更正,好好学习这块) iOS中多线程的实现方案有以下几种 二.NSThread线程类的简单实用(直接上代码 ...

  8. iOS边练边学--文件压缩和解压缩的第三方框架SSZipArchive的简单使用

    一.非cocoaPods方法,需要注意的是:直接将SSZipArchive拖入项目编译会报错. Undefined symbols for architecture x86_64: "_cr ...

  9. iOS边练边学--iOS中的XML数据解析

    XML的解析方式 SAX 大小文件都可以 NSXMLParser DOM 最好是小文件 GDataXML NSXMLParser的用法 创建解析器来解析 // 创建XML解析器 NSXMLParser ...

随机推荐

  1. Android学习系列(6)--App模块化及工程扩展

    这篇文章是Android开发人员的必备知识,是我特别为大家整理和总结的,不求完美,但是有用. 1.需求    无论是在.net还是java平台,合理的分层架构是最普遍的模块化思路之一.    dll, ...

  2. 浅谈原始套接字 SOCK_RAW 的内幕及其应用(port scan, packet sniffer, syn flood, icmp flood)

    一.SOCK_RAW 内幕 首先在讲SOCK_RAW 之前,先来看创建socket 的函数: int socket(int domain, int type, int protocol); domai ...

  3. Concurrency Managed Workqueue(一)workqueue基本概念

    一.前言 workqueue是一个驱动工程师常用的工具,在旧的内核中(指2.6.36之前的内核版本)workqueue代码比较简单(大概800行),在2.6.36内核版本中引入了CMWQ(Concur ...

  4. Android Intent Scheme URLs攻击

    0x0 引言 我们知道,在Android上的Intent-based攻击非常普遍.这样的攻击轻则导致应用程序崩溃.重则可能演变提权漏洞.当然,通过静态特征匹配,Intent-Based的恶意样本还是非 ...

  5. html 优化 简谈

    一直想写下SEO中关于HTML优化方面的的文章,总算空出这部分时间来了.其实,HTML优化应该是网站内部优化的重点,每个SEOer都需高度重视.根据本人多年实战经验,一般做过HTML优化的网站上线后, ...

  6. Es6 函数式编程 MayBe函子的简单示例

    初级函子的作用非常简单,使用场景主要体现在:深入访问object的属性的时候,不会担心由于属性不存在.undefined.null等问题出现异常. MayBe.js var MayBe = funct ...

  7. php-fpm 启动参数及重要配置详解(转)

    约定几个目录 /usr/local/php/sbin/php-fpm /usr/local/php/etc/php-fpm.conf /usr/local/php/etc/php.ini 一,php- ...

  8. 【Android】3.14 公交线路查询功能

    分类:C#.Android.VS2015.百度地图应用: 创建日期:2016-02-04 一.简介 利用BusLineSearch方法可查询公交线路的详情信息. 二.运行截图 简介:介绍查询公交线路功 ...

  9. bazel-编译动态库

    demo2_2 使用baze编译动态库 demo2_2目录树 ├── app │ ├── BUILD │ ├── func.cpp │ └── func.hpp ├── README.md └── W ...

  10. cocos2d-xV3.0rc 环境搭建

    一.下载 由于www.cocos2d-x.org很难打开,不知道是不是电信的问题,所以只好在cocoschina论坛里王哲大牛的帖子里找到了一个下载链接:http://126.am/GyU7l0 帖子 ...