@SanMao
2015-08-05T16:34:28.000000Z
字数 2842
阅读 1542
UI
---每一个cell的高度并非都一样
@interface XMGStatus : NSObject/**** 文字\图片数据 ****/// ...../**** frame数据 ****//** 头像的frame */@property (nonatomic, assign) CGRect iconFrame;// ...../** cell的高度 */@property (nonatomic, assign) CGFloat cellHeight;@end
- (CGFloat)cellHeight{if (_cellHeight == 0) {// ... 计算所有子控件的frame、cell的高度}return _cellHeight;}
/*** 返回每一行cell的具体高度*/- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath{XMGStatus *status = self.statuses[indexPath.row];return status.cellHeight;}
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{static NSString *ID = @"tg";// 访问缓存池XMGStatusCell *cell = [tableView dequeueReusableCellWithIdentifier:ID];// 设置数据(传递模型数据)cell.status = self.statuses[indexPath.row];return cell;}
UITableViewCell的子类,比如XMGStatusCell
@interface XMGStatusCell : UITableViewCell@end
-initWithStyle:reuseIdentifier:方法
/*** 在这个方法中添加所有的子控件*/- (instancetype)initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(NSString *)reuseIdentifier{if (self = [super initWithStyle:style reuseIdentifier:reuseIdentifier]) {// ......}return self;}
@class XMGStatus;@interface XMGStatusCell : UITableViewCell/** 团购模型数据 */@property (nonatomic, strong) XMGStatus *status;@end
- (void)setStatus:(XMGStatus *)status{_status = status;// .......}
-layoutSubviews方法[super layoutSubviews]
/*** 在这个方法中设置所有子控件的frame*/- (void)layoutSubviews{[super layoutSubviews];// ......}

// 告诉tableView所有cell的真实高度是自动计算(根据设置的约束来计算)self.tableView.rowHeight = UITableViewAutomaticDimension;// 告诉tableView所有cell的估算高度self.tableView.estimatedRowHeight = 44;
- (void)awakeFromNib{// 手动设置文字的最大宽度(目的是:让label知道自己文字的最大宽度,进而能够计算出自己的frame)self.text_label.preferredMaxLayoutWidth = [UIScreen mainScreen].bounds.size.width - 20;}
// 告诉tableView所有cell的估算高度(设置了估算高度,就可以减少tableView:heightForRowAtIndexPath:方法的调用次数)self.tableView.estimatedRowHeight = 200;
XMGStatusCell *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根据文字多少计算出自己最真实的尺寸)[self layoutIfNeeded];// 计算cell的高度if (self.status.picture) {return CGRectGetMaxY(self.pictureImageView.frame) + 10;} else {return CGRectGetMaxY(self.text_label.frame) + 10;}}