用TableView的个人总结

1、tableView的边距
2、tableView的常用方法
3、cell的重用机制
4、 自定义cell的方法
5、 计算不同cell的高度

TableView应该是非常常用的控件之一,要熟练运用!下面是一些开发过程中的小积累。 如果一个界面需要用到两个tableView,那么这两个表视图的数据源和代理可以给一个控制器, 用的时候,只要判断就好了
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
    
    if (tableView == self.tableView) { // 左边的类别表格
        
        return self.types.count;
    }else { // 右边的用户表格
        
        return self.users.count;
    }
    
}
  • 这个属性很好用, 可以调整tableview的边距(显示位置)
// 设置inset
    self.automaticallyAdjustsScrollViewInsets = NO;
    self.tableView.contentInset = UIEdgeInsetsMake(64, 0, 0, 0);
    self.userTableView.contentInset = UIEdgeInsetsMake(64, 0, 0, 0);
  • tableView的常用方法和属性

一、 两个必须实现的方法, 必须实现数据源协议喔

/** 每一组显示多少个cell, 没有分组当然就默认一组咯 */
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section;

/** 创建cell的方法 */
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath;

二、 选中cell调用

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath;
  • cell 的常用方法和属性
    一、 说道cell那么就说下cell的重用
// 因为每滑动一次,这里都要调用一次,所有用static就只会调用一次了,作为标记
  static NSString *ID = @"status";
  
  UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:ID];
  if (!cell) {
      // 如果闲置池里面没有就自己创建
      cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:nil];
  }
return cell;

二、很多时候我们需要自定义cell来满足自己的需求, 可以在storyboard中自定义也可以在xib中自定义

  • storyboard中给cell一个标识, 用到cell的时候直接去缓冲池里面找
static NSString *ID = @"deal";
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:ID];
return cell;
  • xib自定义cell, 也需要给cell一个标识,用的时候先注册,再使用
[self.tableView registerNib:[UINib nibWithNibName:NSStringFromClass([BSRecommendTypeTableViewCell class]) bundle:nil] forCellReuseIdentifier:typeCell];
 // 在缓存池中读取
  BSRecommendTypeTableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:typeCell];

return cell;
  • 加载xib的时候我们可以重写这个方法监听选中或取消选中
// 重写selected方法, 可以监听cell的选中和取消选中
- (void)setSelected:(BOOL)selected animated:(BOOL)animated {
    [super setSelected:selected animated:animated];

    /**
     *  这个指示器什么时候隐藏呢,没有点击的时候隐藏
     */
    self.seletedIndicator.hidden = !selected;

    self.textLabel.textColor = selected ? BSColor(219, 21, 26) : BSColor(78, 78, 78);
}
  • 加载xib会来这个方法, 可以在这里做些事情
// 创建xib的时候调用该方法
- (void)awakeFromNib {
    // 背景颜色
    self.backgroundColor = BSColor(244, 244, 244);
 
    self.seletedIndicator.backgroundColor = BSColor(219, 21, 26);
}
  • 重新布局子控件, 复写layoutSubviews
// 布局子控件
- (void)layoutSubviews {
    [super layoutSubviews];
    
    self.textLabel.y = 2;
    self.textLabel.height = self.contentView.height - 2 *self.textLabel.y;
}


我们有时候需要这样的cell,很明显是有间隙的
Snip20160513_1.png

怎么做呢!有很多方法,这里我觉得最简单的便是拦截frame,灰色的就是一个背景图片,如果高度变成 1 不就是分割线了么!


// 重写frame拦截尺寸
- (void)setFrame:(CGRect)frame {
    
    // 左右的空隙
    frame.origin.x = 10;
    
    frame.size.width -= 2 * frame.origin.x;
    
    // 不用添加任何控件,实现分割线
    frame.size.height -= 10;
    
    // 调用父类要写在后面
    [super setFrame:frame];
 
}

计算不同cell的高度, cell中的内容是丰富多彩的,那么计算高度,要知道每个内容的不同高度来决定cell的高度。下面是根据文字的高度,得到cell的高度

// 文字的最大尺寸
        CGSize maxSize = CGSizeMake([UIScreen mainScreen].bounds.size.width - 4 * BSTopicCellMargin, MAXFLOAT);
        
        CGFloat textH = [self.text boundingRectWithSize:maxSize options:NSStringDrawingUsesLineFragmentOrigin attributes:@{NSFontAttributeName : [UIFont systemFontOfSize:12]} context:nil].size.height;

你可能感兴趣的:(用TableView的个人总结)