1.获取文字尺寸的方法
单行文字:
NSDictionary *nameAttr = @{NSFontAttributeName : [UIFont systemFontOfSize:15]}; //将文字的字体大小等存入字典
CGSize nameSize = [self.phoneModel.name sizeWithAttributes:nameAttr]; //通过字典提供的属性信息计算得到文字的尺寸
CGFloat text_LabelW = nameSize.width; //取得文字宽度
CGFloat text_LabelH = nameSize.width; //取得文字高度
self.text_Label.frame = CGRectMake(text_LabelX, text_LabelY, text_LabelW, text_LabelH); //设置frame
多行文字:
text_Label.numberOfLines = 0; //设置自动换行
CGFloat text_LabelW = self.contentView.frame.size.width - 2 * space; //设置文本的宽度
CGSize textSize = CGSizeMake(text_LabelW, MAXFLOAT); //设置一个用来装文本的尺寸
CGFloat text_LabelH = [self.text boundingRectWithSize:textSize options:NSStringDrawingUsesLineFragmentOrigin attributes:text_LabelAttr context:nil].size.height; //通过字体大小和文字框的尺寸得到文本的高度
self.text_Label.frame = CGRectMake(text_LabelX, text_LabelY, text_LabelW, text_LabelH); //设置frame
2.设置不等高cell的方法
在数据模型或者其他模型中计算好各个控件的frame,并在其.h文件中添加CGRect属性存储各个frame和CGFloat属性存储cell高度,在控制器的heightForRowAtIndexPath方法和cell类的layoutSubviews中调用这些属性。
例:
/** 模型类中 定义接口属性:*/
@property (strong, nonatomic) NSString *name;
@property (strong, nonatomic) NSString *icon;
@property (strong, nonatomic) NSString *text;
@property (assign, nonatomic ,getter=isVip) BOOL vip;
@property (strong, nonatomic) NSString *image;
@property (assign, nonatomic) CGRect nameFrame;
@property (assign, nonatomic) CGRect iconFrame;
@property (assign, nonatomic) CGRect textFrame;
@property (assign, nonatomic) CGRect vipFrame;
@property (assign, nonatomic) CGRect imageFrame;
@property (assign, nonatomic) CGFloat cellHeight;
/** 模型类中 实现方法,在其中计算好各个子控件的frame和cellHeight的值 */
-(CGFloat)cellHeight
{
CGFloat space = 10;
CGFloat iconViewX = space;
CGFloat iconViewY = space;
CGFloat iconViewWH = 30;
self.iconFrame = CGRectMake(iconViewX, iconViewY, iconViewWH, iconViewWH);
CGFloat nameLabelX = iconViewX + iconViewWH + space;
CGFloat nameLabelY = space;
NSDictionary *nameAttr = @{NSFontAttributeName : nameFont};
CGSize nameSize = [self.name sizeWithAttributes:nameAttr];
CGFloat nameLabelW = nameSize.width;
CGFloat nameLabelH = nameSize.height;
self.nameFrame = CGRectMake(nameLabelX, nameLabelY, nameLabelW, nameLabelH);
if (self.isVip ) {
CGFloat vipViewX = CGRectGetMaxX(self.nameFrame) + space;
CGFloat vipViewWH = 14;
CGFloat vipViewY = nameLabelY + (nameLabelH - vipViewWH) * 0.5;
self.vipFrame = CGRectMake(vipViewX, vipViewY, vipViewWH, vipViewWH);
}
CGFloat text_LabelX = space;
CGFloat text_LabelY = CGRectGetMaxY(self.iconFrame) + space;
CGFloat text_LabelW = [UIScreen mainScreen].bounds.size.width - 2 * space;
CGSize textSize = CGSizeMake(text_LabelW, MAXFLOAT);
NSDictionary *text_LabelAttr = @{NSFontAttributeName : textFont};
CGFloat text_LabelH = [self.text boundingRectWithSize:textSize options:NSStringDrawingUsesLineFragmentOrigin attributes:text_LabelAttr context:nil].size.height;
self.textFrame = CGRectMake(text_LabelX, text_LabelY, text_LabelW, text_LabelH);
CGFloat cellHeight = 0;
if (![self.image isEqualToString:@“”]) {
CGFloat imageWH = 100;
CGFloat imageX = iconViewX;
CGFloat imageY = CGRectGetMaxY(self.textFrame) + space;
self.imageFrame = CGRectMake(imageX, imageY, imageWH, imageWH);
cellHeight = CGRectGetMaxY(self.imageFrame) + space;
} else {
cellHeight = CGRectGetMaxY(self.textFrame) + space;
}
return cellHeight;
}
/** 自定义的UITableViewCell类中 通过layoutSubviews方法调用模型中的各个frame属性布局子控件 */
-(void)layoutSubviews
{
[super layoutSubviews];
self.iconView.frame = self.phoneModel.iconFrame;
self.nameLabel.frame = self.phoneModel.nameFrame;
self.vipView.frame = self.phoneModel.vipFrame;
self.text_Label.frame = self.phoneModel.textFrame;
self.image_View.frame = self.phoneModel.imageFrame;
}
/** 控制器中 通过heightForRowAtIndexPath:方法获取模型中的cellHeight传递给tableView */
-(CGFloat) tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
{
phoneModel *tempModel = self.phoneModels[indexPath.row];
return tempModel.cellHeight;
}