ios TableView的Cell高度自适应,UILabel自动换行适应

IOS TableView的Cell高度自适应,UILabel自动换行适应


项目的源码下载地址:http://download.csdn.net/detail/swingpyzf/6835365


需求:

1、表格里的UILable要求自动换行

2、创建的tableViewCell的高度会自动适应内容的高度


一、用xcode构建项目,创建一个有tableView的视图,用纯代码的形式实现:

1、创建一个UIViewController类,定义一个UITableView,实现TableView的委托和数据源协议

//
//  TableViewController.h
//  AdaptiveCell
//
//  Created by swinglife on 14-1-10.
//  Copyright (c) 2014年 swinglife. All rights reserved.
//

#import <UIKit/UIKit.h>

@interface TableViewController : UIViewController<UITableViewDataSource,UITableViewDelegate>{
    
}

@property (nonatomic,retain) UITableView *tableView;

@end

2、实现UITableView对象的初始化,声明一个tableData的数组对象用来保存tableView中得数据

#import "TableViewController.h"  
  
@interface TableViewController (){  
    NSMutableArray *tableData;  //tableView数据存放数组  
}  
  
@end  
  
@implementation TableViewController  
  
- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil  
{  
    self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];  
    if (self) {  
        tableData = [[NSMutableArray alloc] init];  
    }  
    return self;  
}  
  
- (void)viewDidLoad  
{  
    [super viewDidLoad];  
    [self initTableView];  
}  
  
//初始化tableView;  
-(void)initTableView{  
    CGRect frame = self.view.frame;  
    _tableView = [[UITableView alloc] initWithFrame:CGRectMake(frame.origin.x, frame.origin.y, frame.size.width, frame.size.height)];  
    //代理类  
    _tableView.delegate = self;  
    //数据源  
    _tableView.dataSource = self;  
    [self.view addSubview:_tableView];  
}  

3、创建自定义的UITableViewCell类,声明需要用到的控件对象和方法:

#import <UIKit/UIKit.h>  
  
@interface TableViewCell : UITableViewCell{  
  
}  
  
//用户名  
@property(nonatomic,retain) UILabel *name;  
//用户介绍  
@property(nonatomic,retain) UILabel *introduction;  
//用户头像  
@property(nonatomic,retain) UIImageView *userImage;  
  
//给用户介绍赋值并且实现自动换行  
-(void)setIntroductionText:(NSString*)text;  
//初始化cell类  
-(id)initWithReuseIdentifier:(NSString*)reuseIdentifier;  
@end

4、初始化Cell的用户控件,实现方法:

//  
//  TableViewCell.m  
//  AdaptiveCell  
//  
//  Created by swinglife on 14-1-10.  
//  Copyright (c) 2014年 swinglife. All rights reserved.  
//  
  
#import "TableViewCell.h"  
  
@implementation TableViewCell  
  
-(id)initWithReuseIdentifier:(NSString*)reuseIdentifier{  
    self = [super initWithStyle:UITableViewCellStyleDefault reuseIdentifier:reuseIdentifier];  
    if (self) {  
        [self initLayuot];  
    }  
    return self;  
}  
//初始化控件  
-(void)initLayuot{  
    _name = [[UILabel alloc] initWithFrame:CGRectMake(71, 5, 250, 40)];  
    [self addSubview:_name];  
    _userImage = [[UIImageView alloc] initWithFrame:CGRectMake(5, 5, 66, 66)];  
    [self addSubview:_userImage];  
    _introduction = [[UILabel alloc] initWithFrame:CGRectMake(5, 78, 250, 40)];  
    [self addSubview:_introduction];  
}  
  
//赋值 and 自动换行,计算出cell的高度  
-(void)setIntroductionText:(NSString*)text{  
    //获得当前cell高度  
    CGRect frame = [self frame];  
    //文本赋值  
    self.introduction.text = text;  
    //设置label的最大行数  
    self.introduction.numberOfLines = 10;  
    CGSize size = CGSizeMake(300, 1000);  
    CGSize labelSize = [self.introduction.text sizeWithFont:self.introduction.font constrainedToSize:size lineBreakMode:NSLineBreakByClipping];  
    self.introduction.frame = CGRectMake(self.introduction.frame.origin.x, self.introduction.frame.origin.y, labelSize.width, labelSize.height);  
      
    //计算出自适应的高度  
    frame.size.height = labelSize.height+100;  
      
    self.frame = frame;  
}  
  
- (void)setSelected:(BOOL)selected animated:(BOOL)animated  
{  
    [super setSelected:selected animated:animated];  
  
}  
  
@end 

5、现在需要一个存放数据对象的模型类,创建一个UserModel用来封装数据

#import <Foundation/Foundation.h>  
  
@interface UserModel : NSObject  
  
//用户名  
@property (nonatomic,copy) NSString *username;  
//介绍  
@property (nonatomic,copy) NSString *introduction;  
//头像图片路径  
@property (nonatomic,copy) NSString *imagePath;  
  
@end 

6、现在需要一些数据,在TableViewController.m文件中实现数据的创建:

//我需要一点测试数据,直接复制老项目东西  
-(void)createUserData{  
    UserModel *user = [[UserModel alloc] init];  
    [user setUsername:@"胖虎"];  
    [user setIntroduction:@"我是胖虎我怕谁!!我是胖虎我怕谁!!我是胖虎我怕谁!!"];  
    [user setImagePath:@"panghu.jpg"];  
    UserModel *user2 = [[UserModel alloc] init];  
    [user2 setUsername:@"多啦A梦"];  
    [user2 setIntroduction:@"我是多啦A梦我有肚子!!我是多啦A梦我有肚子!!我是多啦A梦我有肚子!!我是多啦A梦我有肚子!!我是多啦A梦我有肚子!!我是多啦A梦我有肚子!!我是多啦A梦我有肚子!!我是多啦A梦我有肚子!!"];  
    [user2 setImagePath:@"duolaameng.jpg"];  
    UserModel *user3 = [[UserModel alloc] init];  
    [user3 setUsername:@"大雄"];  
    [user3 setIntroduction:@"我是大雄我谁都怕,我是大雄我谁都怕,我是大雄我谁都怕,我是大雄我谁都怕,我是大雄我谁都怕,我是大雄我谁都怕,"];  
    [user3 setImagePath:@"daxiong.jpg"];  
  
      
    [tableData addObject:user];  
    [tableData addObject:user2];  
    [tableData addObject:user3];  
} 

还需要在viewDidLoad中调用上面这个方法来创建数据

- (void)viewDidLoad  
{  
    [super viewDidLoad];  
    [self initTableView];  
    [self createUserData];  
} 

7、实现TableView的

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

方法为cell赋值

-(NSInteger)numberOfSectionsInTableView:(UITableView *)tableView{  
    return 1;  
}  
  
-(NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section{  
    return [tableData count];  
}  
  
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath  
{  
    //指定cellIdentifier为自定义的cell  
    static NSString *CellIdentifier = @"Cell";  
    //自定义cell类  
    TableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];  
    if (cell == nil) {  
        cell = [[TableViewCell alloc] initWithReuseIdentifier:CellIdentifier];  
    }  
    UserModel *user = [tableData objectAtIndex:indexPath.row];  
    cell.name.text = user.username;  
    [cell.userImage setImage:[UIImage imageNamed:user.imagePath]];  
    [cell setIntroductionText:user.introduction];  
    return cell;  
}

8、最后需要将cell的高度返回给

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

-(CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath{  
    TableViewCell *cell = [self tableView:_tableView cellForRowAtIndexPath:indexPath];  
    return cell.frame.size.height;  
} 

这样TableViewController.m中得所有代码:

//  
//  TableViewController.m  
//  AdaptiveCell  
//  
//  Created by swinglife on 14-1-10.  
//  Copyright (c) 2014年 swinglife. All rights reserved.  
//  
  
#import "TableViewController.h"  
#import "UserModel.h"  
#import "TableViewCell.h"  
  
@interface TableViewController (){  
    NSMutableArray *tableData;  //tableView数据存放数组  
}  
  
@end  
  
@implementation TableViewController  
  
- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil  
{  
    self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];  
    if (self) {  
        tableData = [[NSMutableArray alloc] init];  
    }  
    return self;  
}  
  
- (void)viewDidLoad  
{  
    [super viewDidLoad];  
    [self initTableView];  
    [self createUserData];  
}  
  
//初始化tableView;  
-(void)initTableView{  
    CGRect frame = self.view.frame;  
    _tableView = [[UITableView alloc] initWithFrame:CGRectMake(frame.origin.x, frame.origin.y, frame.size.width, frame.size.height)];  
    //代理类  
    _tableView.delegate = self;  
    //数据源  
    _tableView.dataSource = self;  
    [self.view addSubview:_tableView];  
}  
  
//我需要一点测试数据,直接复制老项目东西  
-(void)createUserData{  
    UserModel *user = [[UserModel alloc] init];  
    [user setUsername:@"胖虎"];  
    [user setIntroduction:@"我是胖虎我怕谁!!我是胖虎我怕谁!!我是胖虎我怕谁!!"];  
    [user setImagePath:@"panghu.jpg"];  
    UserModel *user2 = [[UserModel alloc] init];  
    [user2 setUsername:@"多啦A梦"];  
    [user2 setIntroduction:@"我是多啦A梦我有肚子!!我是多啦A梦我有肚子!!我是多啦A梦我有肚子!!我是多啦A梦我有肚子!!我是多啦A梦我有肚子!!我是多啦A梦我有肚子!!我是多啦A梦我有肚子!!我是多啦A梦我有肚子!!"];  
    [user2 setImagePath:@"duolaameng.jpg"];  
    UserModel *user3 = [[UserModel alloc] init];  
    [user3 setUsername:@"大雄"];  
    [user3 setIntroduction:@"我是大雄我谁都怕,我是大雄我谁都怕,我是大雄我谁都怕,我是大雄我谁都怕,我是大雄我谁都怕,我是大雄我谁都怕,"];  
    [user3 setImagePath:@"daxiong.jpg"];  
  
      
    [tableData addObject:user];  
    [tableData addObject:user2];  
    [tableData addObject:user3];  
}  
  
-(CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath{  
    TableViewCell *cell = [self tableView:_tableView cellForRowAtIndexPath:indexPath];  
    return cell.frame.size.height;  
}  
  
-(NSInteger)numberOfSectionsInTableView:(UITableView *)tableView{  
    return 1;  
}  
  
-(NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section{  
    return [tableData count];  
}  
  
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath  
{  
    //指定cellIdentifier为自定义的cell  
    static NSString *CellIdentifier = @"Cell";  
    //自定义cell类  
    TableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];  
    if (cell == nil) {  
        cell = [[TableViewCell alloc] initWithReuseIdentifier:CellIdentifier];  
    }  
    UserModel *user = [tableData objectAtIndex:indexPath.row];  
    cell.name.text = user.username;  
    [cell.userImage setImage:[UIImage imageNamed:user.imagePath]];  
    [cell setIntroductionText:user.introduction];  
    return cell;  
}  
  
- (void)didReceiveMemoryWarning  
{  
    [super didReceiveMemoryWarning];  
}  
  
@end  

总结:这种方式是通过计算出UILabel自动换行后的高度后,通过-(CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath 方法将高度返回给TableView然后构建cell的高度。

最后的运行效果:


转载自: http://blog.csdn.net/swingpyzf/article/details/18093959
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值