[关闭]
@SanMao 2015-08-06T00:34:28.000000Z 字数 2842 阅读 1363

自定义不等高的cell

UI

---每一个cell的高度并非都一样

纯代码方式

frame

给模型增加frame数据
  1. @interface XMGStatus : NSObject
  2. /**** 文字\图片数据 ****/
  3. // .....
  4. /**** frame数据 ****/
  5. /** 头像的frame */
  6. @property (nonatomic, assign) CGRect iconFrame;
  7. // .....
  8. /** cell的高度 */
  9. @property (nonatomic, assign) CGFloat cellHeight;
  10. @end
  1. - (CGFloat)cellHeight
  2. {
  3. if (_cellHeight == 0) {
  4. // ... 计算所有子控件的frame、cell的高度
  5. }
  6. return _cellHeight;
  7. }
在控制器中
  1. /**
  2. * 返回每一行cell的具体高度
  3. */
  4. - (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
  5. {
  6. XMGStatus *status = self.statuses[indexPath.row];
  7. return status.cellHeight;
  8. }
  1. - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
  2. {
  3. static NSString *ID = @"tg";
  4. // 访问缓存池
  5. XMGStatusCell *cell = [tableView dequeueReusableCellWithIdentifier:ID];
  6. // 设置数据(传递模型数据)
  7. cell.status = self.statuses[indexPath.row];
  8. return cell;
  9. }
新建一个继承自UITableViewCell的子类,比如XMGStatusCell
  1. @interface XMGStatusCell : UITableViewCell
  2. @end
在XMGStatusCell.m文件中
  1. /**
  2. * 在这个方法中添加所有的子控件
  3. */
  4. - (instancetype)initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(NSString *)reuseIdentifier
  5. {
  6. if (self = [super initWithStyle:style reuseIdentifier:reuseIdentifier]) {
  7. // ......
  8. }
  9. return self;
  10. }
在XMGStatusCell.h文件中提供一个模型属性,比如XMGTg模型
  1. @class XMGStatus;
  2. @interface XMGStatusCell : UITableViewCell
  3. /** 团购模型数据 */
  4. @property (nonatomic, strong) XMGStatus *status;
  5. @end
在XMGTgCell.m中重写模型属性的set方法
  1. - (void)setStatus:(XMGStatus *)status
  2. {
  3. _status = status;
  4. // .......
  5. }
重写-layoutSubviews方法
  1. /**
  2. * 在这个方法中设置所有子控件的frame
  3. */
  4. - (void)layoutSubviews
  5. {
  6. [super layoutSubviews];
  7. // ......
  8. }

Autolayout

xib方式

storyboard方式

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

  1. // 告诉tableView所有cell的真实高度是自动计算(根据设置的约束来计算)
  2. self.tableView.rowHeight = UITableViewAutomaticDimension;
  3. // 告诉tableView所有cell的估算高度
  4. self.tableView.estimatedRowHeight = 44;
如果要支持iOS8之前
  1. - (void)awakeFromNib
  2. {
  3. // 手动设置文字的最大宽度(目的是:让label知道自己文字的最大宽度,进而能够计算出自己的frame)
  4. self.text_label.preferredMaxLayoutWidth = [UIScreen mainScreen].bounds.size.width - 20;
  5. }
  1. // 告诉tableView所有cell的估算高度(设置了估算高度,就可以减少tableView:heightForRowAtIndexPath:方法的调用次数)
  2. self.tableView.estimatedRowHeight = 200;
  1. XMGStatusCell *cell;
  2. - (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
  3. {
  4. // 创建一个cell(cell的作用:根据模型数据布局所有的子控件,进而计算出cell的高度)
  5. if (!cell) {
  6. cell = [tableView dequeueReusableCellWithIdentifier:ID];
  7. }
  8. // 设置模型数据
  9. cell.status = self.statuses[indexPath.row];
  10. return cell.height;
  11. }
  12. - (CGFloat)height
  13. {
  14. // 强制布局cell内部的所有子控件(label根据文字多少计算出自己最真实的尺寸)
  15. [self layoutIfNeeded];
  16. // 计算cell的高度
  17. if (self.status.picture) {
  18. return CGRectGetMaxY(self.pictureImageView.frame) + 10;
  19. } else {
  20. return CGRectGetMaxY(self.text_label.frame) + 10;
  21. }
  22. }
添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注