UITableVie 中系統(tǒng)的Cell共提供了四種默認(rèn)樣式, 分別是:
UITableVieCellStyleDefault
UITableVieCellStyleValue1
UITableVieCellStyleValue2
UITableVieCellStyleSubtitle
實(shí)際我們往往需要的是更為復(fù)雜或者專門(mén)效果展示所以需要按照要求去自己定義cell
自定義Cell步驟:
1.創(chuàng)建一個(gè)繼承于UITableViewCell的類(lèi)
-
2.實(shí)現(xiàn)UITableVieCell的初始化方法:
- (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所自帶的 text Label和detailTextLabel屬性廉白。便于在UITableView 的協(xié)議中給自定義視圖賦值括堤。
多種Cell可以混合使用:
一個(gè)重用標(biāo)識(shí)符只能針對(duì)于一種Cell樣式,不同的Cell樣式需要基于不同的重用標(biāo)識(shí)符來(lái)進(jìn)行區(qū)分, 重用標(biāo)識(shí)符的區(qū)分需要根據(jù)不同的情況來(lái)劃分, 如:
- model屬性劃分(不同的數(shù)據(jù)內(nèi)容, 如 一個(gè)數(shù)據(jù)中有圖片類(lèi)型有文字類(lèi)型)
- 固定的行顯示的Cell類(lèi)型不一樣
布控子視圖方法LayoutSubviews的調(diào)用場(chǎng)景
- 當(dāng)前視圖添加到父視圖的時(shí)候
- 當(dāng)前視圖的大小發(fā)變化的時(shí)候
- 切換橫豎屏
- ScrollView 滾動(dòng)的時(shí)候
一般 ,Cell在創(chuàng)建的時(shí)候的fame 是(0,0,320,44), 我們給定的Cell的 度 般都會(huì) 于這個(gè) 。因此:在自定義Cell中創(chuàng)建的子視圖的frame為CGRectZero。在Cell添加到TableView上的時(shí)候才會(huì)給子視圖設(shè)置frame(即LayoutSubviews方法中),Cell 添加到TableView 的時(shí)候其大小已經(jīng)更改為T(mén)ableView設(shè)定的大小 ,這樣就方便布局。
Model的使用:
- Model類(lèi)主要是為了給我們提供數(shù)據(jù),簡(jiǎn)單的說(shuō)就是定義類(lèi)且繼承于NSObject的稱之為Model。 繼承于UIView 的稱之為View 類(lèi)搭伤。
- 現(xiàn)在我們的數(shù)據(jù)提供都是存放在數(shù)組和字典中,OC中的KVC就是幫助我們將字典轉(zhuǎn)換為Model類(lèi)而存在的。
創(chuàng)建步驟:
- 創(chuàng)建一個(gè)類(lèi)并繼承于NSObject
- 添加和字典中對(duì)應(yīng)的屬性 (根據(jù)數(shù)據(jù)處理)
- 在視圖控制器中將字典通過(guò)KVC為Model賦值
- 將Model對(duì)象添加到數(shù)組中并刷新TableView
封裝一個(gè)自適應(yīng)高度方法實(shí)現(xiàn)兩個(gè)功能
- 文本自適應(yīng)高度:根據(jù)文本的內(nèi)容設(shè)定Label的高度
- 圖片的高度適應(yīng):根據(jù)圖片的寬度進(jìn)行等比例縮放
建一個(gè)工具類(lèi)GetHeightTool:繼承于NSObject
代碼
#import <UIKit/UIKit.h> //這個(gè)框架要引入因?yàn)槲覀円眠@些類(lèi)
@interface GetHeightTool : NSObject
// 聲明兩個(gè)方法
+ (CGFloat)getHeightForText:(NSString *)textShow
font:(UIFont *)fontShow
width:(CGFloat)widthShow;
+ (CGFloat)getHeightForImage:(NSString *)iamgeName
width:(CGFloat)widthShow;
@end
// 實(shí)現(xiàn)部分
// 傳入的三個(gè)參數(shù)
// 參數(shù)1: 你需要展示的文字 參數(shù)2: 你需要的字體類(lèi)型一般就是給大小 參數(shù)3: 你定義的Label的寬也就是要在多寬的地方展示文字
// 返回值就是你想要的高度
+ (CGFloat)getHeightForText:(NSString *)textShow
font:(UIFont *)fontShow
width:(CGFloat)widthShow
{
// 參數(shù)1:
return [textShow boundingRectWithSize:CGSizeMake(widthShow, 10000000) options:(NSStringDrawingUsesLineFragmentOrigin) attributes:@{NSFontAttributeName:fontShow} context:nil].size.height;
}
// 傳入?yún)?shù) (可以根據(jù)情況去傳參)
// 參數(shù)1: 傳入照片的名字
// 參數(shù)2: 你想要展示的照片寬度
+ (CGFloat)getHeightForImage:(NSString *)iamgeName
width:(CGFloat)widthShow
{
// 按照比例去壓縮或者放大
return widthShow / [UIImage imageNamed:iamgeName].size.width * [UIImage imageNamed:iamgeName].size.height;
}
這個(gè)就是一個(gè)簡(jiǎn)單的自適應(yīng)效果,Label的高度會(huì)根據(jù)要顯示的內(nèi)容去調(diào)整, 寬度固定為屏幕的一半.