Cell等高

storyboard自定义cell

  • 1.创建一个继承自UITableViewCell的子类,比如RYJDealCell
  • 2.在storyboard中
    • 往cell里面增加需要用到的子控件
    • 设置cell的重用标识
    • 设置cell的class为RYJDealCell
  • 3.在控制器中(C)

    • 利用重用标识找到cell
    • 给cell传递模型数据

      -(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
      
      static NSString *ID = @"deal";
      RYJDealCell *cell = [tableView dequeueReusableCellWithIdentifier:ID];
      // 取出模型数据
      cell.deal = self.deals[indexPath.row];
      return cell;
      }
      
  • 4.在RYJDeals中(M)详见MVC章节model篇
  • 5.在RYJDealCell中(V)
    • 将storyboard中的子控件连线到类扩展中
    • 需要提供一个模型属性,重写模型的set方法,在这个方法中设置模型数据到子控件上
      //.h
      @class RYJDeals;
      @interface RYJDealCell : UITableViewCell
      @property (nonatomic, strong) RYJDeals *deal;
      @end
      //.m
      @interface RYJDealCell()
      @property (weak, nonatomic) IBOutlet UIImageView *iconImageView;
      @property (weak, nonatomic) IBOutlet UILabel *titleLabel;
      @property (weak, nonatomic) IBOutlet UILabel *priceLabel;
      @property (weak, nonatomic) IBOutlet UILabel *buycountLabel;
      @end
      @implementation RYJDealCell
      -(void)setDeal:(RYJDeals *)deal {
      _deal = deal;
      //设置数据
      self.iconImageView.image = [UIImage imageNamed:deal.icon];
      self.titleLabel.text = deal.title;
      self.priceLabel.text = [NSString stringWithFormat:@"%@$",deal.price];
      self.buycountLabel.text = deal.price; 
      }
      

xib自定义cell

  • 1.创建一个继承自UITableViewCell的子类,比如RYJDealCell
  • 2.创建一个xib文件(文件名建议跟cell的类名一样),比如RYJDealCell.xib
    • 拖拽一个UITableViewCell出来
    • 修改cell的class为RYJDealCell
    • 设置cell的重用标识
    • 往cell中添加需要用到的子控件
  • 3.在控制器中

    • 利用registerNib...方法注册xib文件 (此方法为TableView性能优化章节cell的循环利用方式2)
       UINib *nib = [UINib nibWithNibName:NSStringFromClass([XMGDealCell class]) bundle:nil];
      [self.tableView registerNib:nib forCellReuseIdentifier:@"deal"];
      
    • 利用重用标识找到cell(如果没有注册xib文件,就需要手动去加载xib文件)(此方法为TableView性能优化章节cell的循环利用方式2)

      static NSString *ID = @"deal";
      RYJDealCell *cell = [tableView dequeueReusableCellWithIdentifier:ID];
      if (cell == nil) {
          cell = [[[NSBundle mainBundle] loadNibNamed:NSStringFromClass([RYJDealCell class]) owner:nil options:nil] lastObject];
      }
      return cell;
      
    • 给cell传递模型数据

      - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
      // 创建cell
      XMGDealCell *cell = [XMGDealCell cellWithTableView:tableView];
      // 取出模型数据
      cell.deal = self.deals[indexPath.row];
      return cell;
      }
      
  • 4.在RYJDealCell中
    • 将xib中的子控件连线到类扩展中
    • 需要提供一个模型属性,重写模型的set方法,在这个方法中设置模型数据到子控件上
    • 也可以将创建获得cell的代码封装起来(比如cellWithTableView:方法)
      //RYJDealCell.h
       + (instancetype)cellWithTableView:(UITableView *)tableView;
      //RYJDealCell.m
      + (instancetype)cellWithTableView:(UITableView *)tableView
      {
      static NSString *ID = @"deal";
      XMGDealCell *cell = [tableView dequeueReusableCellWithIdentifier:ID];
      if (cell == nil) {
          cell = [[[NSBundle mainBundle] loadNibNamed:NSStringFromClass([XMGDealCell class]) owner:nil options:nil] lastObject];
      }
      return cell;
      }
      

代码自定义cell(使用frame)

  • 1.创建一个继承自UITableViewCell的子类,比如RYJDealCell
  • 在initWithStyle:reuseIdentifier:方法中

    • 添加子控件

      // 1.在initWithStyle:reuseIdentifier:方法中添加子控件
      -(instancetype)initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(NSString *)reuseIdentifier
      {
      if (self = [super initWithStyle:style reuseIdentifier:reuseIdentifier]) {
        UIImageView *iconView = [[UIImageView alloc] init];
        [self.contentView addSubview:iconView];
        self.iconView = iconView;
      
        UILabel *titleLabel = [[UILabel alloc] init];
        [self.contentView addSubview:titleLabel];
        self.titleLabel = titleLabel;
      }
      return self;
      }
      
  • 在layoutSubviews方法中设置子控件的frame
    • 设置子控件的初始化属性(比如文字颜色、字体)
      // 2.在layoutSubviews方法中设置子控件的frame
      -(void)layoutSubviews
      {
      [super layoutSubviews];
      CGFloat contentH = self.contentView.frame.size.height;
      CGFloat contentW = self.contentView.frame.size.width;
      CGFloat margin = 10;
      CGFloat iconX = margin;
      CGFloat iconY = margin;
      CGFloat iconW = 100;
      CGFloat iconH = contentH - 2 * iconY;
      self.iconView.frame = CGRectMake(iconX, iconY, iconW, iconH);
      }
      
  • 需要提供一个模型属性,重写模型的set方法,在这个方法中设置模型数据到子控件
    // 3.重写模型的set方法
    -(void)setDeal:(XMGDeal *)deal
    {
    _deal = deal; 
    // 设置数据
    self.iconView.image = [UIImage imageNamed:deal.icon];
    self.titleLabel.text = deal.title;
    }
    
  • 2.在控制器中
    • 利用registerClass...方法注册RYJDealCell类
    • 利用重用标识找到cell(如果没有注册类,就需要手动创建cell)
    • 给cell传递模型数据
    • 也可以将创建获得cell的代码封装起来(比如cellWithTableView:方法)

代码自定义cell(使用autolayout)

  • 1.创建一个继承自UITableViewCell的子类,比如RYJDealCell
    • 在initWithStyle:reuseIdentifier:方法中
      • 添加子控件
    • 在layoutSubviews方法中
      • 添加子控件的约束(建议使用Masonry
      • 设置子控件的初始化属性(比如文字颜色、字体)
    • 需要提供一个模型属性,重写模型的set方法,在这个方法中设置模型数据到子控件
  • 2.在控制器中
    • 利用registerClass...方法注册RYJDealCell类
    • 利用重用标识找到cell(如果没有注册类,就需要手动创建cell)
    • 给cell传递模型数据
    • 也可以将创建获得cell的代码封装起来(比如cellWithTableView:方法)