ios-UI基礎(chǔ)控件-UITbleViewCell的自定義(cell高度自適應(yīng)封裝)

火焰 是我最喜歡的玩具篙螟!

UITableVie 中系統(tǒng)的Cell共提供了四種默認(rèn)樣式, 分別是:
UITableVieCellStyleDefault
UITableVieCellStyleValue1
UITableVieCellStyleValue2
UITableVieCellStyleSubtitle
實(shí)際我們往往需要的是更為復(fù)雜或者專門效果展示所以需要按照要求去自己定義cell

自定義cell步驟

  • 1.創(chuàng)建一個(gè)繼承于UITableViewCell的類
  • 2.實(shí)現(xiàn)UITableVieCell的初始化方法:
- (instancetype)initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(NSString *)reuseIdentifier
{
    if (self = [super initWithStyle:style reuseIdentifier:reuseIdentifier]) {
        _imageLabel = [[UIImageView alloc] initWithFrame:CGRectZero];
        [self.contentView addSubview:_imageLabel];
        _titleLabel = [[UILabel alloc] initWithFrame:CGRectZero];
        _titleLabel.numberOfLines = 0;
        [self.contentView addSubview:_titleLabel];
    }
    return self;
}
  • 3.確保所有的你想添加的子視圖都在自定義Cell的初始化方法中創(chuàng)建,由于UITableView 的重用機(jī)制, 一個(gè)Cell在第 一次創(chuàng)建成功并于下一 次顯示的時(shí)候,不會(huì)再去走初始化方法,這樣可以避免子視圖的重復(fù)創(chuàng)建寒跳。
  • 4.在Cell的子視圖創(chuàng)建成功后,將子視圖設(shè)置為屬性,類似于UITableViewCell所自帶的 text Label和detailTextLabel屬性劣光。便于在UITableView 的協(xié)議中給自定義視圖賦值。
@interface SecondTableViewCell : UITableViewCell
@property (nonatomic, strong) UILabel *titleLabel;
@property (nonatomic, strong) UIImageView *imageLabel;
@property (nonatomic, strong) SecondModel *secondModel;
@end

多種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ù)中有圖片類型有文字類型)
Model *model = [self.tableArray objectAtIndex:indexPath.row];
//根據(jù)model屬性劃分
if (model.type == 0) {
      FirstTableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:firstIdentify];
      return cell;
 }
 if (model.type == 1) { 
      SecondTableViewCell *cell = [tableView
  dequeueReusableCellWithIdentifier:secondIdentify]; return cell;
}
  • 固定的行顯示的Cell類型不一樣
// 第?一?行顯?示第?一種Cell
if (indexPath.row == 0) {
      FirstTableViewCell *cell = [tableViewdequeueReusableCellWithIdentifier:firstIdentify];
 return cell; 
}
// 第?二?行顯?示第?二種Cell
if (indexPath.row == 1) {
     SecondTableViewCell *cell = [tableViewdequeueReusableCellWithIdentifier:secondIdentify];
 return cell;
 }    

布控子視圖方法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)更改為TableView設(shè)定的大小 ,這樣就方便布局

- (void)layoutSubviews
{
    //賦值
    _imageLabel.image = [UIImage imageNamed:_secondModel.picUrl];
    _titleLabel.text = _secondModel.title;
    
    //取圖片和標(biāo)簽的高度
    CGFloat labelH = [CalculateTool heightForLabel:_secondModel.title];
    CGFloat imageH = [CalculateTool heightForImage:_secondModel.picUrl];
    
    //設(shè)置frame
    _imageLabel.frame = CGRectMake(0, 0, [UIScreen mainScreen].bounds.size.width*2/3, imageH);
    _titleLabel.frame = CGRectMake(CGRectGetMaxX(_imageLabel.frame), 0, [UIScreen mainScreen].bounds.size.width/3, labelH);
    
}

Model的使用

  • Model類主要是為了給我們提供數(shù)據(jù),簡(jiǎn)單的說(shuō)就是定義類且繼承于NSObject的稱之為Model椅棺。 繼承于UIView 的稱之為View 類。
  • 現(xiàn)在我們的數(shù)據(jù)提供都是存放在數(shù)組和字典中,OC中的KVC就是幫助我們將字典轉(zhuǎn)換為Model類而存在的偿凭。

創(chuàng)建步驟:
1. 創(chuàng)建一個(gè)類并繼承于NSObject
2. 添加和字典中對(duì)應(yīng)的屬性 (根據(jù)數(shù)據(jù)處理)
3. 在視圖控制器中將字典通過(guò)KVC為Model賦值
4. 將Model對(duì)象添加到數(shù)組中并刷新TableView

#import <Foundation/Foundation.h>

@interface SecondModel : NSObject
@property (nonatomic, strong) NSString *title;
@property (nonatomic, strong) NSString *picUrl;
- (instancetype)initWithDic:(NSDictionary *)dic;
+ (instancetype)secondModelWithDic:(NSDictionary *)dic;
@end

#import "SecondModel.h"

@implementation SecondModel
- (instancetype)initWithDic:(NSDictionary *)dic
{
    if (self = [super init]) {
        [self setValuesForKeysWithDictionary:dic];
    }
    return self;
}

+ (instancetype)secondModelWithDic:(NSDictionary *)dic
{
    return [[SecondModel alloc] initWithDic:dic];
}

- (void)setValue:(id)value forUndefinedKey:(NSString *)key
{
    
}
@end

封裝一個(gè)自適應(yīng)高度方法實(shí)現(xiàn)兩個(gè)功能

  • 文本自適應(yīng)高度:根據(jù)文本的內(nèi)容設(shè)定Label的高度
  • 圖片的高度適應(yīng):根據(jù)圖片的寬度進(jìn)行等比例縮放
    建一個(gè)工具類GetHeightTool:繼承于NSObject
#import <Foundation/Foundation.h>
#import <UIKit/UIKit.h>

@interface CalculateTool : NSObject
+ (CGFloat)heightForLabel:(NSString *)text;
+ (CGFloat)heightForImage:(NSString *)imageName;
@end
#import "CalculateTool.h"

@implementation CalculateTool
+ (CGFloat)heightForLabel:(NSString *)text
{
    //計(jì)算字符串所占的大小
    CGRect rect = [text boundingRectWithSize:CGSizeMake([UIScreen mainScreen].bounds.size.width/3, 10000) options:NSStringDrawingUsesLineFragmentOrigin attributes:@{NSFontAttributeName:[UIFont systemFontOfSize:17]} context:nil];
    return rect.size.height;
}


+ (CGFloat)heightForImage:(NSString *)imageName
{
    if (imageName) {
        UIImage *image = [UIImage imageNamed:imageName];
        CGFloat width = image.size.width;
        CGFloat height = image.size.height;
        return height / width * ([UIScreen mainScreen].bounds.size.width);
    }
    return 0;
}
@end
boundingRectWithSize的接口說(shuō)明
  • 傳入?yún)?shù):
    參數(shù)1: 你需要展示的文字
    參數(shù)2: 你需要的字體類型一般就是給大小
    參數(shù)3: 你定義的Label的寬也就是要在多寬的地方展示文字
  • 返回值
    返回值就是自適應(yīng)的高度
封裝接口說(shuō)明
  • 傳入?yún)?shù)
    heightForLabel:label上字符串的名字(NSString類型)
    heightForImage:ImageView上照片的名字(NSString類型)

使用場(chǎng)景

- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
{

    SecondModel *model = _dataArray[indexPath.row];
    //文字高度
    CGFloat labelH = [CalculateTool heightForLabel:model.title];
    //圖片高度
    CGFloat imageH = [CalculateTool heightForImage:model.picUrl];
    CGFloat length = labelH + 20 +imageH;
    return length;
    
}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末产弹,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子弯囊,更是在濱河造成了極大的恐慌痰哨,老刑警劉巖,帶你破解...
    沈念sama閱讀 219,490評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件匾嘱,死亡現(xiàn)場(chǎng)離奇詭異斤斧,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)霎烙,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,581評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門撬讽,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人悬垃,你說(shuō)我怎么就攤上這事游昼。” “怎么了尝蠕?”我有些...
    開(kāi)封第一講書(shū)人閱讀 165,830評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵烘豌,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我趟佃,道長(zhǎng)扇谣,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,957評(píng)論 1 295
  • 正文 為了忘掉前任闲昭,我火速辦了婚禮罐寨,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘序矩。我一直安慰自己鸯绿,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,974評(píng)論 6 393
  • 文/花漫 我一把揭開(kāi)白布簸淀。 她就那樣靜靜地躺著瓶蝴,像睡著了一般。 火紅的嫁衣襯著肌膚如雪租幕。 梳的紋絲不亂的頭發(fā)上舷手,一...
    開(kāi)封第一講書(shū)人閱讀 51,754評(píng)論 1 307
  • 那天,我揣著相機(jī)與錄音劲绪,去河邊找鬼男窟。 笑死盆赤,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的歉眷。 我是一名探鬼主播牺六,決...
    沈念sama閱讀 40,464評(píng)論 3 420
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼汗捡!你這毒婦竟也來(lái)了淑际?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 39,357評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤扇住,失蹤者是張志新(化名)和其女友劉穎春缕,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體艘蹋,經(jīng)...
    沈念sama閱讀 45,847評(píng)論 1 317
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡淡溯,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,995評(píng)論 3 338
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了簿训。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,137評(píng)論 1 351
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡米间,死狀恐怖强品,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情屈糊,我是刑警寧澤的榛,帶...
    沈念sama閱讀 35,819評(píng)論 5 346
  • 正文 年R本政府宣布,位于F島的核電站逻锐,受9級(jí)特大地震影響夫晌,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜昧诱,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,482評(píng)論 3 331
  • 文/蒙蒙 一晓淀、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧盏档,春花似錦凶掰、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 32,023評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至稚配,卻和暖如春畅涂,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背道川。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,149評(píng)論 1 272
  • 我被黑心中介騙來(lái)泰國(guó)打工午衰, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留立宜,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,409評(píng)論 3 373
  • 正文 我出身青樓苇经,卻偏偏與公主長(zhǎng)得像赘理,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子扇单,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,086評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容