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
#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]; }
#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
// // 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
#import <Foundation/Foundation.h> @interface UserModel : NSObject //用户名 @property (nonatomic,copy) NSString *username; //介绍 @property (nonatomic,copy) NSString *introduction; //头像图片路径 @property (nonatomic,copy) NSString *imagePath; @end
//我需要一点测试数据,直接复制老项目东西 -(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]; }
- (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; }
-(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 // 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
最后的运行效果: