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

来源:互联网 发布:mac windows双系统切换 编辑:程序博客网 时间:2024/05/21 22:45

最近在自定义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高度乱套了。





0 0
原创粉丝点击