UI第⼗一讲:UITableView 高级 自定义cell , 建立model进行数据传递实现MVC模式,cell自适应高度
一、自定义cell(包括cell的自定义,以及直接赋值的方法)
1.自定义cell就是创建一个UITableViewCell的子类。
把cell上的控件创建都封装在子类中,简化UIViewController中的代码
2.在自定义CELL中,在init方法里面获取的宽度永远都是320。在这里只初始化和添加到contentView里面。
在layoutSubviews里面才能获取到真正的宽度。在这个方法里面一定要记得继承父类。如果不继承父类,分割线会获取不到cell的高度。以后在开发中,一定要记得不要随便重写父类的方法,要不然你会后悔的。
在layoutSubviews里面才能获取到真正的宽度。在这个方法里面一定要记得继承父类。如果不继承父类,分割线会获取不到cell的高度。以后在开发中,一定要记得不要随便重写父类的方法,要不然你会后悔的。
示例代码分析:(这个例子包括cell的自定义,以及直接赋值的方法)
1.需要建立tabelViewCell类, 在其中进行cell上控件的添加
2.在tabelViewCell.m中进行初始化,和layoutSubviews的frame布局的操作
tabelViewCell.h定义属性
tabelViewCell.m进行初始化
二、建立model进行数据传递
mvc之间的数据传递模式
model传递数据的方式的两种方式:
1.定义属性,通过重写它的setter方法,实现数据传递
2.定义方法,然后在.m中实现方法,从而是实现数据传递
示例代码:(两种方法都在其中)
步骤: 1.创建model属性类,并定义属性
2.在tabelViewCell子类中进行属性或方法定义
3.在viewController.m中将数据传递给model
4.在tabelViewCell子类中,对控件进行赋值
viewController.m文件
创建的student.h文件
tabelViewCell子类,用于创建在cell上的子控件
三、cell自适应高度
//此为cell自适应高度的计算方法 用时直接调用就行
-(CGFloat)stringHeightWithString:(NSString *)str fontSize:(CGFloat)fontSize contentSize:(CGSize)size
{
//第一个参数,代表最大的范围
//第二个参数 代表是否考虑字体和字号
//第三个参数 代表是使用什么字体和字号
//第四个参数 用不到 基本上是 nil
CGRect stringRect = [str boundingRectWithSize:size options:NSStringDrawingUsesLineFragmentOrigin | NSStringDrawingUsesFontLeading
attributes:@{NSFontAttributeName:[UIFont systemFontOfSize:fontSize]} context:nil];
return stringRect.size.height;
}
1 //调用cell自适应高度方法 计算整个cell的高度 *******************************
2 -(CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
3 {
4 student *stu = self.dataArray[indexPath.row];
5 //此为cell的自适应高度 自适应高度+固定label的高度
6 return [self stringHeightWithString:stu.name
7 fontSize:18 contentSize:CGSizeMake(self.view.frame.size.width - 20,10000)] + 20 + 40;
8 }
cell自适应高度
如果使用纯代码的cell自适应高度,需要在返回tableView高度的方法里面计算一下cell的高度。
label自适应高度:第一步:numberOfLines = 0;第二步:sizeToFit。前提是label的text不能为空。
1 //设置UILabel的行数 如果为0 则返回任意行
2 self.myLabel.numberOfLines = 0;
3 //自适应高度
4 [self.myLabel sizeToFit];
实例代码:(只显示核心部分)