您的位置:首页 > 移动开发 > IOS开发

IOS 实现动态分配tablecell高度

2014-01-01 12:14 197 查看
也许你会遇到这样一个问题,或者需要这么一个功能。

表中每个单元格的高度随着该单元格的内容多少而变化。尤其内容不止是文字的时候

其实要实现这个功能很简单。

首先所谓的动态分配单元格高度只是效果上看起来是这样,其实还是跟我们平常设置

单元格高度一样,每行先分配高度。

这里就一个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);

    //这里是为了给单元格高度设置一个最低限度

    return  height;

}

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.text = text;

    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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息