关于UITableViewCell 自适应内容高度时的注意点

本文介绍了一种自定义UITableViewCell的方法,使其高度能够根据内容变化而变化。通过计算UILabel中字符串的实际高度来动态调整cell的高度,并讨论了在不同iOS版本中的实现方式。此外,还解决了在多section情况下因复用cell引发的高度混乱问题。

最近在自定义UITableViewCell时,由于cell的高度需要随里面的内容文字的改变而改变,这也是网上很多关于可变高度的cell的实现点,关键在于如何获取可变UILabel的高度,实现如下(IOS7):

- (CGFloat)heigtOfLabelFromString:(NSString *)text labelWidth:(CGFloat)width
{
    CGSize constraint = CGSizeMake(width, 20000.0f);
    NSAttributedString *attributedText = [[NSAttributedString alloc]initWithString:text attributes:@{NSFontAttributeName:[UIFont systemFontOfSize:15]}];
    CGRect rect = [attributedText boundingRectWithSize:constraint options:NSStringDrawingUsesLineFragmentOrigin
                   context:nil];
    CGSize size = rect.size;
    return size.height;
}

IOS7之前版本则使用这个方法获取size:

CGSize requiredSize = [cell.myLabel.text sizeWithFont:[UIFont systemFontOfSize:15] constrainedToSize:boundSize lineBreakMode:UILineBreakModeWordWrap];

这样在获取到size后就可以将高度设置为cell的高度了。而对cell的初始化如下:

static NSString *cellId=@"cell";
NoticeTableViewCell *cell = (NoticeTableViewCell*)[tableView dequeueReusableCellWithIdentifier:cellId];
if (!cell) {
            cell = [[NoticeTableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:cellId];
 }
cell.contentLabel.text =[itemArray objectAtIndex:[indexPath row]];

但是实践后发现,当出现多个section,但每个section里面的cell样式都是同一个时,由于使用的是重用机制,如果每个section里面都重用同一个cell,那么问题就来了,当快速向上向下来回滑动并使某几个cell出现又消失时,整个table的cell就乱套了,某些cell的高度就变成了邻近cell的高度。这样整体就乱了。可能本人技术不给力的原因,导致检查了很久都找不出原因,后来才找出原因,当有多个section时,如果还是重用cell的话,一个section里面的cell同样会被其他section的cell 重用,这样导致本来在当前显示的section里cell高度可能是正确的但是其他的section里那些在同样位置但是没有显示在当前屏幕的cell就会重用之前正在显示的cell高度,导致乱套。貌似表达有点乱,还望有高人正确转述下意思。

鉴于此原因,后来将不同section的cell分开初始化和重用,当然采用不同的identifier,这样问题就解决了。不管再用多快的速度滑动也没有cell高度乱套了。





评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值