cell的等高与不等高

自定义等高的cell

等高的cell

所有cell的高度是一样的


纯代码创建

frame

1,新建一个继承自UITableViewCell的子类,比如XMGTgCell

@interfaceTgCell:UITableViewCell

@end

2,在TgCell.m文件中

重写-initWithStyle:reuseIdentifier:方法

在这个方法中添加所有需要显示的子控件

给子控件做一些初始化设置(设置字体、文字颜色等)

/**

*  在这个方法中添加所有的子控件

*/

- (instancetype)initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(NSString*)reuseIdentifier{

            if(self= [superinitWithStyle:style reuseIdentifier:reuseIdentifier]) {

            // ......

             }

 return  self;

}

重写-layoutSubviews方法

一定要调用[super layoutSubviews]

在这个方法中计算和设置所有子控件的frame

/**

*  在这个方法中计算所有子控件的frame

*/

- (void)layoutSubviews{  

           [superlayoutSubviews];

          // ......

}

3,在TgCell.h文件中提供一个模型属性,比如Tg模型

@classTg;

@interfaceTgCell:UITableViewCell/** 团购模型数据 */

@property(nonatomic,strong) Tg *tg;

@end

4,在TgCell.m中重写模型属性的set方法

在set方法中给子控件设置模型数据

- (void)setTg:(Tg *)tg{  

            _tg = tg;

            // .......

}

5,在控制器中

注册cell的类型

[self.tableViewregisterClass:[TgCell class] forCellReuseIdentifier:ID];

给cell传递模型数据

- (UITableViewCell*)tableView:(UITableView*)tableView cellForRowAtIndexPath:(NSIndexPath*)indexPath{

              // 访问缓存池

              TgCell *cell = [tableView dequeueReusableCellWithIdentifier:ID];

// 设置数据(传递模型数据)

              cell.tg=self.tgs[indexPath.row];

               return cell;

}

XIB

新建一个继承自UITableViewCell的子类,比如TgCell

@interfaceTgCell:UITableViewCell

@end

新建一个xib文件(文件名最好跟类名一致,比如TgCell.xib)

修改cell的class为TgCell

绑定循环利用标识

添加子控件,设置子控件约束

将子控件连线到类扩展中

@interfaceTgCell()

@property(weak,nonatomic)IBOutletUIImageView*iconImageView;

@property(weak,nonatomic)IBOutletUILabel*titleLabel;

@property(weak,nonatomic)IBOutletUILabel*priceLabel;

@property(weak,nonatomic)IBOutletUILabel*buyCountLabel;

@end

在TgCell.h文件中提供一个模型属性,比如Tg模型

@classTg;

@interfaceTgCell:UITableViewCell/** 团购模型数据 */

@property(nonatomic,strong) Tg *tg;

@end

在TgCell.m中重写模型属性的set方法

在set方法中给子控件设置模型数据

- (void)setTg:(Tg *)tg{  

         _tg = tg; 

         // .......

}

在控制器中

注册xib文件

[self.tableViewregisterNib:[UINibnibWithNibName:NSStringFromClass([XMGTgCell class]) bundle:nil] forCellReuseIdentifier:ID];

给cell传递模型数据

- (UITableViewCell*)tableView:(UITableView*)tableView cellForRowAtIndexPath:(NSIndexPath*)indexPath{// 访问缓存池

        TgCell *cell = [tableView dequeueReusableCellWithIdentifier:ID];// 设置数据(传递模型数据)

        cell.tg=self.tgs[indexPath.row];

       returncell;

}

storyBoard

基本上与XIB一致,当在缓存池中没有找到数据,会自动去storyboard当中去寻找,注意在要设置 identify否则在缓存池中会找不到这数据




不等高cell


纯代码创建

frame

一.给模型增加frame数据

所有子控件的frame

cell的高度

@interfaceStatus: NSObject  

 /**** 文字\图片数据 ****/

// .....

/**** frame数据 ****/

/** 头像的frame */

@property(nonatomic, assign) CGRect iconFrame;  

  // .....

/** cell的高度 */

@property(nonatomic, assign) CGFloat cellHeight;

@end

二.重写模型cellHeight属性的get方法

-(CGFloat)cellHeight{

        if(_cellHeight== 0){

        //...计算所有子控件的frame、cell的高度 

        }   

return  _cellHeight;

}

三.在控制器中

实现一个返回cell高度的代理方法

在这个方法中返回indexPath位置对应cell的高度

/**

*  返回每一行cell的具体高度

*/

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

        Status *status =self.statuses[indexPath.row];

        return  status.cellHeight;

}


四. 给cell传递模型数据

- (UITableViewCell*)tableView:(UITableView*)tableView cellForRowAtIndexPath:(NSIndexPath*)indexPath{

             staticNSString*ID =@"tg";

             // 访问缓存池

             StatusCell *cell = [tableView dequeueReusableCellWithIdentifier:ID];

             // 设置数据(传递模型数据)

             cell.status =self.statuses[indexPath.row];

             returncell;

}

五 新建一个继承自UITableViewCell的子类,比如StatusCell

@interfaceStatusCell: UITableViewCell

@end

六 在StatusCell.m文件中

重写-initWithStyle:reuseIdentifier:方法

      在这个方法中添加所有需要显示的子控件

      给子控件做一些初始化设置(设置字体、文字颜色等)

/**

*  在这个方法中添加所有的子控件

*/

- (instancetype)initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(NSString*)reuseIdentifier{

             if(self= [superinitWithStyle:style reuseIdentifier:reuseIdentifier]) {

            // ......

             }

return  self;

}

七 在StatusCell.h文件中提供一个模型属性,比如Tg模型

@class Status;

@interface StatusCell : UITableViewCell

/* 团购模型数据/

@property (nonatomic, strong) Status *status;

@end

- 八 在TgCell.m中重写模型属性的set方法- 在set方法中给子控件设置模型数据

- (void)setStatus:(Status*)status{ 

             _status= status;

            // .......

}

九 重写-layoutSubviews方法

一定要调用[super layoutSubviews]

在这个方法中设置所有子控件的frame

/**

*  在这个方法中设置所有子控件的frame

*/

- (void)layoutSubviews{ 

            [superlayoutSubviews];

            // ......

}

storyBoard创建

对比自定义等高cell,需要几个额外的步骤(iOS8开始才支持)

添加子控件和contentView之间的间距约束

设置tableViewCell的真实行高和估算行高

// 告诉tableView所有cell的真实高度是自动计算(根据设置的约束来计算)

self.tableView.rowHeight = UITableViewAutomaticDimension;    

 // 告诉tableView所有cell的估算高度

self.tableView.estimatedRowHeight =44;

根据文段最后底部结尾,可以利用autolayout的约束进行控制,

设置与底部的长度的约束,如果是图片的话,要想不显示图片,可以利用约束控制这图片的大小,注意如果是label的话,控制大小成线也会有些影响.

if(status.picture) {  // 有配图

self.pictureHeight.constant =100;

self.pictureBottom.constant =10;

self.pictureImageView.image = [UIImageimageNamed:status.picture];   

}else{    // 没有配图

self.pictureHeight.constant =0;// 设置图片高度为0

self.pictureBottom.constant =0;// 设置图片底部间距为0

}

如果要支持iOS8之前

一.如果cell内部有自动换行的label,需要设置preferredMaxLayoutWidth属性

- (void)awakeFromNib{

              // 手动设置文字的最大宽度(目的是:让label知道自己文字的最大宽度,进而能够计算出自己的frame)

               self.text_label.preferredMaxLayoutWidth = [UIScreen mainScreen].bounds.size.width-20;

}

二.设置tableView的cell估算高度

// 告诉tableView所有cell的估算高度(设置了估算高度,就可以减少tableView:heightForRowAtIndexPath:方法的调用次数)

     self.tableView.estimatedRowHeight =200;

三在代理方法中计算cell的高度

StatusCell *cell;

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

          // 创建一个cell(cell的作用:根据模型数据布局所有的子控件,进而计算出cell的高度)

          if(!cell) {     

          cell = [tableView dequeueReusableCellWithIdentifier:ID]; 

            }

           // 设置模型数据

           cell.status =self.statuses[indexPath.row];

           return cell.height;

}

- (CGFloat)height{

           // 强制布局cell内部的所有子控件(label根据文字多少计算出自己最真实的尺寸)

           [selflayoutIfNeeded];

           // 计算cell的高度

           if(self.status.picture) {

                      returnCGRectGetMaxY(self.pictureImageView.frame) +10;   

           }else{

                   return CGRectGetMaxY(self.text_label.frame) +10;   

           }

}

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 162,158评论 4 370
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 68,600评论 1 307
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 111,785评论 0 254
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 44,655评论 0 220
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 53,075评论 3 295
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 41,002评论 1 225
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 32,146评论 2 318
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,918评论 0 211
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,671评论 1 250
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,838评论 2 254
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,318评论 1 265
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,636评论 3 263
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,343评论 3 244
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,187评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,982评论 0 201
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 36,126评论 2 285
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,934评论 2 279

推荐阅读更多精彩内容

  • 概述在iOS开发中UITableView可以说是使用最广泛的控件,我们平时使用的软件中到处都可以看到它的影子,类似...
    liudhkk阅读 8,841评论 3 38
  • UITableViewCell控件空间构造 cell的子控件是contentView,contentView的子控...
    CoderZXS阅读 645评论 0 1
  • 我们在上一篇《通过代码自定义不等高cell》中学习了tableView的相关知识,本文将在上文的基础上,利用sto...
    啊世ka阅读 1,440评论 2 7
  • UITableViewCell 父类是UIView UITableView的每一行都是一个UITableViewC...
    翻这个墙阅读 6,413评论 0 1
  • 自定义等高的cell 等高的cell 所有cell的高度是一样的 纯代码创建 frame 1,新建一个继承自UIT...
    iOS_Cqlee阅读 317评论 0 3