也许你会遇到这样一个问题,或者需要这么一个功能。
表中每个单元格的高度随着该单元格的内容多少而变化。尤其内容不止是文字的时候
其实要实现这个功能很简单。
首先所谓的动态分配单元格高度只是效果上看起来是这样,其实还是跟我们平常设置
单元格高度一样,每行先分配高度。
这里就一个demo来说说吧
要实现这个功能其实最重要的就是下面的两个方法
1、//设置行高
- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
{
NSString *text = .......;
//这里的text具体内容就是你要在单元格上显示的内容
CGSize constraint = CGSizeMake(300, 2000.f);
//先设置一个约束,这个是为了在宽度一定的时候计算text内容所占视图的大小
//高度尽量设的大一下,因为你不确定text具体内容有多少
CGSize size= [text sizeWithFont:[UIFont systemFontOfSize:14] constrainedToSize:constraint lineBreakMode:NSLineBreakByClipping];
//这里利用NSString的一个方法来计算text所占大小,
//感谢NSString为我们封装了这个方法,使得这个功能得以实现
CGFloat height = MAX(size.height,40.0f);
}
2、//配置每个单元
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
UILabel *textLabel = nil;
//先创建一个用于显示文字的label,当然也可以用其他的,
static NSString *cellIndentifier = @"indentifier";
//为单元格创建一个专属标签
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:cellIndentifier];
//先搜索缓冲区看有没有专属标签的cell
if (cell == nil) {
//如果没有那么就创建一个
cell = [[UITableViewCell alloc]initWithStyle:UITableViewCellStyleDefault reuseIdentifier:cellIndentifier];
//把标签初始化
textLabel = [[UILabel alloc]initWithFrame:CGRectZero];
textLabel.font = [UIFont systemFontOfSize:14];
textLabel.tag = 1;
//这里设置tag值以便以后调用
//将label添加到cell
[[cell contentView]addSubview:textLabel];
}
NSString *text = ......;
//同上面的
CGSize constraint = CGSizeMake(300, 2000.f);
CGSize size= [text sizeWithFont:[UIFont systemFontOfSize:14] constrainedToSize:constraint lineBreakMode:NSLineBreakByClipping];
if (!textLabel) {
textLabel = (UILabel *)[cell viewWithTag:1];
}
textLabel.frame = CGRectMake(10, 10, 300, size.height);
//通过text内容所占size的设置label所显示在的区域
return cell;
}
功能核心也就是以上两个方法,是不是很简单?当然这只是纯文字,要是还混合有图片呢?
其实原理是一样的,UIImage 也有个属性 size ,说了这个你应该就知道该怎么办了吧?
好了就到这里,后面附上我做的一个关于图片的demo,若是还不懂可以跟我讨论一下。
表中每个单元格的高度随着该单元格的内容多少而变化。尤其内容不止是文字的时候
其实要实现这个功能很简单。
首先所谓的动态分配单元格高度只是效果上看起来是这样,其实还是跟我们平常设置
单元格高度一样,每行先分配高度。
这里就一个demo来说说吧
要实现这个功能其实最重要的就是下面的两个方法
1、//设置行高
- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
{
NSString *text = .......;
//这里的text具体内容就是你要在单元格上显示的内容
CGSize constraint = CGSizeMake(300, 2000.f);
//先设置一个约束,这个是为了在宽度一定的时候计算text内容所占视图的大小
//高度尽量设的大一下,因为你不确定text具体内容有多少
CGSize size= [text sizeWithFont:[UIFont systemFontOfSize:14] constrainedToSize:constraint lineBreakMode:NSLineBreakByClipping];
//这里利用NSString的一个方法来计算text所占大小,
//感谢NSString为我们封装了这个方法,使得这个功能得以实现
CGFloat height = MAX(size.height,40.0f);
//这里是为了给单元格高度设置一个最低限度
}
2、//配置每个单元
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
UILabel *textLabel = nil;
//先创建一个用于显示文字的label,当然也可以用其他的,
static NSString *cellIndentifier = @"indentifier";
//为单元格创建一个专属标签
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:cellIndentifier];
//先搜索缓冲区看有没有专属标签的cell
if (cell == nil) {
//如果没有那么就创建一个
cell = [[UITableViewCell alloc]initWithStyle:UITableViewCellStyleDefault reuseIdentifier:cellIndentifier];
//把标签初始化
textLabel = [[UILabel alloc]initWithFrame:CGRectZero];
textLabel.font = [UIFont systemFontOfSize:14];
textLabel.tag = 1;
//这里设置tag值以便以后调用
//将label添加到cell
[[cell contentView]addSubview:textLabel];
}
NSString *text = ......;
//同上面的
CGSize constraint = CGSizeMake(300, 2000.f);
CGSize size= [text sizeWithFont:[UIFont systemFontOfSize:14] constrainedToSize:constraint lineBreakMode:NSLineBreakByClipping];
if (!textLabel) {
textLabel = (UILabel *)[cell viewWithTag:1];
}
//如果label是空的那就通过tag值调用
textLabel.frame = CGRectMake(10, 10, 300, size.height);
//通过text内容所占size的设置label所显示在的区域
return cell;
}
功能核心也就是以上两个方法,是不是很简单?当然这只是纯文字,要是还混合有图片呢?
其实原理是一样的,UIImage 也有个属性 size ,说了这个你应该就知道该怎么办了吧?
好了就到这里,后面附上我做的一个关于图片的demo,若是还不懂可以跟我讨论一下。
这是这个demo的截图,可以看一下效果
这个demo的链接:http://download.csdn.net/detail/u012884714/6795293
自己遇到了这个问题,然后查资料实现了这个功能,在这里跟大家分享了 —— LC