[ios]UITableViewCell自适应高度 【转】

- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath {
    // 列寬
    CGFloat contentWidth = self.tableView.frame.size.width;
    // 用何種字體進行顯示
    UIFont *font = [UIFont systemFontOfSize:13];
    
    // 該行要顯示的內容
    NSString *content = [data objectAtIndex:indexPath.row];
    // 計算出顯示完內容需要的最小尺寸
    CGSize size = [content sizeWithFont:font constrainedToSize:CGSizeMake(contentWidth, 1000) lineBreakMode:UILineBreakModeWordWrap];
    
    // 這裏返回需要的高度
    return size.height; 
}

// Customize the appearance of table view cells.
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
    
    static NSString *CellIdentifier = @"Cell";
    // 列寬
    CGFloat contentWidth = self.tableView.frame.size.width;
    // 用何種字體進行顯示
    UIFont *font = [UIFont systemFontOfSize:13];
    
    // 該行要顯示的內容
    NSString *content = [data objectAtIndex:indexPath.row];
    // 計算出顯示完內容需要的最小尺寸
    CGSize size = [content sizeWithFont:font constrainedToSize:CGSizeMake(contentWidth, 1000) lineBreakMode:UILineBreakModeWordWrap];
    
    // 構建顯示行
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
    if (cell == nil) {
        cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier] autorelease];
    }
    
    CGRect rect = [cell.textLabel textRectForBounds:cell.textLabel.frame limitedToNumberOfLines:0];
    // 設置顯示榘形大小
    rect.size = size;
    // 重置列文本區域
    cell.textLabel.frame = rect;
    
    cell.textLabel.text = content;
    
    // 設置自動換行(重要)
    cell.textLabel.numberOfLines = 0;
    // 設置顯示字體(一定要和之前計算時使用字體一至)
    cell.textLabel.font = font;

    return cell;
}

 

//===========//

UILabel *label = [[UILabel alloc] initWithFrame:CGRectMake(0,0,0,0)];//这个frame是初设的,没关系,后面还会重新设置其size
[label setNumberOfLines:0];
NSString *s = @"abcdefghijklmn";
UIFont *font = [UIFont fontWithName:@"Arial" size:12];
CGSize size = CGSizeMake(320,2000);
CGSize labelsize = [s sizeWithFont:font constrainedToSize:size lineBreakMode:UILineBreakModeWordWrap];
[label setFrame:CGRectMake(0,0, labelsize.width, labelsize.height)];
[self.view addSubView:label];

 

=============gengxing==========///

主要有两个地方需要调整高度,一个是自己创建的UILabel或其它,另一个就是cell的高度。在创建cell的地方只需要定义好label的属性就行了:

  1. - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath  
  2. {  
  3.     static NSString *cellIdentifier = @"cell";  
  4.     UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:cellIdentifier];  
  5.     if (cell == nil)  
  6.     {  
  7.         cell = [[[UITableViewCell alloc] initWithFrame:CGRectZero reuseIdentifier:cellIdentifier] autorelease];  
  8.           
  9.         UILabel *contentLabel = [[UILabel alloc] initWithFrame:CGRectZero];  
  10.         [contentLabel setLineBreakMode:UILineBreakModeWordWrap];  
  11.         [contentLabel setNumberOfLines:0];  
  12.         [contentLabel setFont:FONT_CELL];  
  13.         [contentLabel setTag:TAG_LABEL];  
  14.           
  15.         [[cell contentView] addSubview:contentLabel];  
  16.         [contentLabel release];  
  17.     }  

设置完值后再设置frame:

  1. cell.textLabel.text = @"";  
  2. CGSize captionSize = [cell.textLabel.text sizeWithFont:FONT_CELL];  
  3. contentLabel.frame = CGRectMake(captionSize.width + 10, 0,   
  4.                                 CGRectGetWidth(cell.bounds) - captionSize.width - 10,   
  5.                                 [self tableView:nil heightForRowAtIndexPath:[NSIndexPath indexPathForRow:indexPath.row inSection:0]]);  

我需要让cell的高度去适应label,所以调用计算cell高度的方法,在heightForRowAtIndexPath方法中计算label所需的高度即可:

 

  1. -(CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath{  
  2.     if (indexPath.row < …) {  
  3.         return 90;  
  4.     } else if (indexPath.row == ...) {  
  5.         NSString *caption = @"";  
  6.         CGSize contentSize = getTextSize(caption, FONT_CELL, @"data",  
  7.                                          CGRectGetWidth(self.tableView.bounds));  
  8.         return contentSize.height > 44 ? contentSize.height : 44;  
  9.     }  
  10.     return 44;  
  11. }  

为了不让高度过于混乱,我把最小值设为44,getTextSize只是一个工具方法,用于计算x轴偏移的距离:

 

  1. CGSize getTextSize(NSString *offsetText,UIFont *font,NSString *text, CGFloat maxWidth){  
  2.     CGSize offsetTextSize = [offsetText sizeWithFont:font];  
  3.     CGSize textSize = [text sizeWithFont:font   
  4.      constrainedToSize:CGSizeMake(maxWidth-offsetTextSize.width, MAXFLOAT)   
  5.          lineBreakMode:UILineBreakModeWordWrap];  
  6.     return textSize;  
  7. }  

期间使用了一些公共宏,比如:FONT_CELL等等,只在cellForRowAtIndexPath里面设置好label的基本属性和frame,计算高度就交给heightForRowAtIndexPath,可以自己对返回值进行修改。

转载于:https://www.cnblogs.com/jinjiantong/archive/2013/03/22/2975077.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/461247.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

MYSQL存储磁盘创建vgcreate_【转】parted创建硬盘分区并创建LVM

目的&#xff1a;将两个三T的硬盘做成LVM(sdc,sdd)一、parted将硬盘进行分区&#xff1a;1)parted的命令方式Parted 命令分为两种模式&#xff1a;命令行模式和交互模式。1、命令行模式&#xff1a; parted [option] device [command] ,该模式可以直接在命令行下对磁盘进行分区…

Linux设备驱动模型1——设备驱动模型的简介与底层架构

以下内容源于朱有鹏嵌入式课程的学习与整理&#xff0c;如有侵权请告知删除。 一、linux设备驱动模型简介 1、设备驱动模型的含义 设备驱动模型主要体现为以下四个方面&#xff1a; &#xff08;1&#xff09;类class、总线bus、设备device、驱动driver 这四个概念分别对应着四…

例子简单说说C# ref和out

首写从这字段看 ref 就是引用的意思 out当然就是输出了public void getRefStr(ref string str) {str"hello 你好&#xff0c;你变成了Ref了" }public void getOutStr(out string outStr){outStr "hello 你好&#xff0c;你是out输出的值";} protected…

VARIANT变体类型数据

2019独角兽企业重金招聘Python工程师标准>>> 特殊 Variant 是一种特殊的数据类型&#xff0c;除了定长String数据及用户定义类型外&#xff0c;可以包含任何种类的数据。Variant 也可以包含Empty、Error、Nothing及Null等特殊值。可以用VarType函数或TypeName函数来…

mysql修改校对集_MySQL 图文详细教程之校对集问题

软件安装&#xff1a;装机软件必备包SQL是Structured Query Language(结构化查询语言)的缩写。SQL是专为数据库而建立的操作命令集&#xff0c;是一种功能齐全的数据库语言。在使用它时&#xff0c;只需要发出“做什么”的命令&#xff0c;“怎么做”是不用使用者考虑的。SQL功…

Linux设备驱动模型2——总线式设备驱动组织方式(总线、设备、驱动、类等结构体)

以下内容源于朱有鹏嵌入式课程的学习与整理&#xff0c;如有侵权请告知删除。 参考 Linux总线设备驱动模型的理解 struct class 和 struct class_device 前言 这里说的“总线式”&#xff0c;包括I2C总线等具体物理总线&#xff0c;以及平台总线这个虚拟总线。 rootubuntu:/sy…

C# winform 魔兽MH全图制作教程(1): 开发准备工作

C# winform 魔兽MH全图制作教程&#xff08;1&#xff09;: 开发准备工作 一、开发条件&#xff1a; Visual Studio 2008win xp,win 7,win 2003.C# 语言基础会调试能够运行游戏&#xff1a;《魔兽争霸3冰封王座》拥有版本魔兽客户端版本切换器1.20E,1.24E,1.24D二、设计思路&am…

从常识看中国经济社会-再续之续:套利

2019独角兽企业重金招聘Python工程师标准>>> 《全球化掠夺》提及财富流转的路径&#xff0c;世界仍旧是个丛林&#xff0c;每个人、每个族群都在争夺自己的利益。在一个经济体的内部&#xff0c;财富是垂直流动的&#xff1b;在全球化的经济体中&#xff0c;财富是纵…

python 面向对象编程简称_Python基础-面向对象编程

简介三中编程范式面向过程编程函数式编程面向对象编程面向对象和面向过程对比面向过程优点&#xff1a;性能比面向对象高&#xff0c;因为类调用时需要实例化&#xff0c;开销比较大&#xff0c;比较消耗资源;比如单片机、嵌入式开发、Linux/Unix等一般采用面向过程开发&#x…

Linux设备驱动模型3——平台总线的工作原理

以下内容源于朱有鹏嵌入式课程的学习与整理&#xff0c;如有侵权请告知删除。 一、平台总线的简介 1、平台总线的简介 &#xff08;1&#xff09;平台总线属于总线中的一种&#xff0c;相对于usb、pci、i2c等物理总线来说&#xff0c;平台总线是虚拟的、抽象出来的。 &#xff…

MYSQL中的BlackHole引擎

MYSQL中的BlackHole引擎 http://blog.csdn.net/ylspirit/article/details/7234021 http://blog.chinaunix.net/uid-22646981-id-3271711.html MySQL在5.x系列提供了Blackhole引擎–“黑洞”. 其作用正如其名字一样&#xff1a;任何写入到此引擎的数据均会被丢弃掉&#xff0c;…

mysql备份到带库_RMAN备份恢复——备份到带库的性能

简单测试了一下rac环境通过RMAN备份到带库的功能。数据库&#xff1a;Oracle 10203 RAC for Solaris8带库&#xff1a;Quantum PX502备份软件&#xff1a;Veritas netbackup 6.0由于带库是502&#xff0c;因此包含两个控制器。也就是说&#xff0c;应该可以通过两个控制性并行写…

《DIY四轴飞行器》读书笔记1

内容整理于黄和悦的《DIY四轴飞行器》。 一、四轴飞行器概述 1、四轴飞行器的现状 &#xff08;1&#xff09;研究内容 多级协作&#xff0c;自主飞行倾斜&#xff1b;最优控制理论&#xff0c;飞行器自主飞行和避障&#xff1b;主要是飞控部分。 &#xff08;2&#xff09…

脚本输出当前 “yyyy-MM-dd WeakDay Festval”

ylbtech-JavaScript: 脚本输出当前 “yyyy-MM-dd WeakDay Festval”脚本输出当前 “yyyy-MM-dd WeakDay Festval” 1.A,源代码(Source Code)-脚本输出当前 “yyyy-MM-dd WeakDay Festval”返回顶部 <SCRIPT languagejavascript> <!--calendar new Date();day cal…

SecureCRT密钥远程登录Linux

一&#xff1a;环境SecureCRT版本&#xff1a;SecureCRT_5.1.3linux版本&#xff1a;[rootangelT ~]# cat /etc/redhat-release CentOS release 6.4 (Final)[rootangelT ~]# uname -r2.6.32-358.el6.x86_64linux系统的sshd_config配置文件是默认的&#xff0c;没有任何的修改。…

源码安装mysql数据库_Linux下源码安装mysql数据库

1、 创建mysql安装目录&#xff1a;[rootlocalhost ~]#mkdir –pv /usr/local/mysql/2、 创建数据存放目录&#xff1a;[rootlocalhost ~]#mkdir –pv /data/mysql/3、 创建用户和用户组&#xff0c;并赋予数据存放目录权限&#xff1a;[rootlocalhost ~]#groupadd mysql[ro…

win10禁止数字签名

以下内容源于网络资源的学习与整理&#xff0c;如有侵权请告知删除。 1、点击通知&#xff0c;找到并进入“所有设置”。 2、在所有设置中找到并进入“更新和安全”。 3、找到恢复&#xff0c;点击“高级启动”下的“立即重启”&#xff0c;重启电脑。 4、重启后选择“疑难解…

信息采集-火车采集器

最近一位同事提出要采集alibaba上的公司信息&#xff0c;关键词是工业加湿器。 主管把任务分配给我后&#xff0c;推荐了一款软件&#xff0c;火车采集器&#xff08;真心不是做广告&#xff09;。 研究了两天&#xff0c;还算简单&#xff0c;除了正则表达式似懂非懂&#xff…

在Linux系统安装Nginx及配置https加密访问

2019独角兽企业重金招聘Python工程师标准>>> 1、安装nginx ①、为了确保能在 nginx 中使用正则表达式进行更灵活的配置&#xff0c;安装之前需要确定系统是否安装有 PCRE&#xff08;Perl Compatible Regular Expressions&#xff09;包。您可以到 ftp://ftp.csx.c…

mysql cstmt_MySQL

创建一个以JDBC连接数据库的程序&#xff0c;包含7个步骤&#xff1a;1、加载JDBC驱动程序&#xff1a;在连接数据库之前&#xff0c;首先要加载想要连接的数据库的驱动到JVM(Java虚拟机)&#xff0c;这通过java.lang.Class类的静态方法forName(String className)实现。例如&am…