文档章节

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

嘻哈开发者
 嘻哈开发者
发布于 2014/10/14 22:34
字数 1478
阅读 24434
收藏 18
点赞 4
评论 0

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


需求:

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

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


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

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

[objc] view plaincopyprint?在CODE上查看代码片派生到我的代码片

  1. //  

  2. //  TableViewController.h  

  3. //  AdaptiveCell  

  4. //  

  5. //  Created by swinglife on 14-1-10.  

  6. //  Copyright (c) 2014年 swinglife. All rights reserved.  

  7. //  

  8.   

  9. #import <UIKit/UIKit.h>  

  10.   

  11. @interface  TableViewController : UIViewController<UITableViewDataSource,UITableViewDelegate>{  

  12.       

  13. }  

  14.   

  15. @property (nonatomic,retainUITableView *tableView;  

  16.   

  17. @end   


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

[objc] view plaincopyprint?在CODE上查看代码片派生到我的代码片

  1. #import "TableViewController.h"  

  2.   

  3. @interface  TableViewController (){  

  4.     NSMutableArray *tableData;  //tableView数据存放数组  

  5. }  

  6.   

  7. @end   

  8.   

  9. @implementation TableViewController  

  10.   

  11. - (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil  

  12. {  

  13.     self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];  

  14.     if (self) {  

  15.         tableData = [[NSMutableArray alloc] init];  

  16.     }  

  17.     return self;  

  18. }  

  19.   

  20. - (void)viewDidLoad  

  21. {  

  22.     [super viewDidLoad];  

  23.     [self initTableView];  

  24. }  

  25.   

  26. //初始化tableView;  

  27. -(void)initTableView{  

  28.     CGRect frame = self.view.frame;  

  29.     _tableView = [[UITableView alloc] initWithFrame:CGRectMake(frame.origin.x, frame.origin.y, frame.size.width, frame.size.height)];  

  30.     //代理类  

  31.     _tableView.delegate = self;  

  32.     //数据源  

  33.     _tableView.dataSource = self;  

  34.     [self.view addSubview:_tableView];  

  35. }  


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

[objc] view plaincopyprint?在CODE上查看代码片派生到我的代码片

  1. #import <UIKit/UIKit.h>  

  2.   

  3. @interface TableViewCell : UITableViewCell{  

  4.   

  5. }  

  6.   

  7. //用户名  

  8. @property(nonatomic,retainUILabel *name;  

  9. //用户介绍  

  10. @property(nonatomic,retainUILabel *introduction;  

  11. //用户头像  

  12. @property(nonatomic,retainUIImageView *userImage;  

  13.   

  14. //给用户介绍赋值并且实现自动换行  

  15. -(void)setIntroductionText:(NSString*)text;  

  16. //初始化cell类  

  17. -(id)initWithReuseIdentifier:(NSString*)reuseIdentifier;  

  18. @end  


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

[objc] view plaincopyprint?在CODE上查看代码片派生到我的代码片

  1. //  

  2. //  TableViewCell.m  

  3. //  AdaptiveCell  

  4. //  

  5. //  Created by swinglife on 14-1-10.  

  6. //  Copyright (c) 2014年 swinglife. All rights reserved.  

  7. //  

  8.   

  9. #import "TableViewCell.h"  

  10.   

  11. @implementation TableViewCell  

  12.   

  13. -(id)initWithReuseIdentifier:(NSString*)reuseIdentifier{  

  14.     self = [super initWithStyle:UITableViewCellStyleDefault reuseIdentifier:reuseIdentifier];  

  15.     if (self) {  

  16.         [self initLayuot];  

  17.     }  

  18.     return self;  

  19. }  

  20. //初始化控件  

  21. -(void)initLayuot{  

  22.     _name = [[UILabel alloc] initWithFrame:CGRectMake(71525040)];  

  23.     [self addSubview:_name];  

  24.     _userImage = [[UIImageView alloc] initWithFrame:CGRectMake(556666)];  

  25.     [self addSubview:_userImage];  

  26.     _introduction = [[UILabel alloc] initWithFrame:CGRectMake(57825040)];  

  27.     [self addSubview:_introduction];  

  28. }  

  29.   

  30. //赋值 and 自动换行,计算出cell的高度  

  31. -(void)setIntroductionText:(NSString*)text{  

  32.     //获得当前cell高度  

  33.     CGRect frame = [self frame];  

  34.     //文本赋值  

  35.     self.introduction.text = text;  

  36.     //设置label的最大行数  

  37.     self.introduction.numberOfLines = 10;  

  38.     CGSize size = CGSizeMake(3001000);  

  39.     CGSize labelSize = [self.introduction.text sizeWithFont:self.introduction.font constrainedToSize:size lineBreakMode:NSLineBreakByClipping];  

  40.     self.introduction.frame = CGRectMake(self.introduction.frame.origin.xself.introduction.frame.origin.y, labelSize.width, labelSize.height);  

  41.       

  42.     //计算出自适应的高度  

  43.     frame.size.height = labelSize.height+100;  

  44.       

  45.     self.frame = frame;  

  46. }  

  47.   

  48. - (void)setSelected:(BOOL)selected animated:(BOOL)animated  

  49. {  

  50.     [super setSelected:selected animated:animated];  

  51.   

  52. }  

  53.   

  54. @end  


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

[objc] view plaincopyprint?在CODE上查看代码片派生到我的代码片

  1. #import <Foundation/Foundation.h>  

  2.   

  3. @interface UserModel : NSObject  

  4.   

  5. //用户名  

  6. @property (nonatomic,copyNSString *username;  

  7. //介绍  

  8. @property (nonatomic,copyNSString *introduction;  

  9. //头像图片路径  

  10. @property (nonatomic,copyNSString *imagePath;  

  11.   

  12. @end  


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

[objc] view plaincopyprint?在CODE上查看代码片派生到我的代码片

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

  2. -(void)createUserData{  

  3.     UserModel *user = [[UserModel alloc] init];  

  4.     [user setUsername:@"胖虎"];  

  5.     [user setIntroduction:@"我是胖虎我怕谁!!我是胖虎我怕谁!!我是胖虎我怕谁!!"];  

  6.     [user setImagePath:@"panghu.jpg"];  

  7.     UserModel *user2 = [[UserModel alloc] init];  

  8.     [user2 setUsername:@"多啦A梦"];  

  9.     [user2 setIntroduction:@"我是多啦A梦我有肚子!!我是多啦A梦我有肚子!!我是多啦A梦我有肚子!!我是多啦A梦我有肚子!!我是多啦A梦我有肚子!!我是多啦A梦我有肚子!!我是多啦A梦我有肚子!!我是多啦A梦我有肚子!!"];  

  10.     [user2 setImagePath:@"duolaameng.jpg"];  

  11.     UserModel *user3 = [[UserModel alloc] init];  

  12.     [user3 setUsername:@"大雄"];  

  13.     [user3 setIntroduction:@"我是大雄我谁都怕,我是大雄我谁都怕,我是大雄我谁都怕,我是大雄我谁都怕,我是大雄我谁都怕,我是大雄我谁都怕,"];  

  14.     [user3 setImagePath:@"daxiong.jpg"];  

  15.   

  16.       

  17.     [tableData addObject:user];  

  18.     [tableData addObject:user2];  

  19.     [tableData addObject:user3];  

  20. }  

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

[objc] view plaincopyprint?在CODE上查看代码片派生到我的代码片

  1. - (void)viewDidLoad  

  2. {  

  3.     [super viewDidLoad];  

  4.     [self initTableView];  

  5.     [self createUserData];  

  6. }  




7、实现TableView的

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

方法为cell赋值

[objc] view plaincopyprint?在CODE上查看代码片派生到我的代码片

  1. -(NSInteger)numberOfSectionsInTableView:(UITableView *)tableView{  

  2.     return 1;  

  3. }  

  4.   

  5. -(NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section{  

  6.     return [tableData count];  

  7. }  

  8.   

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

  10. {  

  11.     //指定cellIdentifier为自定义的cell  

  12.     static NSString *CellIdentifier = @"Cell";  

  13.     //自定义cell类  

  14.     TableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];  

  15.     if (cell == nil) {  

  16.         cell = [[TableViewCell alloc] initWithReuseIdentifier:CellIdentifier];  

  17.     }  

  18.     UserModel *user = [tableData objectAtIndex:indexPath.row];  

  19.     cell.name.text = user.username;  

  20.     [cell.userImage setImage:[UIImage imageNamed:user.imagePath]];  

  21.     [cell setIntroductionText:user.introduction];  

  22.     return cell;  

  23. }  


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

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

[objc] view plaincopyprint?在CODE上查看代码片派生到我的代码片

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

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

  3.     return cell.frame.size.height;  

  4. }  


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

[objc] view plaincopyprint?在CODE上查看代码片派生到我的代码片

  1. //  

  2. //  TableViewController.m  

  3. //  AdaptiveCell  

  4. //  

  5. //  Created by swinglife on 14-1-10.  

  6. //  Copyright (c) 2014年 swinglife. All rights reserved.  

  7. //  

  8.   

  9. #import "TableViewController.h"  

  10. #import "UserModel.h"  

  11. #import "TableViewCell.h"  

  12.   

  13. @interface TableViewController (){  

  14.     NSMutableArray *tableData;  //tableView数据存放数组  

  15. }  

  16.   

  17. @end  

  18.   

  19. @implementation TableViewController  

  20.   

  21. - (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil  

  22. {  

  23.     self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];  

  24.     if (self) {  

  25.         tableData = [[NSMutableArray alloc] init];  

  26.     }  

  27.     return self;  

  28. }  

  29.   

  30. - (void)viewDidLoad  

  31. {  

  32.     [super viewDidLoad];  

  33.     [self initTableView];  

  34.     [self createUserData];  

  35. }  

  36.   

  37. //初始化tableView;  

  38. -(void)initTableView{  

  39.     CGRect frame = self.view.frame;  

  40.     _tableView = [[UITableView alloc] initWithFrame:CGRectMake(frame.origin.x, frame.origin.y, frame.size.width, frame.size.height)];  

  41.     //代理类  

  42.     _tableView.delegate = self;  

  43.     //数据源  

  44.     _tableView.dataSource = self;  

  45.     [self.view addSubview:_tableView];  

  46. }  

  47.   

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

  49. -(void)createUserData{  

  50.     UserModel *user = [[UserModel alloc] init];  

  51.     [user setUsername:@"胖虎"];  

  52.     [user setIntroduction:@"我是胖虎我怕谁!!我是胖虎我怕谁!!我是胖虎我怕谁!!"];  

  53.     [user setImagePath:@"panghu.jpg"];  

  54.     UserModel *user2 = [[UserModel alloc] init];  

  55.     [user2 setUsername:@"多啦A梦"];  

  56.     [user2 setIntroduction:@"我是多啦A梦我有肚子!!我是多啦A梦我有肚子!!我是多啦A梦我有肚子!!我是多啦A梦我有肚子!!我是多啦A梦我有肚子!!我是多啦A梦我有肚子!!我是多啦A梦我有肚子!!我是多啦A梦我有肚子!!"];  

  57.     [user2 setImagePath:@"duolaameng.jpg"];  

  58.     UserModel *user3 = [[UserModel alloc] init];  

  59.     [user3 setUsername:@"大雄"];  

  60.     [user3 setIntroduction:@"我是大雄我谁都怕,我是大雄我谁都怕,我是大雄我谁都怕,我是大雄我谁都怕,我是大雄我谁都怕,我是大雄我谁都怕,"];  

  61.     [user3 setImagePath:@"daxiong.jpg"];  

  62.   

  63.       

  64.     [tableData addObject:user];  

  65.     [tableData addObject:user2];  

  66.     [tableData addObject:user3];  

  67. }  

  68.   

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

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

  71.     return cell.frame.size.height;  

  72. }  

  73.   

  74. -(NSInteger)numberOfSectionsInTableView:(UITableView *)tableView{  

  75.     return 1;  

  76. }  

  77.   

  78. -(NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section{  

  79.     return [tableData count];  

  80. }  

  81.   

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

  83. {  

  84.     //指定cellIdentifier为自定义的cell  

  85.     static NSString *CellIdentifier = @"Cell";  

  86.     //自定义cell类  

  87.     TableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];  

  88.     if (cell == nil) {  

  89.         cell = [[TableViewCell alloc] initWithReuseIdentifier:CellIdentifier];  

  90.     }  

  91.     UserModel *user = [tableData objectAtIndex:indexPath.row];  

  92.     cell.name.text = user.username;  

  93.     [cell.userImage setImage:[UIImage imageNamed:user.imagePath]];  

  94.     [cell setIntroductionText:user.introduction];  

  95.     return cell;  

  96. }  

  97.   

  98. - (void)didReceiveMemoryWarning  

  99. {  

  100.     [super didReceiveMemoryWarning];  

  101. }  

  102.   

  103. @end  


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

最后的运行效果:



本文转载自:http://blog.csdn.net/swingpyzf/article/details/18093959

共有 人打赏支持
嘻哈开发者
粉丝 54
博文 113
码字总数 1519
作品 0
广州
程序员
UI_11 自定义UITableViewCell、Cell的高度自适应

UITableViewCell很难满足我们的需求,因此,CustomCell(自定义单元格)至关重要。下面将通过一个例子演示自定义Cell。第二部分演示根据文本内容自适应Label、Cell高度。 第一部分 CustomCe...

黑伞将军
2015/08/29
0
0
变高UITableViewCell

在iOS上开发了一个有列表的应用,列表中的每一项都是有很多控件组成的,每一项的内容大概一样,自己定制了一下Cell,基本上满足要求了。后来Cell中的UILabel中的内容过长,需要自定义高度,看...

汉果James
2013/03/01
0
1
ios学习--TableView详细解释

ios学习--TableView详细解释 分类: ios Object-C2012-05-17 08:48 1714人阅读 评论(0) 收藏 举报 -、建立 UITableView (NSArray )sectionIndexTitlesForTableView:(UITableView )tableView......

wcj
2012/11/01
0
0
iOS UItableviewCell实现可变高度的UITextView,动态刷新高度

下午,一个朋友问了一个问题,关于UITableView的,大概意思就是,他想在UITableView的Cell中实现UITextView在用户的输入过程中的高度动态更新。 关于高度自增长UITextView这个实现很简单,网...

神补刀
2015/08/12
0
7
用视图上移解决UITextField/UITextView被键盘遮盖问题

先看看UILabel/UITextField/UITextView的区别: UILabel 显示的文本只读,无法编辑,可以根据文字个数自动换行; UITextField 可编辑本文,但是无法换行,只能在一行显示;当点击键盘上的ret...

yoyoso
2015/03/18
0
0
[iOS Animation]-CALayer 专用图层 富文本

富文本 iOS 6中,Apple给UILabel和其他UIKit文本视图添加了直接的属性化字符串的支持,应该说这是一个很方便的特性。不过事实上从iOS3.2开始CATextLayer就已经支持属性化字符串了。这样的话,...

浩浩老师
2015/09/23
0
0
iOS开发,对低耦合高内聚的理解

耦合并不是软件开发中的专用语言,在初中和高中物理中就有电磁学方面的耦合,还有印象中机械设备之间也有耦合的概念,所以软件开发中的耦合只是来源于生活,用之于软件工程学。 就拿机械设备...

召唤攻城狮
2014/04/10
0
0
iOS开发技巧(系列十:UITableView及其Cell的一些细节)

今天看开源代码,有些UITableView方面细节的东西,整理了与大家共享, 1、设置UITableViewCell的accessoryView 有时候我们需要设置cell的一些样式,比如下图, 这个就是设置了cell的accesso...

召唤攻城狮
2014/05/09
0
0
《小印记》iOS源码分享--自定义弹框篇

笔者前不久终于发布了自己的APP《小印记》,在此分享一些iOS源码,如果读者学到了有用的东西,希望能前往App Store下载《小印记》支持一下笔者,谢谢! 《小印记》iOS源码分享--极光推送实践...

_子墨
2017/03/22
0
0
​Xamarin iOS教程之自定义视图

Xamarin iOS教程之自定义视图 Xamarin iOS自定义视图 工具栏中的视图在实际应用开发中用的很多,但是为了吸引用户的眼球,开发者可以做出一些自定义的视图。 【示例2-33】以下将实现一个自定...

大学霸
2015/06/24
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

自定义OkHttp的UA

背景 上次的问题很明显 由于我们的ua清一色OkHttp导致快速定位到内部应用。 既然如此我们是否考虑可以在UA上做点手脚。 自定义我们的UA呢??? 分析 首先UA在 均为okhttp/3.2.0 大概率是由于...

Mr_Qi
20分钟前
0
0
【scikit-learn】01:使用案例对sklearn库进行简单介绍

sklearn学习笔记:Quick Start 源地址:http://scikit-learn.org/stable/tutorial/basic/tutorial.html # -*-coding:utf-8-*-''' Author:kevinelstri Datetime:2017.2.16'''......

wangxuwei
24分钟前
0
0
Linux Kernel 4.16 系列停止维护,用户应升级至 4.17

知名 Linux 内核维护人员兼开发人员 Greg Kroah-Hartman 近日在发布 4.16.18 版本的同时,宣布这是 4.16 系列的最后一个维护版本,强烈建议用户立即升级至 4.17 系列。 Linux 4.16 于 2018 年...

问题终结者
26分钟前
0
0
Apache配置时.htaccess失效不起作用的原因分析

.htaccess 失效的原因 1. 重写规则有问题,检查自己的重写规则 2.Apache配置问题,配置中没有配置启用 rewrite a2enmod rewrite 3.网站配置文件没有启用配置需要配置 000-default.conf <Dire...

TU-DESGIN
46分钟前
1
0
两个求最大公约数C/C++算法实现

#include<stdio.h> #include<time.h> #include <iostream>using namespace std;//求最大公约数 LCD(Largest Common Division)//短除法 //m=8251, n=6105; int LCD_ShortDiv(int m, ......

失落的艺术
52分钟前
1
0
QueryPerformanceCounter

windows的Sleep函数,睡眠线程指定毫秒数,可以用来做毫秒延时。 对于微秒延时,没有一个现成的函数,但是可以通过 QueryPerformanceFrequency QueryPerformanceCounter 来间接实现。原理就是...

开飞色
今天
1
0
log4j2使用AsyncRoot不显示行号问题处理

<AsyncRoot level="info" includeLocation="true"> <AppenderRef ref="File"/></AsyncRoot><!--1.异步logger,还需要在pom.xml中添加disruptor的依赖。2.includeLocation结合异......

小翔
今天
3
0
安卓手机上 K 歌,声音延迟怎么解决?

这篇文章可以为你提供一个解决录音和播放同步问题的思路,而且解决了声音从手机传输到耳机上有延时的问题。 初识音频 在开始之前,我先简单介绍一下音频相关的基础知识,方便下文理解。 我们...

编辑部的故事
今天
2
0
使用token实现在有效期内APP自动登录功能

使用token实现在有效期内APP自动登录功能 http://sevennight.cc/2016/07/19/auto_login_impl.html

风云海滩
今天
2
0
Spring Boot集成RabbitMQ发送接收JSON

默认情况下RabbitMQ发送的消息是转换为字节码,这里介绍一下如何发送JSON数据。 ObjectMapper 最简单发送JSON数据的方式是把对象使用ObjectMapper等JSON工具类把对象转换为JSON格式,然后发送...

小致dad
今天
3
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部