如何根据自定义单元格内的 UILabel 设置单元格高度
Posted
技术标签:
【中文标题】如何根据自定义单元格内的 UILabel 设置单元格高度【英文标题】:How to set cell height based on UILabel inside custom cell 【发布时间】:2014-07-21 13:50:41 【问题描述】:我使用UITableView
来显示数据库中的项目,并且我创建了自定义UITableViewCell
,它有一些标签。我最大的标签是名称描述。
每个单元格可以有不同的高度,但我不知道如何设置动态单元格高度。
我得到的只是标签末尾的三个点,单元格的高度始终约为 50。
如何根据其中的标签制作单元格高度?
#define FONT_SIZE 14.0f
#define CELL_CONTENT_WIDTH 320.0f
#define CELL_CONTENT_MARGIN 10.0f
- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
NSString *text = _orderProperty.Description;
CGSize constraint = CGSizeMake(CELL_CONTENT_WIDTH - (CELL_CONTENT_MARGIN * 2), 20000.0f);
CGSize size = [text sizeWithFont:[UIFont systemFontOfSize:FONT_SIZE]
constrainedToSize:constraint
lineBreakMode:NSLineBreakByWordWrapping];
CGFloat height = MAX(size.height, 44.0f);
return height + (CELL_CONTENT_MARGIN * 2);
更新
static NSString *CellIdentifier = @"orderDetailCell";
OrderDetailCustomCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
if(cell == nil)
[tableView registerNib:[UINib nibWithNibName:@"OrderDetailCustomCell" bundle:nil] forCellReuseIdentifier:CellIdentifier];
cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
OrderProperty* item = [_list objectAtIndex:indexPath.row];
cell.Title.text = item.Title;
NSString* _description = item.Description;
cell.Description.text = _description;
【问题讨论】:
查看此链接用户“2014”回答***.com/questions/17358322/… 【参考方案1】:你可以试试这样的
- (CGFloat) tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
int rowHeight =0.0f;
NSString *stringToSize=[NSString stringWithFormat:@"%@",longStringValue];
CGSize size = [stringToSize
sizeWithFont:[UIFont systemFontOfSize:15.0f]
constrainedToSize:CGSizeMake(300, 6000)
lineBreakMode:NSLineBreakByWordWrapping];
rowHeight = size.height+10;
return rowHeight;
您可以从用作表格数据源的数组中获取 longStringValue
【讨论】:
【参考方案2】:您可以在NSString
上使用以下类别,该类别使用NSTextContainer
和NSTextContainer
来计算文本的精确 大小。
NSString+Calculation.m
你的最终代码将是这样的:
- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
NSString *text = _orderProperty.Description;
CGSize constraint = CGSizeMake(CELL_CONTENT_WIDTH - (CELL_CONTENT_MARGIN * 2), 20000.0f);
CGSize size = [text usedSizeForMaxWidth:constraint.width
withFont:[UIFont systemFontOfSize:FONT_SIZE]];
CGFloat height = MAX(size.height, 44.0f);
return height + (CELL_CONTENT_MARGIN * 2);
【讨论】:
【参考方案3】:sizeWithFont 现已弃用,请使用以下方法根据标签内的文字设置出售高度。
-(CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
OrderProperty* item = [_list objectAtIndex:indexPath.row];
NSString *text = item.Description;
NSDictionary *stringAttributes = [NSDictionary dictionaryWithObject:[UIFont fontWithName:@"Helvetica" size:13] forKey:NSFontAttributeName];
CGSize constraint = CGSizeMake(CELL_CONTENT_WIDTH - (CELL_CONTENT_MARGIN * 2), 20000.0f);
CGSize expectedLabelSize = [content boundingRectWithSize: constraint options:NSStringDrawingTruncatesLastVisibleLine|NSStringDrawingUsesLineFragmentOrigin attributes:stringAttributes context:nil].size;
return expectedLabelSize.height+CELL_CONTENT_MARGIN * 2);
显然,您需要将字符串属性调整为您正在使用的任何内容。这些只是用于计算所需的单元格高度。
【讨论】:
这似乎接近解决方案。当我用表格加载视图时,一些长字符串单元格被截断。但是在向下和向上滚动后,它会固定到正确的高度。为什么会发生这种情况? 你能把你的 cellForRowAtIndexPath: 方法中的内容放上来吗?通常要检索该单元格中的文本,您将获得基于 indexPath 的文本。您的 cellForRow 详细信息可能会帮助我查看是否是这种情况 好的,谢谢。如果您可以添加行 OrderProperty* item = [_list objectAtIndex:index path] - 这将意味着单元格正在为正确的单元格拾取正确的文本。让我知道它现在是否有效。干杯以上是关于如何根据自定义单元格内的 UILabel 设置单元格高度的主要内容,如果未能解决你的问题,请参考以下文章
根据 JSON 文件中的内容文本调整带有 UILabel 的自定义单元格的大小
自定义 UICollectionViewCell 中的 UILabel 始终为空,无法更新文本
Excel单元格内容包含指定单元格内容时,如何把“指定单元格2”复制到“单元格1”后面?