如何在iOS中创build多行表格单元格?
我怎样才能让第二个单元格展开,以适应文本,而不是缩放文本? 在iOS中是否有内置的方法,或者我必须想出一些家庭式的解决scheme? 如果您在iOS联系人应用程序中查找,那么地址就有这样一个框。 我找不到如何实现这个。
对于将来要实现这一点的人来说,下面是我的解决scheme的代码:
HEADER文件:
#define FONT_SIZE 22.0f #define CELL_CONTENT_WIDTH 320.0f #define CELL_CONTENT_MARGIN 5.0f
实施文件:
- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath { if (indexPath.section == 0 && indexPath.row == 1) { NSString *text = [atmAnnotation address]; CGSize constraint = CGSizeMake(CELL_CONTENT_WIDTH - (CELL_CONTENT_MARGIN * 2), 20000.0f); CGSize size = [text sizeWithFont:[UIFont systemFontOfSize:FONT_SIZE] constrainedToSize:constraint lineBreakMode:UILineBreakModeWordWrap]; NSLog(@"Size for address is Height:%f Width:%f",size.height,size.width); CGFloat height = MAX(size.height, 44.0f); return height + (CELL_CONTENT_MARGIN * 2); } return 44.0f; }
以下是结果的截图:
不幸的是,你将不得不自己实现这个function。 您需要使用各种方法和callback来计算行和标签的高度。 如果你需要一些帮助入门,我可以修改这个答案,包括一些示例代码。 否则,我确定在SO或Google上有一些相关的问题可以帮助您入门。 总之,但是:
- 确定
UITableViewDelegate
方法-tableView:heightForRowAtIndexPath:
的高度-tableView:heightForRowAtIndexPath:
您可能需要使用NSString UIKit添加方法来计算您的string与给定的字体大小有多高,等等。从这个委托方法返回适当的高度。 - 确保您的标签(以IB或以编程方式configuration)设置为使用多行。 如果将
numberOfLines
设置为0,则标签将根据需要使用尽可能多的行。 - 在
-tableView:cellForRowAtIndexPath:
UITableViewDataSource
实现中,您需要使用与之前相同的逻辑来确定标签的框架。 设置你想要的文字,然后改变框架,使标签足够高,几乎不适合所有的文字。
在地址为detailTextLabel的地方,使用支持尽可能多行的UILabel作为地址,3就足够了。 再加上Paul Bently's
答案,你应该很好走。
实行:
- (float)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath;
在你的表代表。 对于传递的indexPath中的不同行和部分,返回不同的高度以适应您的标签。
确保IB中标签的“调整到适合”不勾选(如果使用代码完成属性adjustsFontSizeToFitWidth
)。
我遇到了同样的问题。 我发现了一个不需要太多硬编码的替代解决scheme,并且允许您对Interface Builder中的标签进行修改,这将在高度计算中反映出来。
- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath { if (indexPath.section == 0 && indexPath.row == 1) { NSString *text = [atmAnnotation address]; UITableViewCell* cell = [tableView dequeueReusableCellWithIdentifier:@"MyIdentifier"]; cell.textLabel.text = text; [cell.textLabel sizeToFit]; CGFloat height = MAX( 44, cell.textLabel.bounds.size.height ); return height + CELL_CONTENT_MARGIN * 2; } return 44.0f; }
唯一的缺点是,这将导致一些额外的临时UITableViewCell分配,但表视图将立即回收它们,所以我不认为这应该是一个大问题。