从这里http://www.cnblogs.com/liandwufan/p/4516956.html?utm_source=tuicool 转载过来的

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

{

//

static NSString * cellid = @"PayMentTableViewCell";

PayMentTableViewCell * cell = [tableView dequeueReusableCellWithIdentifier:cellid];

if( !cell )

{

cell = [[[NSBundle mainBundle] loadNibNamed:cellid owner:self options:nil] lastObject];

}

[cell refresh:[eventArray objectAtIndex:indexPath.row]];

[cell setNeedsUpdateConstraints];

[cell updateConstraintsIfNeeded];

return cell;

}

#pragma mark -

#pragma mark table view delegate methods

- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath

{

// 判断indexPath对应cell的重用标示符,

static NSString *reuseIdentifier =@"PayMentTableViewCell";

// 从cell字典中取出重用标示符对应的cell。如果没有,就创建一个新的然后存储在字典里面。

// 警告:不要调用table view的dequeueReusableCellWithIdentifier:方法,因为这会导致cell被创建了但是又未曾被tableView:cellForRowAtIndexPath:方法返回,会造成内存泄露!

PayMentTableViewCell *cell = [offscreenCells objectForKey:reuseIdentifier];

if (!cell)

{

cell = [[[NSBundle mainBundle] loadNibNamed:reuseIdentifier owner:self options:nil] lastObject];

[offscreenCells setObject:cell forKey:reuseIdentifier];

[cell refresh:[eventArray objectAtIndex:indexPath.row]];

}

// 用indexPath对应的数据内容来配置cell,例如:

// cell.textLabel.text = someTextForThisCell;

// ...

// 确保cell的布局约束被设置好了,因为它可能刚刚才被创建好。

// 使用下面两行代码,前提是假设你已经在cell的updateConstraints方法中设置好了约束:

[cell setNeedsUpdateConstraints];

[cell updateConstraintsIfNeeded];

// 将cell的宽度设置为和tableView的宽度一样宽。

// 这点很重要。

// 如果cell的高度取决于table view的宽度(例如,多行的UILabel通过单词换行等方式),

// 那么这使得对于不同宽度的table view,我们都可以基于其宽度而得到cell的正确高度。

// 但是,我们不需要在-[tableView:cellForRowAtIndexPath]方法中做相同的处理,

// 因为,cell被用到table view中时,这是自动完成的。

// 也要注意,一些情况下,cell的最终宽度可能不等于table view的宽度。

// 例如当table view的右边显示了section index的时候,必须要减去这个宽度。

cell.bounds = CGRectMake(0.0f, 0.0f, CGRectGetWidth(tableView.bounds), CGRectGetHeight(cell.bounds));

// 触发cell的布局过程,会基于布局约束计算所有视图的frame。

// (注意,你必须要在cell的-[layoutSubviews]方法中给多行的UILabel设置好preferredMaxLayoutWidth值;

// 或者在下面2行代码前手动设置!)

[cell setNeedsLayout];

[cell layoutIfNeeded];

// 得到cell的contentView需要的真实高度

CGFloat height = [cell.contentView systemLayoutSizeFittingSize:UILayoutFittingCompressedSize].height;

// 要为cell的分割线加上额外的1pt高度。因为分隔线是被加在cell底边和contentView底边之间的。

height += 1.0f;

return height;

}

// 注意:除非行高极端变化并且你已经明显的觉察到了滚动时滚动条的“跳跃”现象,你才需要实现此方法;否则,直接用tableView的estimatedRowHeight属性即可。

- (CGFloat)tableView:(UITableView *)tableView estimatedHeightForRowAtIndexPath:(NSIndexPath *)indexPath

{

// 以必需的最小计算量,返回一个实际高度数量级之内的估算行高。

// 例如:

return 200;

}

//在自定义UITableViewCell 类中 添加函数

- (void)layoutSubviews

{

[super layoutSubviews];

_remarkLab.preferredMaxLayoutWidth = self.contentView.frame.size.width - (10+40+2+34+(25+15));

_placeLab.preferredMaxLayoutWidth = _remarkLab.preferredMaxLayoutWidth;

[super layoutSubviews];

}

preferredMaxLayoutWidth的值网上的方法都是不对的,我这里用了自己的方法来实现。

以上是第一种方法,我的系统版本是 8.1   上面的是可以正常显示的,低于8的系统版本没有尝试

////////// ////////// ////////// ////////// ////////// ////////// ////////// ////////// ////////// /////////

这种方法同样在ios8系统里面是OK的,在heightForRowAtIndexPath  里面有一个8以及8以下的区分 需要注意,

#import "MainViewController.h"

#import "TableViewCellA.h"

#import "QuoteTableViewCell.h"

#define SYSTEM_VERSION                              ([[UIDevice currentDevice] systemVersion])

#define SYSTEM_VERSION_GREATER_THAN_OR_EQUAL_TO(v)  ([SYSTEM_VERSION compare:v options:NSNumericSearch] != NSOrderedAscending)

#define IS_IOS8_OR_ABOVE                            (SYSTEM_VERSION_GREATER_THAN_OR_EQUAL_TO(@"8.0"))

@interface MainViewController ()<UITableViewDataSource,UITableViewDelegate>

{

TableViewCellA * reduseCell;

}

@property (weak, nonatomic) IBOutlet UITableView *tableView;

@end

@implementation MainViewController

- (void)viewDidLoad {

[super viewDidLoad];

// Do any additional setup after loading the view from its nib.

}

- (void)didReceiveMemoryWarning {

[super didReceiveMemoryWarning];

// Dispose of any resources that can be recreated.

}

#pragma UITableView

-(NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section

{

return 10;

}

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

{

TableViewCellA * cell = [tableView dequeueReusableCellWithIdentifier:@"TableViewCellA"];

if( !cell )

{

cell = [[[NSBundle mainBundle] loadNibNamed:@"TableViewCellA" owner:self options:nil]lastObject];

}

[cell refreshCell:@"-(UITableViewCell*)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath-(UITableViewCell*)tableView:(UITableView *)tableView cellForRow"];

return cell;

}

-(CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath

{

//if( IS_IOS8_OR_ABOVE )

{

return UITableViewAutomaticDimension;

}

/*

if (!reduseCell)

{

reduseCell = [self.tableView dequeueReusableCellWithIdentifier:@"TableViewCellA"];

}

[reduseCell refreshCell:@"-(UITableViewCell*)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath-(UITableViewCell*)tableView:(UITableView *)tableView cellForRow"];

[reduseCell updateConstraintsIfNeeded];

[reduseCell layoutIfNeeded];

return [reduseCell.contentView systemLayoutSizeFittingSize:UILayoutFittingCompressedSize].height;

*/

}

-(CGFloat)tableView:(UITableView *)tableView estimatedHeightForRowAtIndexPath:(NSIndexPath *)indexPath

{

return UITableViewAutomaticDimension;

}

@end

#import "TableViewCellA.h"

@interface TableViewCellA()

@property (weak, nonatomic) IBOutlet UILabel *textLab;

@end

@implementation TableViewCellA

- (void)awakeFromNib {

// Initialization code

}

- (void)setSelected:(BOOL)selected animated:(BOOL)animated {

[super setSelected:selected animated:animated];

// Configure the view for the selected state

}

-(void)layoutSubviews

{

[super layoutSubviews];

[self.contentView updateConstraintsIfNeeded];

[self.contentView layoutIfNeeded];

self.textLab.preferredMaxLayoutWidth = self.textLab.frame.size.width;

}

-(void)refreshCell:(NSString*)str

{

self.textLab.text = str;

}

@end

下面是另外一种方法,

AutoLayout UITableViewCell 动态高度的更多相关文章

  1. iOS开发——使用Autolayout生成动态高度的TableViewCell单元格

    步骤一.TableViewCell中使用Autolayout 要点:Cell的高度必须在Constraints中指明,但不能定死,需要让内部由内容决定高度的View决定动态高度. 如UILabel设置 ...

  2. UITableViewcell autolayout下动态高度

    项目中最经常使用的一个UI就是UITableView了.iOS7.8进一步优化了复用机制,用起来相当爽.配合Autolayout,适配工作减轻了非常多. 曾经做适配工作都是在heightForRow里 ...

  3. AutoLayout深入浅出五[UITableView动态高度]

    本文转载至 http://grayluo.github.io//WeiFocusIo/autolayout/2015/02/01/autolayout5/ 我们经常会遇到UITableViewCell ...

  4. 使用Autolayout xib实现动态高度的TableViewCell

    http://my.oschina.net/u/2360693/blog/481236?p={{totalPage}} 创建Xib文件 首先将Cell做好布局,调整到满意的位置和宽度,然后开始做Aut ...

  5. AutoLayout处理UITableView动态高度

    我们经常会遇到UITableViewCell的高度要跟随内容而调整,在未引入AutoLayout之前,我们使用以下方法计算Label高度,然后heightForRowAtIndexPath中返回计算的 ...

  6. UITableViewCell动态AutoLayout布局

    相关链接: 使用Autolayout实现UITableView的Cell动态布局和高度动态改变 IOS tableView cell动态高度 (autoLayout) AutoLayoutClub 使 ...

  7. swift 版本 UItableViewCell的动态高度补足

    用swift的朋友们很多都是从ios8开发了, 其中针对table cell高度自动计算的 UITableViewAutomaticDimension 异常好用,但好像只对uilabel对象有效    ...

  8. iOS-动态调整UITableViewCell的高度

    OS-动态调整UITableViewCell的高度iOS开发文档, by 友盟翻译组 stefaliu. 大概你第一眼看来,动态调整高度是一件不容易的事情,而且打算解决它的第一个想法往往是不正确的.在 ...

  9. soui中,列表控件动态高度的使用注意

    1.listview的模板template中,需要增加defHeight属性,即默认高度,同时,不能出现itemHeight属性,否则动态高度会失效 2.数据适配器中,重写getViewDesired ...

随机推荐

  1. poj 3101 Astronomy

    2个星球周期为a,b.则相差半周的长度为a*b/(2*abs(a-b)),对于n个只需求这n个 分数的最小公倍数即可! 公式: 分数的最小公倍数 = 分子的最小公倍数/分母的最大公约数 由于涉及到大数 ...

  2. Java注解全面解析

    1.基本语法 注解定义看起来很像接口的定义.事实上,与其他任何接口一样,注解也将会编译成class文件. @Target(ElementType.Method) @Retention(Retentio ...

  3. hdu1151 Air Raid

    http://acm.hdu.edu.cn/showproblem.php?pid=1151 增广路的变种2:DAG图的最小路径覆盖=定点数-最大匹配数 #include<iostream> ...

  4. 缓存初解(五)---SpringMVC基于注解的缓存配置--web应用实例

    之前为大家介绍了如何使用spring注解来进行缓存配置 (EHCache 和 OSCache)的简单的例子,详见 Spring基于注解的缓存配置--EHCache AND OSCache 现在介绍一下 ...

  5. java:继承

    一.继承: java只支持单继承,一个子类只能继承一个父类,使用继承是为了减少类的重复代码,且父类的构造函数不能被子类继承. 当两个类里面有相同的属性或方法,就应该考虑使用继承解决重复代码了. 继承的 ...

  6. PowerDesigner概念模型的Notation设置

    原文:PowerDesigner概念模型的Notation设置 在进行数据库设计模型时,分为概念模型设计和物理模型设计两种,概念模型主要是反映真是 世界中的业务关系,也就是我们常用的实体关系图.物理模 ...

  7. [cocoapods] 如何卸载工程里的cocoapods

    1. 打开自己的工程所在文件夹 删除这4个文件 2. 打开工程,把红线的东西都删除掉 3. 只留下原来的4个,其余都删除掉

  8. Android TextView多行文本滚动实现

    Android中我们为了实现文本的滚动可以在ScrollView中嵌入一个TextView,其实TextView自己也可以实现多行滚动的,毕竟ScrollView必须只能有一个直接的子类布局.只要在l ...

  9. sql partition by 的使用

    select a.bs_sn, a.bs_bd_no, a.bs_bk_code, a.bs_kind_no, a.bs_flag, b.det_flag, c.bp_in_no, c.bp_name ...

  10. Android开发之单例模式

    参考:http://blog.csdn.net/guolin_blog/article/details/8860649 http://www.cnblogs.com/liyiran/p/5283690 ...