@上一节中,cell的行高是我们自己定义的,但是在实际开发过程中,我们一开始并不能预知道cell的高度,因为我们并不能知道我们写进的数据在手机屏幕中能有多少行,如果不进行设置,则会变成下面图示情况:(右边的是加入了//
不限制文本行数_label.numberOfLines = 0 和 // 换行模式_label.lineBreakMode = NSLineBreakByWordWrapping;
)
@因为我们一开始定义的_label的frame和cell的高度是固定值,所以就算设置了换行显示,也没有足够的位置显示出来
@正确做法代码如下:
@interface HMTAssistCell : UITableViewCell @property (nonatomic) UILabel * label; // 定义一个文本 @end @implementation HMTAssistCell - (id)initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(NSString *)reuseIdentifier { self = [super initWithStyle:style reuseIdentifier:reuseIdentifier]; if (self) { _label = [[UILabel alloc]initWithFrame:CGRectMake(10, 10, 300, 65)]; _label.backgroundColor = [UIColor greenColor]; // 字体大小 _label.font = [UIFont systemFontOfSize:15.0]; // 不限制行数 _label.numberOfLines = 0; // 换行模式 _label.lineBreakMode = NSLineBreakByCharWrapping; [self.contentView addSubview:_label]; } return self; } - (void)setSelected:(BOOL)selected animated:(BOOL)animated { [super setSelected:selected animated:animated]; // Configure the view for the selected state } @end - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{ // 依旧设置重用标识 static NSString * cellIdentifier = @"cell"; // 这里用我们新建的UITableViewCell的子类进行cell重用声明 HMTAssistCell * cell = (HMTAssistCell *)[tableView dequeueReusableCellWithIdentifier:cellIdentifier]; // 如果没有,则创建 if (!cell) { cell = [[HMTAssistCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:cellIdentifier]; } NSString * textArray = [_textArray objectAtIndex:indexPath.row]; cell.label.text = textArray; // iOS6中的方法,在iOS7中弃用了 /* CGSize textSize = [textArray sizeWithFont:[UIFont systemFontOfSize:16.0] constrainedToSize:CGSizeMake(280, 100000000) lineBreakMode:NSLineBreakByWordWrapping];*/ // 定义一个字典,里面还可以放入其他属性,不仅仅是字体大小 NSDictionary *attribute = @{NSFontAttributeName: [UIFont systemFontOfSize:15.0]}; //iOS7中提供的计算文本尺寸的方法 CGSize textSize1 = [textArray boundingRectWithSize:tableView.bounds.size options:NSStringDrawingUsesLineFragmentOrigin |
NSStringDrawingTruncatesLastVisibleLine attributes:attribute context:nil].size; NSLog(@"%f",textSize1.height); // cell.label.frame.size.height -----------------> 是错误的,大家可以思考一下为什么是错误的 CGRect rect = cell.label.frame; rect.size.height = textSize1.height+20; cell.label.frame = rect; return cell; } // 根据文本高度来设置cell高度 - (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath{ NSString * textArray = [_textArray objectAtIndex:indexPath.row]; NSDictionary *attribute = @{NSFontAttributeName: [UIFont systemFontOfSize:15.0]}; CGSize textSize1 = [textArray boundingRectWithSize:tableView.bounds.size options:NSStringDrawingUsesLineFragmentOrigin |
NSStringDrawingTruncatesLastVisibleLine attributes:attribute context:nil].size; return textSize1.height+35;// 让文本离cell有一定的距离显示,上7.5,下7.5 } #import <UIKit/UIKit.h> @interface HMTRootViewController : UIViewController<UITableViewDataSource,UITableViewDelegate> // 定义一个可变数组,来存储要显示文本数据 @property (nonatomic) NSMutableArray * textArray; @end - (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil { self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil]; if (self) { // Custom initialization _textArray = [[NSMutableArray alloc]init]; [_textArray addObject:@"对于包含对象的变量,Objective-C 既支持动态类型化,也支持静态类型化。静态类型化的变量,要在变量类型声明中包括类名称。动态类型化的变量,则要给对象使用类型 id。您会发现在某些情况下,会需要使用动态类型化的变量。例如,集 (collection) 对象,如数组,在它包含对象的类型未知的情况下,可能会使用动态类型化的变量。此类变量提供了极大的灵活性,也让 Objective-C 程序拥有了更强大的活力。"]; [_textArray addObject:@"请注意第一个声明中的星号 (*)。在 Objective-C 中,执行对象引用的只能是指针。如果您还不能完全理解这个要求,不用担心。并非一定要成为指针专家才能开始 Objective-C 编程。只需要记住,在静态类型化的对象的声明中,变量的名称前面应放置一个星号。id 类型意味着一个指针。"]; [_textArray addObject:@"如果您不熟悉面向对象编程,则将方法想像成一个规范特定对象的函数,可能会有所帮助。通过将一则消息发送到——或发消息给——一个对象,您可调用该对象的一个方法。Objective-C 中有两种类型的方法:实例方法和类方法。"]; [_textArray addObject:@"当您想要调用一个方法时,通过给实施该方法的对象发送一则消息来实现。(虽然“发送消息”常可与“调用方法”互换,但实际上,Objective-C 在运行时才会执行实际地发送。)消。"]; [_textArray addObject:@"Objective-C 还提供用于调用存取方法的点记法语法。存取方法获取并设定对象的状态,因此对于封装很重要,是所有对象的重要功能。对象隐藏或封装其状态,并显示接口,该接口是访问该状态的所有实例都通用的。如果您不熟悉面向对象编程,则将方法想像成一个规范特定对象的函数,可能会有所帮助。通过将一则消息发送到——或发消息给——一个对象,您可调用该对象的一个方法。Objective-C 中有两种类型的方法:实例方法和类方法。"]; /*[_textArray addObject:@"尽管前几个示例将消息发送到了类的实例,但您也可以将消息发送到类本身。(类是运行时创建的、类型为 Class 的对象。)向类发送消息时,您指定的方法必须定义为类方法,而非实例方法。类方法是一种功能,类似于 C++ 中的静态类方法。"];*/ //NSLog(@"AAAAA"); } return self; }最后效果如下:
UITableViewCell(三) cell根据文本长度来自动调整cell高度,布布扣,bubuko.com
UITableViewCell(三) cell根据文本长度来自动调整cell高度
原文:http://blog.csdn.net/hmt20130412/article/details/20991327