|在开发中我们经常会用到 UITableViewCell 或者UICollectionCell 来展示列表, 现在问题来了, 怎么实现cell 或者 item 的高度根据内容的多少来确定呢.这里提供一种解决方法.给cell或者 item的model 添加一个字段来标记cell 或者item的高度.
步骤一 具体代码如下:其中model 中的字段 为其添加一个 (rowHeight) 来标记行高
@interface SKTotalFinishModel : NSObject
@property (nonatomic, copy) NSString * subjectName; // 科目名称
@property (nonatomic, copy) NSString * subjectCode; // 科目code
@property (nonatomic, copy) NSString * createDate; // 日期
@property (nonatomic, copy) NSString * finishStatus; //0.未做完 1.已做完
@property (nonatomic, copy) NSString * paperId; // 试卷id
@property (nonatomic, copy) NSString * questionNum; // 题目数量
@property (nonatomic, copy) NSString * rightRate; // 正确率
@property (nonatomic, copy) NSString * title; // 标题
@property (nonatomic, copy) NSString * useTime; // 用时 单位 s
@property (nonatomic, assign) float rowHeight; // 行高度
@end
步骤二 UITableViewDelegate 协议方法 一定要实现 下面这个代理方法就是给cell 或者 item 预设一个高度
- (CGFloat)tableView:(UITableView *)tableView estimatedHeightForRowAtIndexPath:(NSIndexPath *)indexPath
{
return 20;
}
步骤三 给cell 或者item 添加一个model 属性(根据model 来给cell 或者 item 上的标签赋值)
@interface SKFinishCell : UITableViewCell
@property (nonatomic, strong) SKTotalFinishModel * finishModel;
@end
步骤四 重写setModel 方法, 在里面计算 cell 或 item 的高度, 给model.rowHeight 赋值 (注意: 用XIB拖拽的cell 或者 item, 需要根据frame确定的高度的空间, frame不能写死)
- (void)setFinishModel:(SKTotalFinishModel *)finishModel{
_finishModel = finishModel;
self.firstLabel.text = [_finishModel.subjectName substringToIndex:1];
self.titleLabel.text = [NSString stringWithFormat:@" %@",_finishModel.title];
NSString * rightStr = [NSString stringWithFormat:@"%2f%@",_finishModel.rightRate.doubleValue * 100,@"%"];
self.rightRateLabel.text = [NSString stringWithFormat:@"%@%@",[rightStr componentsSeparatedByString:@"."][0],@"%"];
self.timeLabel.text = [NSString stringWithFormat:@"用时%@",[commonTools getTimeStr:_finishModel.useTime]];
self.infoLabel.text = [self getInfoStr:_finishModel.createDate andQuestionNum:_finishModel.questionNum];
// 这个是xib定制cell,所以界面需要重新布局后, 然后确定cell 的高度
[self.contentView layoutIfNeeded];
finishModel.rowHeight = self.infoLabel.mj_y + self.infoLabel.mj_h + 15;
// finishModel.rowHeight = self.infoLabel..frame.size.height + 15; // 或者使用这种方式
}
步骤五 重新回到 UITableViewDelegate 协议中
- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath{
NSDictionary * dic = self.sectionDataArr[indexPath.section];
NSArray * arr = dic[@"detailsArr"];
SKTotalFinishModel * model = arr[indexPath.row];
return model.rowHeight; // 返回计算的高度
}
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{
NSDictionary * dic = self.sectionDataArr[indexPath.section];
NSArray * arr = dic[@"detailsArr"];
SKTotalFinishModel * model = arr[indexPath.row];
SKFinishCell * finishCell = [tableView dequeueReusableCellWithIdentifier:SKFinishCellID forIndexPath:indexPath];
finishCell.finishModel = model; // 给cell的model 赋值
finishCell.selectionStyle = UITableViewCellSelectionStyleNone;
return finishCell;
}
| 至此, cell或者item 的高度根据内容来确定, 就写完了. 同样, 点赞也一样.给Model 添加相应的字段就可以了.
注意: 用XIB拖拽的cell 或者 item, 需要根据frame确定的高度的空间, frame不能写死