自定义不等高cell—storyBoard或xib自定义不等高cell
1.iOS8之后利用storyBoard或者xib自定义不等高cell:
对比自定义等高cell,需要几个额外的步骤(iOS8开始才支持)
- 添加子控件和contentView(cell的contentView)之间的间距约束(需要代码控制约束)
- 设置tableViewCell的真实行高和估算行高
// 以下两行代码就被苹果称为self-sizing技术,可惜只能在iOS8及其之后应用 // 告诉tableView所有cell的真实高度是自动计算(根据设置的约束来计算)
self.tableView.rowHeight = UITableViewAutomaticDimension;
// 告诉tableView所有cell的估算高度
self.tableView.estimatedRowHeight = ;
2.iOS8之前利用storyBoard或者xib自定义不等高cell:
- 如果cell内部有自动换行的label,需要设置preferredMaxLayoutWidth属性
- label之所以知道自己的最大宽度,是因为其要显示出来的时候,它会根据自己的左右约束或者宽度约束计算出最大宽度 preferredMaxLayoutWidth。然后根据最大宽度和内容多少计算出来label的实际高度。但这一切的前提是label要显示出来的时候,如果label不显示,则不计算preferredMaxLayoutWidth,即preferredMaxLayoutWidth = 0。这时需要手动设置 preferredMaxLayoutWidth。
- 因为下面heightForRowAtIndexPath:的cell只是为了计算高度,cell是不会显示出来的,所以cell上面的label也不会显示出来,所以需要手动设置label的heightForRowAtIndexPath的值,这里在cell的awakeFromNib中对 preferredMaxLayoutWidth 进行赋值。
- (void)awakeFromNib
{
// 手动设置文字的最大宽度(目的是:让label知道自己文字的最大宽度,进而能够计算出自己的frame)
self.text_label.preferredMaxLayoutWidth = [UIScreen mainScreen].bounds.size.width - ;
}
- cell提供一个height的属性,用于返回cell的高度
- (CGFloat)height
{
// 强制布局cell内部的所有子控件(label根据文字多少计算出自己最真实的尺寸)
[self layoutIfNeeded]; // 计算cell的高度
if (self.status.picture) {
return CGRectGetMaxY(self.pictureImageView.frame) + 10;
} else {
return CGRectGetMaxY(self.text_label.frame) + 10;
}
}
- 设置tableView的cell估算高度
- (void)viewDidLoad {
[super viewDidLoad]; // 告诉tableView所有cell的估算高度(设置了估算高度,就可以减少tableView:heightForRowAtIndexPath:方法的调用次数)
self.tableView.estimatedRowHeight = ;
}
估算高度的作用:因为tableView继承自UIScrollView,所以tableView需要根据cell的高度来计算出contentSize。如果不设置估算高度,程序启动,首先会调用多次heightForRowAtIndexPath:方法(该次数等于数据模型的count)。但如果设置了估算高度,程序会根据给定的估算高度计算出contentSize(计算方法是:估算高度 * 数据模型的count)。只有cell显示的时候才会调用heightForRowAtIndexPath:方法计算cell的真实高度,这样一来,heightForRowAtIndexPath:方法的调用次数大大降低,同时也大大提高了性能。
- 在代理方法中计算cell的高度
XMGStatusCell *cell;
- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
{
// 创建一个cell(cell的作用:根据模型数据布局所有的子控件,进而计算出cell的高度,但是因为这个cell不会显示,所以需要手动设置cell中label的最大宽度)
// cell的作用只是为了计算并返回cell的高度,而不是为了返回cell,所以这个cell是打酱油的,这个cell不会被显示在tableView上,既然也不会被回收到tableView的缓存池(因为只有曾经显示到tableView并且已经离开屏幕的cell才会被回收到缓存池)
if (!cell) {
cell = [tableView dequeueReusableCellWithIdentifier:ID];
} // 设置模型数据
cell.status = self.statuses[indexPath.row]; return cell.height;
}
自定义不等高cell—storyBoard或xib自定义不等高cell的更多相关文章
- xib自定义cell代码规范
// // MJTgCell.m // 01-团购 // // Created by apple on 14-4-1. // Copyright (c) 2014年 itcast. All r ...
- [BS-13] 创建和注册UITableViewCell及Storyboard和Xib区别
创建和注册UITableViewCell及Storyboard和Xib区别 // 界面创建完成被调用 - (void)viewDidLoad { [super viewDidLoad]; /** 如果 ...
- iOS开发——UI进阶篇(二)自定义等高cell,xib自定义等高的cell,Autolayout布局子控件,团购案例
一.纯代码自定义等高cell 首先创建一个继承UITableViewCell的类@interface XMGTgCell : UITableViewCell在该类中依次做一下操作1.添加子控件 - ( ...
- AJ学IOS(16)UI之XIB自定义Cell实现团购UI
AJ分享,必须精品 先看效果图 自定义Cell 本次主要是自定义Cell的学习 实现自定义Cell主要有三种方法:按照使用的频繁度排序: XIB > 纯代码 > StoryBoard XI ...
- IOS xib在tableview上的简单应用(通过xib自定义cell)
UITableView是一种常用的UI控件,在实际开发中,由于原生api的局限,自定义UITableViewCell十分重要,自定义cell可以通过代码,也可以通过xib. 这篇随笔介绍的是通过xib ...
- iOS深入学习(UITableView系列4:使用xib自定义cell)
可以通过继承UITableViewCell重新自定义cell,可以像下面一样通过代码来自定义cell,但是手写代码总是很浪费时间, ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 ...
- iOS 中使用 XIB 自定义cell 的两种方法 以及 编译出现常见 的错误 ++++(xcode6.0之后)
一. 注册cell 1.创建自定义cell并勾选 xib :(勾选xib就会自动生成与cell文件关联的xib) 2.在 tableViewController里注册自定义Cell (或者遵守tabl ...
- iOS 中使用 XIB 自定义cell的两种方法以及编译出现常见 的错误 (xcode6.0之后)
一. 注册cell 1.创建自定义cell并勾选 xib :(勾选xib就会自动生成与cell文件关联的xib) 2.在 tableViewController里注册自定义Cell (或者遵守tabl ...
- 新手教程之使用Xib自定义UITableViewCell
新手教程之使用Xib自定义UITableViewCell 前言 首先:什么是UITableView?看图 其次:什么是cell? 然后:为什么要自定cell,UITableView不是自带的有cell ...
随机推荐
- js左右滚动幻灯
js左右滚动幻灯 点击下载
- iOS根据Url 获取图片尺寸
iOS根据Url 获取图片尺寸 // 根据图片url获取图片尺寸 +(CGSize)getImageSizeWithURL:(id)imageURL { NSURL* URL = nil; if([i ...
- GridView EmptyDataTemplate 动态显示
以下语句加在GridView.DataBind()之后: Table GridViewTable = ((Table)gvGridView.Controls[]); if (!isSearch) (( ...
- usb驱动开发18之设备生命线
现在已经使用GET_DESCRIPTOR请求取到了包含一个配置里所有相关描述符内容的一堆数据,这些数据是raw的,即原始的,所有数据不管是配置描述符.接口描述符还是端点描述符都挤在一起,所以得想办法将 ...
- 将数据库备份到AZURE blob storage
1创建一个Storage Account 1)点击Browse->Storage accounts 2) 填写Storage account,请记住这个名字,之后创建credential需要用到 ...
- 15个nosql数据库
1.MongoDB 介绍 MongoDB是一个基于分布式文件存储的数据库.由C++语言编写.主要解决的是海量数据的访问效率问题,为WEB应用提供可扩展的高性能数据存储解决方案.当数据量达到50GB以上 ...
- C#.NET 大型通用信息化系统集成快速开发平台 4.0 版本 - 用户权限树的实现 -- 权限递归树
业务系统里经常会需要计算类似的树形权限树的业务需求 1:往往会有一些需求,a 对 b 有权限, b对c 有权限, 等等. 2:还需要很直观的看到,整个权限的树形关系,一目了然的那种. 3:程序调用简单 ...
- 精通jQuery选择器
虽然jQuery上手简单,相比于其他库学习起来较为简单,但是要全面掌握,却不轻松.因为它涉及到网页开发的方方面面,提供的方法和内部变化有上千种之多.初学者常常感到,入门很方便,提高很困难.本文的目标是 ...
- SHGetFileInfo函数详解
SHGetFileInfo函数: WINSHELLAPI DWORD WINAPI SHGetFileInfo( LPCTSTR pszPath, DWORD dwFileAttributes, SH ...
- VMware-Transport(VMDB) error -44:Message.The VMware Authorization Service is not running解决方案
出现的错误如下: 原因:本机中有一个VMware服务未开启导致的. 解决方案: 1.打开“运行”->输入services.msc !!!文章转自浩瀚先森博客,转载请注明,谢谢.http://ww ...