- 浏览: 773850 次
- 性别:
- 来自: 天堂
文章分类
最新评论
-
xiaozhao-521:
呀呀呀呀呀呀呀
RequestTest222 -
Andy_hyh:
打扰了,问下openmeeting源码可以运行起来吗?
Openmeetings安装 详细步骤 -
qindongliang1922:
擦,现在还行么,厉害
北京免费吃饭的地方 -
minixx77:
...
Openmeetings安装 详细步骤 -
wwwqqqiang:
喜欢楼主分享问题的方式,有思想
UIView 和 CALayer的那点事
OS-动态调整UITableViewCell的高度iOS开发文档, by 友盟翻译组 stefaliu.
大概你第一眼看来,动态调整高度是一件不容易的事情,而且打算解决它的第一个想法往往是不正确的。在这篇文章中我将展示如何使图表单元格的高度能根据里面文本内容来动态改变,同时又不必子类化UITableViewCell。你当然可以通过子类化它来实现,但是这样做会使得代码复杂因为设置高度是在图表本身的实例上而不是对单元格操作。下面你将会看到这其实是一件轻而易举的事情。对于图表来说能够动态调整高度是件很有意义的事情,我首先想到的需要这个功能的是当显示一列长度会变化的文本列表时,如果文本内容较少,它或许能够适合正常的单元格label,但是如果文本变长,就不得不重新设置单元格大小以便于显示全部的文本内容。我总结了重新设置单元格大小的主要步骤如下:
1 创建并添加一个UILabel作为单元格cell的子视图;
2 在UITableView的委托方法: (CGFloat)tableView:(UITableView*)tableViewheightForRowAtIndexPath: (NSIndexPath *) indexPath中计算高度
3 在UITableView的委托方法: (UITableViewCell*)tableView:(UITableView*)tableViewcellForRowAtIndexPath: (NSIndexPath *) indexPath中计算UILabel的框大小。
下面我要详细介绍这些步骤,首先看一下程序输出截图:
在普通的图表中,你可以简单地用下面的方法设置单元格内label的文本内容:
[[cell textLabel] setText:@"Text for the current cell here."];
也许你认为这样做就可以完全控制UILabel了,但是我发现我的任何要改变UILabel框大小的尝试都失败了,因此这并不是实现动态调整大小的一个好的候选方案。
我们需要设计一个UILabel然后把它添加到单元格的内容视图中。要实现它需要调用-cellForRowAtIndexPath,大致内容如下所示:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
- (UITableViewCell *)tableView:(UITableView *)tv cellForRowAtIndexPath:(NSIndexPath *)indexPath { UITableViewCell *cell; UILabel *label = nil; cell = [tv dequeueReusableCellWithIdentifier:@"Cell"]; if (cell == nil) { cell = [[[UITableViewCell alloc] initWithFrame:CGRectZero reuseIdentifier:@"Cell"] autorelease]; label = [[UILabel alloc] initWithFrame:CGRectZero]; [label setLineBreakMode:UILineBreakModeWordWrap]; [label setMinimumFontSize:FONT_SIZE]; [label setNumberOfLines:0]; [label setFont:[UIFont systemFontOfSize:FONT_SIZE]]; [label setTag:1]; [[cell contentView] addSubview:label]; } } |
这并不是完整的代码因为我们仅仅在创建单元格的时候初始化它的label,这段代码对应调用-dequeueReusableCellWithIdentifier之后的判断模块if(cell == nil)。
在这里我想强调两点:第一个,我们可以注意到label有一个标签与其对应,因为调用了-setTag:1。当cell不等于nil时这个标签可以用到。第二点,我们通过调用[[cell contentView] addSubview:label]来将label添加到单元格的内容视图中,这个只是在label初始化的时候用到。每调用这个函数都会添加label 到子视图序列中。下面我们会将这段代码补充完整,但之前先让我们看一下如何设置cell的高度。
计算cell的高度
在一个复杂的cell中,计算高度可能比较困难,但是你只需要关心那些高度会变化的部件就可以了。在我的例子中,唯一需要处理的就是添加到单元格中的label。我们根据文本的大小来计算cell 的高度,而文本的大小取决于文本的长度和文本字体。NSString类提供了函数-sizeWithFont来方便我们获取cell 的大小。下面的代码介绍了函数-heightForRowAtIndexPath:
1 2 3 4 5 6 7 8 9 10 11 12 |
- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath; { NSString *text = [items objectAtIndex:[indexPath row]]; CGSize constraint = CGSizeMake(CELL_CONTENT_WIDTH - (CELL_CONTENT_MARGIN * 2), 20000.0f); CGSize size = [text sizeWithFont:[UIFont systemFontOfSize:FONT_SIZE] constrainedToSize:constraint lineBreakMode:UILineBreakModeWordWrap]; CGFloat height = MAX(size.height, 44.0f); return height + (CELL_CONTENT_MARGIN * 2); } |
你会注意到我们用到了几个常量来计算cell 的大小,它们的定义如下所示:
#define FONT_SIZE 14.0f #define CELL_CONTENT_WIDTH 320.0f #define CELL_CONTENT_MARGIN 10.0f
常量CELL_CONTENT_WIDTH是整个cell的宽度。CELL_CONTENT_MARGIN是我们定义的页边空白,FONT_SIZE是我们采用文本的字体大小。
首先我们要创建一个内容宽度的约束条件。CGSizeMake的第一个参量是总共的内容宽度减去两个页边空白。因为左边和右边各有一个页边空白。第二个参数是我们提供的最大数值。这个约束条件在后面的函数-sizeWithFont中将会用到。在-sizeWithFont中我们设置为 UILineBreakModeWordWrap来获取在允许自动换行的情况和上面提到的约束条件下正确的大小。最后我们使用MAX宏设置cell的高度,并且保证cell 的高度不会小于44个像素,因为它返回size.height和44两个数中的最大值。最后,我们将上下的页边空白考虑进去得到最后的结果。
为了使得读者形象化的了解页边空白,下面一个截图可以看出有一个边界环绕着label。调用[[label layer] setBorderWidth:2.0f]可以显示该边界从而方便我们看到页边空白。
计算并设置UILabel框大小
在前面我们用来计算高度的方法也是我们用来设置UILabel框大小的方法。下面将-cellForRowAtIndexPath代码补充完整:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 |
- (UITableViewCell *)tableView:(UITableView *)tv cellForRowAtIndexPath:(NSIndexPath *)indexPath { UITableViewCell *cell; UILabel *label = nil; cell = [tv dequeueReusableCellWithIdentifier:@"Cell"]; if (cell == nil) { cell = [[[UITableViewCell alloc] initWithFrame:CGRectZero reuseIdentifier:@"Cell"] autorelease]; label = [[UILabel alloc] initWithFrame:CGRectZero]; [label setLineBreakMode:UILineBreakModeWordWrap]; [label setMinimumFontSize:FONT_SIZE]; [label setNumberOfLines:0]; [label setFont:[UIFont systemFontOfSize:FONT_SIZE]]; [label setTag:1]; [[label layer] setBorderWidth:2.0f]; [[cell contentView] addSubview:label]; } NSString *text = [items objectAtIndex:[indexPath row]]; CGSize constraint = CGSizeMake(CELL_CONTENT_WIDTH - (CELL_CONTENT_MARGIN * 2), 20000.0f); CGSize size = [text sizeWithFont:[UIFont systemFontOfSize:FONT_SIZE] constrainedToSize:constraint lineBreakMode:UILineBreakModeWordWrap]; if (!label) label = (UILabel*)[cell viewWithTag:1]; [label setText:text]; [label setFrame:CGRectMake(CELL_CONTENT_MARGIN, CELL_CONTENT_MARGIN, CELL_CONTENT_WIDTH - (CELL_CONTENT_MARGIN * 2), MAX(size.height, 44.0f))]; return cell; } |
要注意if(cell == nil)模块是初始化代码,只在cell创建的时候运行一次。该模块外部代码每次都会执行只要在每次数据更新或者窗口拖拽之后调用了-cellForRowAtIndexPath。
也就是说,每次都需要设置label中文本内容以及设置label外框大小。注意如果label处于未初始化状态,我们需要通过调用[cell viewWithTag:1]来获取UILabel的句柄。这段代码跟前面计算高度的代码基本相同。
总结
动态计算单元格cell的高度真的并不困难。如果你有一个很复杂的cell,你只需要根据内容宽度和特定文本字体的大小来确定cell的高度。如果你不清楚你的外框显示在什么地方,只需要通过调用[[view layer] setBorderWidth:2.0f]来使外框显示即可。这会有助于你了解绘图过程以及更快地在更深的层次理解绘图显示的问题。
演示工程文件:DynamicHeights Demo Project
作者:Matt Long
原文链接:http://www.cimgf.com/2009/09/23/uitableviewcell-dynamic-height/
发表评论
-
iOS 自定义UIActionSheet
2012-12-18 16:07 16424一:模态视图 UIActi ... -
UIView 和 CALayer的那点事
2012-11-17 23:51 30782UIView 和 CALayer的那点事 (1 ... -
iOS Open Source : Popover API for iPhone
2012-01-20 15:02 1948http://iphonedevelopertips.com/ ... -
ios 任务、线程、定时器
2011-12-26 18:09 8032一:operations(任务) cocoa提供了三种 ... -
ios url缓存策略——NSURLCache、 NSURLRequest
2011-12-26 17:09 24360一:url 缓存策略 NSURLRequest ... -
ios NSInvocation简单使用
2011-12-22 16:39 6379在ios直接调用某个对象的消息是方法有两种: 一:perfo ... -
iphone 对Web Services的三种请求方式soap get post
2011-11-09 10:57 6444一:Using SO AP 1.1 POST / ... -
sdk3.2手势实例
2011-11-09 10:11 1747#import <UIKit/UIKit.h>@i ... -
关于iphone 利用hpple解析html的问题
2011-08-04 18:28 2229最近在用happe解析html中的图片。有个翻页操作,如果请 ... -
iphone hpple 解析html,xml
2011-07-19 16:21 2755使用Objective-C解析HTML或者XML,系统自带有两 ... -
激活 iPhone通过 GPRS 连接服务器功能的代码
2011-05-13 15:14 1663如果您的 iPhone 应用里含有连接服务器的功能,也许会遇到 ... -
address book api 图型
2011-04-28 15:51 1151最近要搞地址簿了,整理一下 -
[OmniGraffle]iPhone app原型制作工具
2011-04-06 17:35 3962在写程序之前,我们通常需要做一些mockup出来(不知道款爷有 ... -
自定义uislider 样式
2011-04-04 21:28 3844UIImage *stetchLeftTrack= [[UII ... -
iphone 下AsyncSocket网络库编程
2011-04-02 21:04 7647iphone的标准推荐CFNetwork ... -
进阶AlertView运用 - 登入设计
2011-04-01 17:52 3043说明:示范如何利用AlertView来制作系统登入的介面程式碼 ... -
iPad UIPopoverController弹出窗口的位置和坐标
2011-04-01 17:42 2008优化规则: TodoViewControlle ... -
iPhone系统自动化测试
2011-04-01 17:39 2624首先mac系统是必备的2 安装iPhone SD ... -
iphone上面编写具有root权限的程序
2011-04-01 17:31 6302正常途径下, 我们编写的程序发布在App store上, 使用 ... -
聊天。。。。。
2011-04-01 17:13 1095是得分手段
相关推荐
本Demo "swift-动态计算UITableViewCell高度的Demo" 正是针对这一需求进行的实践。 首先,我们要明白在UITableView中,每个cell的高度是由其内容决定的。为了实现动态高度,我们需要遵循UITableViewDataSource协议...
UITableViewCell的动态高度计算一直是一个交流讨论的话题,也已经有了很多实现的机制,但更多的是需要一些扩展类什么的,还有需要计算什么的,使用起来比较麻烦。因此这里推荐一种自动计算高度的方法,他是在我的...
"ios-动态控制TableViewCell高度.zip"这个压缩包文件提供了一个名为CellHeightDemo的示例,它旨在教你如何实现这一功能。 首先,我们要理解为什么需要动态调整Cell高度。在UITableView中,每个Cell的高度通常是固定...
本教程通过"ios-动态设置cell高度.zip"压缩包中的XiaoDongDemo2项目,将详细介绍如何实现这一功能。 首先,我们需要了解UITableView的工作原理。UITableView是一个用于显示列表数据的视图,每个列表项被称为一个...
本项目“ios-UITableViewCell折叠效果.zip”主要关注如何实现UITableView中UITableViewCell的动态高度调整以及折叠拉伸效果,这是一项增强用户体验的重要技巧。下面我们将深入探讨这个主题。 首先,我们来理解`...
本项目“ios-TableViewCell动态输入 自适应高度 UITextView DynamicHeight.zip”正解决了这个问题,尤其适用于iOS 8.0及更高版本。 首先,我们要理解的是UITableViewCell的动态高度计算。在iOS 8.0之后,苹果引入了...
`iOS-Masonry Cell 动态高度 自动布局 Autolayout.zip`这个压缩包中包含了一个名为`MASCellTest`的项目,它展示了如何利用Masonry库来实现UITableViewCell的动态高度计算。Masonry是一个基于AutoLayout的轻量级框架...
"ios-一行代码cell高度自适应.zip"这个压缩包提供了一种简洁的方法来解决这个问题,无需繁琐的Auto Layout约束,而是利用Objective-C的Runtime机制动态计算UILabel的高度,进而自动调整UITableViewCell的高度。...
在这个场景下,我们需要理解如何动态计算并设置UITableViewCell的高度。 首先,我们要知道在UITableView中,每个cell的高度默认是固定的,但为了适应不同内容的显示,我们通常需要自定义cell的高度。这涉及到...
在处理像“ios-cell高度动态计算.zip”这样的项目时,我们主要关注的是如何根据内容动态计算UITableViewCell的高度。这通常是由于列表中的每个单元格可能包含不同数量或不同类型的数据,比如图片、文字等,因此它们...
这就是AutoLayout在动态计算UITableViewCell高度中的作用。 AutoLayout是苹果提供的布局管理系统,它允许开发者在不同尺寸和方向的屏幕上创建适应性界面。在UITableView中,通过设置AutoLayout约束,我们可以根据...
本教程将通过“ios-cell autoLayout 自适应高度.zip”这个压缩包,帮助你理解如何在UITableView中使用AutoLayout实现自适应Cell的高度。这非常适合iOS新手入门,因为内容简单且配有注释。 首先,我们需要了解...
实现动态计算UITableViewCell高度主要涉及以下几个步骤: 1. **启用自动布局(Auto Layout)**:在iOS开发中,我们通常使用Auto Layout来定义视图的约束,以便根据内容自动调整大小。在UITableViewCell中,确保所有...
标题"ios-cell的自动计算高度.zip"和描述"根据文字的大小,动态的计算着cell的高度的大小"所指向的知识点,就是如何在iOS应用中让UITableViewCell根据其内容自动调整高度。 在传统的UITableView编程中,开发者通常...
这个压缩包文件“ios-计算label的高度.zip”显然包含了一个示例,用于演示如何根据UILabel的内容动态计算其高度,并根据这个高度来设置UITableViewCell的高度。文件“CircleInfoCell.m”可能是实现这个功能的代码。 ...
"ios-动态计算行高.zip"这个压缩包文件,很显然提供了一个关于如何实现这一功能的示例。下面我们将详细探讨这一主题。 首先,我们来看动态计算行高的基础概念。在UITableView中,每个cell的大小是由`heightForRowAt...
"ios-Cell自适应高度.zip"这个压缩包提供的内容显然是关于如何让UITableViewCell根据其内容动态调整高度的示例代码。在本篇文章中,我们将深入探讨这个主题,了解如何实现自适应高度的UITableViewCell。 首先,`...
而动态高度的UITableViewCell则可以根据内容自适应高度,使得界面更加灵活且美观。本示例将详细解析如何在Objective-C中实现具有动态高度的UITableViewCell。 首先,我们需要理解UITableViewDelegate中的两个关键...
在iOS开发中,创建自适应的UITableViewCell高度是一项常见的需求,尤其在显示内容不固定或者内容长度可变的情况下。这个“ios-自适应cell高度.zip”文件提供的示例应该就是一个简单的教程,展示了如何通过纯代码实现...
在iOS开发中,UITableView是一种非常常见的控件,用于展示数据列表...通过学习和理解这个项目,开发者可以掌握自定义cell、数据源和代理方法的使用,以及如何实现列表的动态扩展效果,这对于开发复杂的UI是非常有用的。