一.使用xib封装一个view的步骤
1.新建一个xib文件描述一个view的内部结构。
2.新建一个自定义的类,该类继承自系统自带的view,名字与xib文件名保持一致。
3.新建的类.m文件与xib的连线。
4.提供一个类方法返回自定义的类,屏蔽xib加载过程。
5.提供一个模型属性,让外界传递模型数据。
6.重写模型属性的setter方法,将模型属性展示到对应属性上。
二.通过代码自定义cell(cell 高度不一致)
1.新建一个继承自UITableViewCell的类
2.重写initWithStyle:reuseIdentifier:方法添加所有需要显示的子控件(不需要设置子控件的数据和frame, 子控件要添加到contentView中)进行子控件一次性的属性设置(有些属性只需要设置一次, 比如字体\固定的图片)
3.提供2个模型数据模型: 存放文字数据\图片数据frame模型: 存放数据模型\所有子控件的frame\cell的高度
4.cell拥有一个frame模型(不要直接拥有数据模型)
5.重写frame模型属性的setter方法: 在这个方法中设置子控件的显示数据和frame
6.frame模型数据的初始化已经采取懒加载的方式(每一个cell对应的frame模型数据只加载一次)
三. 内部视图
UITableViewCell内部有个默认的子视图:contentView,contentView是UITableViewCell所显示内容的父视图,可显示一些辅助指示视图
辅助指示视图的作用是显示一个表示动作的图标,可以通过设置UITableViewCell的accessoryType来显示,默认是UITableViewCellAccessoryNone(不显示辅助指示视图),还可以通过cell的accessoryView属性来自定义辅助指示视图(比如往右边放一个开关)
四.重用原理:
当滚动列表时,部分UITableViewCell会移出窗口,UITableView会将窗口外的UITableViewCell放入一个对象池中,等待重用。当UITableView要求dataSource返回UITableViewCell时,dataSource会先查看这个对象池,如果池中有未使用的UITableViewCell,dataSource会用新的数据配置这个UITableViewCell,然后返回给UITableView,重新显示到窗口中,从而避免创建新对象
self.tableView.estimatedRowHeight=44.0f;
self.tableView.rowHeight=UITableViewAutomaticDimension;
五:IOS8 设置TableView Separatorinset 分割线从边框顶端开始
在ios8上 [TableViewsetSeparatorInset:UIEdgeInsetsMake(0,0,0,0)];不起作用
经过测试加入下面方法 在ios7 8上都可以正常工作
-(void)viewDidLayoutSubviews
{
if([self.tableViewrespondsToSelector:@selector(setSeparatorInset:)]) {
[self.tableViewsetSeparatorInset:UIEdgeInsetsMake(0,0,0,0)];
}
if([self.tableViewrespondsToSelector:@selector(setLayoutMargins:)]) {
[self.tableViewsetLayoutMargins:UIEdgeInsetsMake(0,0,0,0)];
}
}
-(void)tableView:(UITableView*)tableViewwillDisplayCell:(UITableViewCell*)cellforRowAtIndexPath:(NSIndexPath*)indexPath
{
if([cellrespondsToSelector:@selector(setSeparatorInset:)]) {
[cellsetSeparatorInset:UIEdgeInsetsZero];
}
if([cellrespondsToSelector:@selector(setLayoutMargins:)]) {
[cellsetLayoutMargins:UIEdgeInsetsZero];
}
}