欢迎访问 生活随笔!

生活随笔

当前位置: 首页 > 编程资源 > 编程问答 >内容正文

编程问答

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

发布时间:2025/5/22 编程问答 39 豆豆
生活随笔 收集整理的这篇文章主要介绍了 IOS TableView的Cell高度自适应,UILabel自动换行适应 小编觉得挺不错的,现在分享给大家,帮大家做个参考.

需求:

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

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


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

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

[objc] view plaincopyprint?
  • //  
  • //  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,retainUITableView *tableView;  
  •   
  • @end  

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

    [objc] view plaincopyprint?
  • #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 plaincopyprint?
  • #import <UIKit/UIKit.h>  
  •   
  • @interface TableViewCell : UITableViewCell{  
  •   
  • }  
  •   
  • //用户名  
  • @property(nonatomic,retainUILabel *name;  
  • //用户介绍  
  • @property(nonatomic,retainUILabel *introduction;  
  • //用户头像  
  • @property(nonatomic,retainUIImageView *userImage;  
  •   
  • //给用户介绍赋值并且实现自动换行  
  • -(void)setIntroductionText:(NSString*)text;  
  • //初始化cell类  
  • -(id)initWithReuseIdentifier:(NSString*)reuseIdentifier;  
  • @end  

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

    [objc] view plaincopyprint?
  • //  
  • //  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(71525040)];  
  •     [self addSubview:_name];  
  •     _userImage = [[UIImageView alloc] initWithFrame:CGRectMake(556666)];  
  •     [self addSubview:_userImage];  
  •     _introduction = [[UILabel alloc] initWithFrame:CGRectMake(57825040)];  
  •     [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(3001000);  
  •     CGSize labelSize = [self.introduction.text sizeWithFont:self.introduction.font constrainedToSize:size lineBreakMode:NSLineBreakByClipping];  
  •     self.introduction.frame = CGRectMake(self.introduction.frame.origin.xself.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 plaincopyprint?
  • #import <Foundation/Foundation.h>  
  •   
  • @interface UserModel : NSObject  
  •   
  • //用户名  
  • @property (nonatomic,copyNSString *username;  
  • //介绍  
  • @property (nonatomic,copyNSString *introduction;  
  • //头像图片路径  
  • @property (nonatomic,copyNSString *imagePath;  
  •   
  • @end  

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

    [objc] view plaincopyprint?
  • //我需要一点测试数据,直接复制老项目东西  
  • -(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 plaincopyprint?
  • - (void)viewDidLoad  
  • {  
  •     [super viewDidLoad];  
  •     [self initTableView];  
  •     [self createUserData];  
  • }  



  • 7、实现TableView的

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

    方法为cell赋值

    [objc] view plaincopyprint?
  • -(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 plaincopyprint?
  • -(CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath{  
  •     TableViewCell *cell = [self tableView:_tableView cellForRowAtIndexPath:indexPath];  
  •     return cell.frame.size.height;  
  • }  

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

    [objc] view plaincopyprint?
  • //  
  • //  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的高度。

    最后的运行效果:

    转载于:https://www.cnblogs.com/yuqingzhude/p/4844898.html

    总结

    以上是生活随笔为你收集整理的IOS TableView的Cell高度自适应,UILabel自动换行适应的全部内容,希望文章能够帮你解决所遇到的问题。

    如果觉得生活随笔网站内容还不错,欢迎将生活随笔推荐给好友。