第十二章 UITableViewCell的自定義
一、自定義Cell
自定義cell的步驟:
1.創建一個類繼承于UITableViewCell
2.實現UITableViewCell的初始化方法:
- (instancetype)initWithStyle:(UITableViewCellStyle*)style reuseIdentifier:(NSString*)reuseIdentifier;
3.確保所有的你想添加的子視圖都在自定義cell的初始化方法中創建,由于UITableView的重用機制,一個cell在第一次創建成功并用于下一次顯示的時候,不會再走初始化方法,這樣可以避免子視圖的重復創建
4.在cell的子視圖創建成功后,將子視圖設置為屬性,類似于UITableViewCell所自帶的textLabel和detailLabel屬性。便于在UITableView的協議中給定義視圖賦值
二、Model類型對象的使用
Model類:主要是為了給我們提供數據,簡單而言即自定義類且繼承于NSObject的稱之為Model。而繼承于UIView的稱之為View類。OC中的KVC就是幫助我們將字典轉換為Model類而存在的
1.設置cell被選中時的樣式:
cell.selectionStyle = UITableViewCellSelectionStyleNone;
UITableViewCellSelectionStyleBlue
UITableViewCellSelectionStyleGray
UITableViewCellSelectionStyleDefault
2.設置文本內容的折行顯示
第一步:獲取要計算高度的內容
NSString* str = self.dataArray[indexPath.row / 2];
第二步:計算文字的高度,計算出來文字的矩形范圍
CGRect rect = [str boundingRectWithSize:(CGSizeMake(CGRectGetWidth([UIScreen mainScreen].bounds) - 30, MAXFLOAT)) options:(NSStringDrawingUsesFontLeading | NSStringDrawingUsesLineFragmentOrigin ) attributes:@{NSFontAttributeName:[UIFont systemFontOfSize:17.0]} context:nil];
參數解釋:
Size:為文字給定一個最大范圍
options:設置計算內容大小的方式
LineFragmentOrigin:將每一行文字都按照矩形來計算,用來計算印刷體文字的大小
FontLeading:計算一行文字大小的時候要將行間距計算在內
attributes:文字的屬性,例如文字的字體、或者是文字的大小
第三步:返回內容的高度:內容的高度 + 上留白 + 下留白。當我們的文字中如果有emoji表情時,列如??,他會比平常文字稍微高一點點,我們為了更精確,多加個2;
return rect.size.height + 10 + 10 + 2;
3.如果當前視圖控制器的父類是tableView,那么self.view == self.tableView,注冊----self.view 和self.tableView 在類中是指的同一個東西,只是返回值類型不同,沒有層級關系
4.cell的自適應高度的步驟
1.在tableView返回行高的代理方法中得到需要計算高度的內容,通過字符串對象的bounding。。。。。計算出來內容的矩形大小,通過矩形大小得到高度。內容的高度+不變的高度。這就是cell的行高
2.在自定義cell的label的懶加載中,根據cell的行高重新計算label的高度(cell的高度-除去該label以外的高度)
注意:如果要自適應高度,一定記得要將行數設置為0;_contentLabel.numberOfLines = 0;
自適應高度,本質上就是根據內容的高度修改cell的高度
例:
//懶加載
- (UILabel*)contentLabel{
if (!_contentLabel) {
_contentLabel = [[UILabel alloc] initWithFrame:CGRectMake(15, 10, CGRectGetWidth([UIScreen mainScreen].bounds) - 30, 30)];
//如果要自適應高度,一定記得要將行數設置為0;
_contentLabel.numberOfLines = 0;
_contentLabel.backgroundColor = [UIColor greenColor];
[self addSubview:_contentLabel];
}
//當我們將cell加入到重用池中的時候,系統不會幫我們進行任何操作,會將cell原樣放入重用池
//cell在復用的時候,不會改任何東西,只是重新賦值
//當我們每次執行該方法的時候,說明我們為label的text賦值了。說明我們正在使用Label,有可能有新的內容進來,需要重新計算label的高度
//點的語言體系不一樣,不能連用
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.宏定義:實質上就是整體替換,記得加括號
1.名稱必須全部大寫 如果想要正常命名 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中的控件通過懶加載進行控件的初始化
好處:
1.將初始化方法中大部分代碼拆分開了。便于我們后期維護
2.當我們需要用到那個控件的時候,我們調用該控件的懶加載方法,這個時候才會進行初始化;用不到就不用調用,就不會初始化,節省了內存空間
3.cell一共有三部分組成:左側的ImageVeiw 中間的contentView 右側的輔助視圖accessoryView 這三者都是通過懶加載進行初始化操作,所以我們不調用getter方法,對應的控件就不會初始化,就不會顯示
最后編輯于 :
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。