美文网首页
cell的等高与不等高

cell的等高与不等高

作者: LHsunshine | 来源:发表于2017-08-03 09:52 被阅读0次

    自定义等高的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;   

               }

    }

    相关文章

      网友评论

          本文标题:cell的等高与不等高

          本文链接:https://www.haomeiwen.com/subject/exvulxtx.html