您的位置:首页 > 产品设计 > UI/UE

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

2016-11-16 09:36 701 查看
iOS TableView的Cell高度自适应,UILabel自动换行适应



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

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



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

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

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

[objc] view
plaincopy





//

// 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中得数据

[objc] view
plaincopy





#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类,声明需要用到的控件对象和方法:

[objc] view
plaincopy





#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的用户控件,实现方法:

[objc] view
plaincopy





//

// 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用来封装数据

[objc] view
plaincopy





#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文件中实现数据的创建:

[objc] view
plaincopy





//我需要一点测试数据,直接复制老项目东西

-(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中调用上面这个方法来创建数据

[objc] view
plaincopy





- (void)viewDidLoad

{

 
4000
; [super viewDidLoad];

[self initTableView];

[self createUserData];

}

7、实现TableView的

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

方法为cell赋值

[objc] view
plaincopy





-(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方法:

[objc] view
plaincopy





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

TableViewCell *cell = [self tableView:_tableView cellForRowAtIndexPath:indexPath];

return cell.frame.size.height;

}

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

[objc] view
plaincopy





//

// 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的高度。

最后的运行效果:

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: