// =====( 2017-07-27)添加内容
提供Demo链接:http://download.csdn.net/detail/red_coraldown/9912546
描述: 该Demo 应用到Masonry 、MJExtension资源库,并展示了一些布局技巧和 数据模型转换的一些使用方法。
温馨提示: 如果UITableViewCell上面存在UIlabel并且自适应多行展示的话,记得设置UIlabel的
preferredMaxLayoutWidth属性(解决iOS 8.4的系统中,会出现不能精确计算和展示label的问题)
欢迎各位大神留言批评指正!
/// =================
在之前各种找自适应cell,都感觉代码好多,现在又得结合masonry来自动计算cell的高度,在网上查找各位大神的办法,就是感觉代码好多,经过半天的艰苦奋斗,终于找出来了一个简单的办法,代码看着很少哟!!
但是要想实现这个功能的话,你得准备好masonry框架,可通过cocoapods方法或者手动添加导入实现,手动导入masonry的下载链接 https://github.com/liuyanlllyyy/masnory ,当然你也可以选择到 github 去搜索masonry 也是一样的,下面就给大家描述一下我研究出来的masonry + 自适应cell高度的方法:
首选,你要对masonry 的一些功能实现有所了解,比方说,UILabel 在masonry下设置顶部和左侧,仅仅只设置这两个约束条件,不进行该控件的其它约束设置的时候,这时他的高度和宽度是自适应的,可以无限加长(在你尚未设置右侧约束或者宽度或者
numberOfLines != 0;的时候),也可以无线加宽(在你尚未设置底部约束和高度或者numberOfLines = 0;的时候),等等功能可学习masonry demo;
在这里UItableView的一些基本使用就不做详细说明了,基本上实现tableview的那几个常用的dataSource 和 delegate 方法,实现这些方法后,需要以下步骤实现:
第一步 : 在tableview 所在的类里面,创建一个c存储ell高度全局变量
float cellHeight;
第二步: 你可以选择给该属性 cellHeight 一个默认的高度。比方说 : cellHeight = 60;在
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath;
的实现方法里面实现自定义cell的一个私有方法,我的demo如下 :
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
AutoSizeFitHeightTableViewCell *autoFitHeightCell = [tableView dequeueReusableCellWithIdentifier:[AutoSizeFitHeightTableViewCell identifier]];
if (!autoFitHeightCell) {
autoFitHeightCell = [[AutoSizeFitHeightTableViewCell alloc]initWithStyle:UITableViewCellStyleDefault reuseIdentifier:[AutoSizeFitHeightTableViewCell identifier]];
}
//**********************************************
/**
* 此处进行您的数据复制操作
*/
//**********************************************
//然后获得当前cell高的的数值存储
cellHeight = [autoFitHeightCell getAutoCellHeight];
return autoFitHeightCell;
}
- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath {
//返回存储的高度
return cellHeight;
}
第三步: 自定义cell中的方法实现 ,cell中其它控件布局实现用masonry方法实现即可,具体可查阅masonry的demo
//- (float)getAutoCellHeight {
//
// [self layoutIfNeeded];
//
// /**
// * self.最底部的控件.frame.origin.y 为自适应cell中的最后一个控件的Y坐标
// * self.最底部的空间.frame.size.height 为自适应cell中的最后一个控件的高
// * marginHeight 为自适应cell中的最后一个控件的距离cell底部的间隙
// */
// return self.最底部的控件.frame.origin.y + self.最底部的空间.frame.size.height + marginHeight;
//
//}
第四步: 也是最重要的一点,在你的自定义cell中,有UILabel控件的,其高度也要计算在cell的高度,你通过masonry方法进行控件布局,此时你又想让label自适应的时候,记得要给label一个最大的高度,例如这样:
make.width.lessThanOrEqualTo(SCREEN_WIDTH -70); 其中 SCREEN_WIDTH 为当前屏幕宽度,括号中的值可自行定义,这样可以避免label 高度不准确的问题
通过以上操作步骤,基本上自适应cell高度就搞定了,这些是个人理解的一个自适应cell高度的办法,诸位在查阅的时候发现什么问题、错误或者有好的建议的时候,欢饮各位留言或者,我会及时更正的,并向诸位学习新的知识,大家一起进步,谢谢各位!!!