设置UITableViewCell高度的问题

有非常多时候。UITableViewCell每行的高度是不固定的,须要动态设置。

UITableView有个代理方法,

-(CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath{
    return ((CZWeiboFrame*)[self.weiboFrames objectAtIndex:indexPath.row]).rowHeight;

}

有的会想在这里先获取cell。然后过去cell的高度再返回,可是这是不可行的,由于上述方法会在

下述方法之前运行。

-(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{

    CZWeiboFrame *model = self.weiboFrames[indexPath.row] ;

    static NSString *identifer = @"weibo";
    CZWeiboCell *cell = [tableView dequeueReusableCellWithIdentifier:identifer];
    if(cell == nil){
        cell  = [[CZWeiboCell alloc ] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:identifer];

    }
    cell.weiboFrame = model;

    return cell;
}

也就是说在你获取cell之前必须先设置cell的高度。

那么该怎么做呢。那就得在你给cell设置数据时,如今数据模型中计算出高度。

以下是上述代码中CZWeiboViewCell模型的结构

@interface CZWeiboFrame : NSObject

@property   (nonatomic,strong) CZWeibo *weibo;
@property   (nonatomic,assign,readonly) CGRect iconFrame;
@property   (nonatomic,assign,readonly) CGRect textFrame;
@property   (nonatomic,assign,readonly) CGRect nameFrame;
@property   (nonatomic,assign,readonly) CGRect pictureFrame;
@property   (nonatomic,assign,readonly) CGRect vipFrame;
@property (nonatomic,assign,readonly) CGFloat rowHeight;

@end

当中weibo是每行要显示的数据。row height是行高,其余是cell中每一个控件的frame,在weibo的set方法中计算frame

-(void)setWeibo:(CZWeibo *)weibo{
    _weibo = weibo;

    CGFloat margin = 10;
    CGFloat iconW = 35;
    CGFloat iconH = 35;
    CGFloat iconX = margin;
    CGFloat iconY = margin;
    _iconFrame = CGRectMake(iconX, iconY, iconW, iconH);

    CGFloat nameX = CGRectGetMaxX(_iconFrame)+margin;
    //依据Labele中文字的内容动态计算大小
    //头文件NSAttributString
    NSDictionary *attr = @{NSFontAttributeName:nameFont};
    CGSize nameSize = [self sizeWithText:_weibo.name size:CGSizeMake(MAXFLOAT, MAXFLOAT) font:nameFont];
    CGFloat nameW = nameSize.width;
    CGFloat nameH = nameSize.height;
    CGFloat nameY = iconY + (iconH - nameH)/2;

   _nameFrame  = CGRectMake(nameX, nameY, nameW, nameH);

    CGFloat vipW = 10;
    CGFloat vipH = 10;
    CGFloat vipX = CGRectGetMaxX(_nameFrame)+margin;
    CGFloat vipY = iconY +(iconH - vipH)/2;
    _vipFrame = CGRectMake(vipX, vipY, vipW, vipH);

    CGFloat textX = iconX;
    CGFloat textY = CGRectGetMaxY(_iconFrame)+margin;
    CGSize s = CGSizeMake([[UIScreen mainScreen] bounds].size.width - margin*2, MAXFLOAT);
    CGSize textSize = [self sizeWithText:weibo.text size:s font:textFont];

    _textFrame = CGRectMake(textX, textY, textSize.width, textSize.height);

    CGFloat picW = 200;
    CGFloat picH = 200;
    CGFloat picX = iconX;
    CGFloat picY = CGRectGetMaxY(_textFrame)+margin;
    _pictureFrame = CGRectMake(picX, picY, picW, picH)  ;

    _rowHeight = 0;
    if(self.weibo.picture){
        _rowHeight = CGRectGetMaxY(_pictureFrame)+margin;
    }else{
        _rowHeight = CGRectGetMaxY(_textFrame)+margin;
    }
}
///获取字符串的size
-(CGSize) sizeWithText:(NSString *) text size:(CGSize) size font:(UIFont *)font{
    NSDictionary *dict = @{NSFontAttributeName:font };
    CGSize sz = [text boundingRectWithSize:size options:NSStringDrawingUsesLineFragmentOrigin attributes:dict context:nil].size;
    return sz;
}

然后我们就能给每一行设置高度了

-(CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath{
    return ((CZWeiboFrame*)[self.weiboFrames objectAtIndex:indexPath.row]).rowHeight;<span style="font-family: Arial, Helvetica, sans-serif;">   </span>
}
时间: 2024-08-03 03:32:31

设置UITableViewCell高度的问题的相关文章

转:动态计算UITableViewCell高度详解

转自:http://www.cocoachina.com/industry/20140604/8668.html 不知道大家有没有发现,在iOS APP开发过程中,UITableView是我们显示内容常见的控件,本人觉得它是UIKit中最复杂的一个控件.今天要向大家介绍的就是如何动态计算UITableViewCell高度的一经验与技巧,在此做一些总结方便朋友们查阅.为了不让讲解空洞抽象,我还是用代码实例的方式进行讲解,这样更容易接收与学习. 本文将介绍四种情况下UITableViewCell的计

uitableviewcell高度自适应笔记

今天看了几篇uitableviewcell高度自适应的文章,大体分为两种方式. 第一种方式,cell里面有label,在cellforrow绘制的时候计算Label的可能高度,并且在此时重新计算cell的高度,然后在heightforrow的时候返回这个cell新的高度.也就是说这些cell全部是计算出来的,根据里面的label的高度(label为contentView).http://blog.csdn.net/swingpyzf/article/details/18093959 第二种方式是

动态计算UITableViewCell高度详解 (转)

感觉挺有用的一篇文章,分析了4种解决方案.回头测试之.如果有别的方案,我会在后面补上. 原文地址:http://www.ifun.cc/blog/2014/02/21/dong-tai-ji-suan-uitableviewcellgao-du-xiang-jie/ 不知道大家有没有发现,在iOS APP开发过程中,UITableView是我们显示内容常见的控件,本人觉得它是UIKit中最复杂的一个控件.今天要向大家介绍的就是如何动态计算UITableViewCell高度的一经验与技巧,在此做一

优化UITableViewCell高度计算的那些事

本文转载至 http://blog.sunnyxx.com/2015/05/17/cell-height-calculation/ 我是前言 这篇文章是我和我们团队最近对 UITableViewCell 利用 AutoLayout 自动高度计算和 UITableView 滑动优化的一个总结.我们也在维护一个开源的扩展,UITableView+FDTemplateLayoutCell,让高度计算这个事情变的前所未有的简单,也受到了很多星星的支持,github链接请戳我 这篇总结你可以读到: UIT

《转》优化UITableViewCell高度计算的那些事

我是前言 这篇文章是我和我们团队最近对 UITableViewCell 利用 AutoLayout 自动高度计算和 UITableView 滑动优化的一个总结.我们也在维护一个开源的扩展,UITableView+FDTemplateLayoutCell,让高度计算这个事情变的前所未有的简单,也受到了很多星星的支持,github链接请戳我 这篇总结你可以读到: UITableView高度计算和估算的机制 不同iOS系统在高度计算上的差异 iOS8 self-sizing cell UITableV

UITableViewCell 高度计算从混沌初始到天地交泰

[原创]UITableViewCell 高度计算从混沌初始到天地交泰 本文主要基予iOS UITableViewCell 高度自适应计算问题展开陈述,废话少说直入正题: UITableView控件可能是iOS中大家最常用的控件了(滚动视图.cell重用.卡顿优化),今天要讨论的不是这些高大上的话题,今天的话题只是cell高度的计算. * 传统frame布局下UITableViewCell 高度计算 * AutoLayout下UITableViewCell高度计算(iOS6.7) * UITabl

UITableViewCell高度自适应的关键点

iOS开发中对于UITableViewCell高度自适应的文章已经很多很多,但如果cell内容比较复杂,刚使用autolayout配置自使用时还是总不能一次性成功. KEY POINT 这里只说设置的关键一点: Cell内部的Constraints一定要有一条从Cell顶部到底部的一条可联通线. 图例列表: Paste_Image.png Paste_Image.png Paste_Image.png 最后顶部元素居上和底部元素距底部,加上约束即可.这条线上可以有固定高度的元素,可以有自适应高度

[转]优化UITableViewCell高度计算的那些事

我是前言 这篇文章是我和我们团队最近对 UITableViewCell 利用 AutoLayout 自动高度计算和 UITableView 滑动优化的一个总结.我们也在维护一个开源的扩展,UITableView+FDTemplateLayoutCell,让高度计算这个事情变的前所未有的简单,也受到了很多星星的支持,github链接请戳我 这篇总结你可以读到: UITableView高度计算和估算的机制 不同iOS系统在高度计算上的差异 iOS8 self-sizing cell UITableV

优化UITableViewCell高度计算的那些事 by --胡 xu

这篇总结你可以读到: UITableView高度计算和估算的机制 不同iOS系统在高度计算上的差异 iOS8 self-sizing cell UITableView+FDTemplateLayoutCell如何用一句话解决高度问题 UITableView+FDTemplateLayoutCell中对RunLoop的使用技巧 UITableViewCell高度计算 rowHeight UITableView是我们再熟悉不过的视图了,它的 delegate 和 data source 回调不知写了