在 4 的 基础上重写 以下的方法 control
#pragma mark - 代理方法 /** 计算单元格行高 */ - (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath { /** 计算行高的方法,会在加载表格数据时,有多少行计算多少次 contentSize 问题:此方法执行的时候,cell还没有被实例化! 但是:行高计算是在实例化cell时,通过设置status属性,计算的=>有了status模型,就可以知道行高! 问题:如何在cell实例化之前,获得行高? 解决方法:通过status可以计算得到行高!=》再建立一个模型,专门计算所有控件的位置 */ HMStatusFrame *statusFrame = [[HMStatusFrame alloc] init]; statusFrame.status = self.statuses[indexPath.row]; return statusFrame.cellHeight; }
HMStatusFrame.h文件
#import <Foundation/Foundation.h> @class HMStatus; /** 专门计算所有控件位置 */ @interface HMStatusFrame : NSObject @property (nonatomic, assign) CGRect iconF; @property (nonatomic, assign) CGRect nameF; @property (nonatomic, assign) CGRect vipF; @property (nonatomic, assign) CGRect textF; @property (nonatomic, assign) CGRect pictureF; /** 行高 */ @property (nonatomic, assign) CGFloat cellHeight; /** 所有控件的尺寸都可以通过Status来计算得出 */ @property (nonatomic, strong) HMStatus *status; @end
m文件
#import "HMStatusFrame.h" #import "HMStatus.h" /** 姓名字体 */ #define kNameFont [UIFont systemFontOfSize:14] /** 正文字体 */ #define kTextFont [UIFont systemFontOfSize:16] @implementation HMStatusFrame - (void)setStatus:(HMStatus *)status { _status = status; // 0. 定义间距 CGFloat padding = 10; // 1. 头像 CGFloat iconX = padding; CGFloat iconY = padding; CGFloat iconW = 30; CGFloat iconH = 30; self.iconF = CGRectMake(iconX, iconY, iconW, iconH); // 2. 姓名大小由文字的长度来决定 // boundingRectWithSize计算给定文本字符串所占的区域 // 返回值是一个x,y = 0的CGRect,w,h是计算好的宽高 // // 如果要计算多行的准确高度,需要传入NSStringDrawingUsesLineFragmentOrigin选项 // dict用于指定字体的相关属性的字典,UIKit框架中的第一个头文件 // context: nil NSDictionary *nameDict = @{NSFontAttributeName: kNameFont}; CGRect nameFrame = [self.status.name boundingRectWithSize:CGSizeMake(MAXFLOAT, MAXFLOAT) options:NSStringDrawingUsesLineFragmentOrigin attributes:nameDict context:nil]; nameFrame.origin.x = CGRectGetMaxX(self.iconF) + padding; nameFrame.origin.y = padding + (self.iconF.size.height - nameFrame.size.height) * 0.5; self.nameF = nameFrame; // vip图标 CGFloat vipX = CGRectGetMaxX(self.nameF) + padding; CGFloat vipY = self.nameF.origin.y; CGFloat vipW = 14; CGFloat vipH = 14; self.vipF = CGRectMake(vipX, vipY, vipW, vipH); // 正文 NSDictionary *textDict = @{NSFontAttributeName: kTextFont}; CGRect textFrame = [self.status.text boundingRectWithSize:CGSizeMake(300, MAXFLOAT) options:NSStringDrawingUsesLineFragmentOrigin attributes:textDict context:nil]; textFrame.origin.x = padding; textFrame.origin.y = CGRectGetMaxY(self.iconF) + padding; self.textF = textFrame; if (self.status.picture.length > 0) { // 配图 CGFloat pictureX = padding; CGFloat pictureY = CGRectGetMaxY(textFrame) + padding; CGFloat pictureW = 100; CGFloat pictureH = 100; self.pictureF = CGRectMake(pictureX, pictureY, pictureW, pictureH); self.cellHeight = CGRectGetMaxY(self.pictureF) + padding; } else { self.cellHeight = CGRectGetMaxY(self.textF) + padding; } } @end
时间: 2024-10-06 23:24:16