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,很明显是有间隙的
怎么做呢!有很多方法,这里我觉得最简单的便是拦截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;