一.使用xib封裝一個(gè)view的步驟
1.新建一個(gè)xib文件描述一個(gè)view的內(nèi)部結(jié)構(gòu)。
2.新建一個(gè)自定義的類,該類繼承自系統(tǒng)自帶的view,名字與xib文件名保持一致。
3.新建的類.m文件與xib的連線。
4.提供一個(gè)類方法返回自定義的類,屏蔽xib加載過程。
5.提供一個(gè)模型屬性,讓外界傳遞模型數(shù)據(jù)。
6.重寫模型屬性的setter方法,將模型屬性展示到對應(yīng)屬性上。
二.通過代碼自定義cell(cell 高度不一致)
1.新建一個(gè)繼承自UITableViewCell的類
2.重寫initWithStyle:reuseIdentifier:方法添加所有需要顯示的子控件(不需要設(shè)置子控件的數(shù)據(jù)和frame, ?子控件要添加到contentView中)進(jìn)行子控件一次性的屬性設(shè)置(有些屬性只需要設(shè)置一次, 比如字體\固定的圖片)
3.提供2個(gè)模型數(shù)據(jù)模型: 存放文字?jǐn)?shù)據(jù)\圖片數(shù)據(jù)frame模型: 存放數(shù)據(jù)模型\所有子控件的frame\cell的高度
4.cell擁有一個(gè)frame模型(不要直接擁有數(shù)據(jù)模型)
5.重寫frame模型屬性的setter方法: 在這個(gè)方法中設(shè)置子控件的顯示數(shù)據(jù)和frame
6.frame模型數(shù)據(jù)的初始化已經(jīng)采取懶加載的方式(每一個(gè)cell對應(yīng)的frame模型數(shù)據(jù)只加載一次)
三. 內(nèi)部視圖
UITableViewCell內(nèi)部有個(gè)默認(rèn)的子視圖:contentView,contentView是UITableViewCell所顯示內(nèi)容的父視圖,可顯示一些輔助指示視圖
輔助指示視圖的作用是顯示一個(gè)表示動(dòng)作的圖標(biāo),可以通過設(shè)置UITableViewCell的accessoryType來顯示,默認(rèn)是UITableViewCellAccessoryNone(不顯示輔助指示視圖),還可以通過cell的accessoryView屬性來自定義輔助指示視圖(比如往右邊放一個(gè)開關(guān))
四.重用原理:
當(dāng)滾動(dòng)列表時(shí),部分UITableViewCell會(huì)移出窗口,UITableView會(huì)將窗口外的UITableViewCell放入一個(gè)對象池中,等待重用。當(dāng)UITableView要求dataSource返回UITableViewCell時(shí),dataSource會(huì)先查看這個(gè)對象池,如果池中有未使用的UITableViewCell,dataSource會(huì)用新的數(shù)據(jù)配置這個(gè)UITableViewCell,然后返回給UITableView,重新顯示到窗口中,從而避免創(chuàng)建新對象
self.tableView.estimatedRowHeight=44.0f;
self.tableView.rowHeight=UITableViewAutomaticDimension;
五:IOS8 設(shè)置TableView Separatorinset 分割線從邊框頂端開始
在ios8上 [TableViewsetSeparatorInset:UIEdgeInsetsMake(0,0,0,0)];不起作用
經(jīng)過測試加入下面方法 在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];
}
}