第十二章 UITableViewCell的自定義
一梢什、自定義Cell
自定義cell的步驟:
1.創(chuàng)建一個(gè)類(lèi)繼承于UITableViewCell
2.實(shí)現(xiàn)UITableViewCell的初始化方法:
- (instancetype)initWithStyle:(UITableViewCellStyle*)style reuseIdentifier:(NSString*)reuseIdentifier;
3.確保所有的你想添加的子視圖都在自定義cell的初始化方法中創(chuàng)建,由于UITableView的重用機(jī)制掺冠,一個(gè)cell在第一次創(chuàng)建成功并用于下一次顯示的時(shí)候,不會(huì)再走初始化方法码党,這樣可以避免子視圖的重復(fù)創(chuàng)建
4.在cell的子視圖創(chuàng)建成功后德崭,將子視圖設(shè)置為屬性斥黑,類(lèi)似于UITableViewCell所自帶的textLabel和detailLabel屬性。便于在UITableView的協(xié)議中給定義視圖賦值
二眉厨、Model類(lèi)型對(duì)象的使用
Model類(lèi):主要是為了給我們提供數(shù)據(jù)锌奴,簡(jiǎn)單而言即自定義類(lèi)且繼承于NSObject的稱(chēng)之為Model。而繼承于UIView的稱(chēng)之為View類(lèi)缺猛。OC中的KVC就是幫助我們將字典轉(zhuǎn)換為Model類(lèi)而存在的
1.設(shè)置cell被選中時(shí)的樣式:
cell.selectionStyle = UITableViewCellSelectionStyleNone;
UITableViewCellSelectionStyleBlue
UITableViewCellSelectionStyleGray
UITableViewCellSelectionStyleDefault
2.設(shè)置文本內(nèi)容的折行顯示
第一步:獲取要計(jì)算高度的內(nèi)容
NSString* str = self.dataArray[indexPath.row / 2];
第二步:計(jì)算文字的高度,計(jì)算出來(lái)文字的矩形范圍
CGRect rect = [str boundingRectWithSize:(CGSizeMake(CGRectGetWidth([UIScreen mainScreen].bounds) - 30, MAXFLOAT)) options:(NSStringDrawingUsesFontLeading | NSStringDrawingUsesLineFragmentOrigin ) attributes:@{NSFontAttributeName:[UIFont systemFontOfSize:17.0]} context:nil];
參數(shù)解釋?zhuān)? Size:為文字給定一個(gè)最大范圍
options:設(shè)置計(jì)算內(nèi)容大小的方式
LineFragmentOrigin:將每一行文字都按照矩形來(lái)計(jì)算,用來(lái)計(jì)算印刷體文字的大小
FontLeading:計(jì)算一行文字大小的時(shí)候要將行間距計(jì)算在內(nèi)
attributes:文字的屬性缨叫,例如文字的字體、或者是文字的大小
第三步:返回內(nèi)容的高度:內(nèi)容的高度 + 上留白 + 下留白荔燎。當(dāng)我們的文字中如果有emoji表情時(shí)耻姥,列如??,他會(huì)比平常文字稍微高一點(diǎn)點(diǎn)有咨,我們?yōu)榱烁_琐簇,多加個(gè)2;
return rect.size.height + 10 + 10 + 2;
3.如果當(dāng)前視圖控制器的父類(lèi)是tableView座享,那么self.view == self.tableView婉商,注冊(cè)----self.view 和self.tableView 在類(lèi)中是指的同一個(gè)東西,只是返回值類(lèi)型不同渣叛,沒(méi)有層級(jí)關(guān)系
4.cell的自適應(yīng)高度的步驟
1.在tableView返回行高的代理方法中得到需要計(jì)算高度的內(nèi)容丈秩,通過(guò)字符串對(duì)象的bounding。淳衙。蘑秽。。箫攀。計(jì)算出來(lái)內(nèi)容的矩形大小肠牲,通過(guò)矩形大小得到高度。內(nèi)容的高度+不變的高度靴跛。這就是cell的行高
2.在自定義cell的label的懶加載中缀雳,根據(jù)cell的行高重新計(jì)算label的高度(cell的高度-除去該label以外的高度)
注意:如果要自適應(yīng)高度,一定記得要將行數(shù)設(shè)置為0梢睛;_contentLabel.numberOfLines = 0;
自適應(yīng)高度肥印,本質(zhì)上就是根據(jù)內(nèi)容的高度修改cell的高度
例:
//懶加載
- (UILabel*)contentLabel{
if (!_contentLabel) {
_contentLabel = [[UILabel alloc] initWithFrame:CGRectMake(15, 10, CGRectGetWidth([UIScreen mainScreen].bounds) - 30, 30)];
//如果要自適應(yīng)高度,一定記得要將行數(shù)設(shè)置為0绝葡;
_contentLabel.numberOfLines = 0;
_contentLabel.backgroundColor = [UIColor greenColor];
[self addSubview:_contentLabel];
}
//當(dāng)我們將cell加入到重用池中的時(shí)候竖独,系統(tǒng)不會(huì)幫我們進(jìn)行任何操作,會(huì)將cell原樣放入重用池
//cell在復(fù)用的時(shí)候挤牛,不會(huì)改任何東西,只是重新賦值
//當(dāng)我們每次執(zhí)行該方法的時(shí)候种蘸,說(shuō)明我們?yōu)閘abel的text賦值了墓赴。說(shuō)明我們正在使用Label竞膳,有可能有新的內(nèi)容進(jìn)來(lái),需要重新計(jì)算label的高度
//點(diǎn)的語(yǔ)言體系不一樣诫硕,不能連用
CGRect rect = _contentLabel.frame;
if ((self.frame.size.height - 20) != rect.size.height) {
rect.size.height = self.frame.size.height - 20;
_contentLabel.frame = rect;
}
return _contentLabel;
}
5.宏定義:實(shí)質(zhì)上就是整體替換坦辟,記得加括號(hào)
1.名稱(chēng)必須全部大寫(xiě) 如果想要正常命名 kImage_?Width
2.舉例:
1.#define IMAGE_WIDTH ((CGRectGetWidth([UIScreen mainScreen].bounds) - 80 )/3)
2.#define kImage_Width ((CGRectGetWidth([UIScreen mainScreen].bounds) - 80 )/3)
6.一般將cell中的控件通過(guò)懶加載進(jìn)行控件的初始化
好處:
1.將初始化方法中大部分代碼拆分開(kāi)了。便于我們后期維護(hù)
2.當(dāng)我們需要用到那個(gè)控件的時(shí)候章办,我們調(diào)用該控件的懶加載方法锉走,這個(gè)時(shí)候才會(huì)進(jìn)行初始化;用不到就不用調(diào)用藕届,就不會(huì)初始化挪蹭,節(jié)省了內(nèi)存空間
3.cell一共有三部分組成:左側(cè)的ImageVeiw 中間的contentView 右側(cè)的輔助視圖accessoryView 這三者都是通過(guò)懶加載進(jìn)行初始化操作,所以我們不調(diào)用getter方法休偶,對(duì)應(yīng)的控件就不會(huì)初始化梁厉,就不會(huì)顯示
最后編輯于 :
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者