首页 > 其他 > 详细

UITableViewCell(三) cell根据文本长度来自动调整cell高度

时间:2014-03-12 22:01:20      阅读:799      评论:0      收藏:0      [点我收藏+]

      @上一节中,cell的行高是我们自己定义的,但是在实际开发过程中,我们一开始并不能预知道cell的高度,因为我们并不能知道我们写进的数据在手机屏幕中能有多少行,如果不进行设置,则会变成下面图示情况:(右边的是加入了// 不限制文本行数_label.numberOfLines = 0 和 // 换行模式_label.lineBreakMode = NSLineBreakByWordWrapping;
)

bubuko.com,布布扣bubuko.com,布布扣

      @因为我们一开始定义的_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;
}
最后效果如下:
bubuko.com,布布扣bubuko.com,布布扣






UITableViewCell(三) cell根据文本长度来自动调整cell高度,布布扣,bubuko.com

UITableViewCell(三) cell根据文本长度来自动调整cell高度

原文:http://blog.csdn.net/hmt20130412/article/details/20991327

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!