UITableviewCell 高度自动布局
Posted
技术标签:
【中文标题】UITableviewCell 高度自动布局【英文标题】:UITableviewCell height autolayout 【发布时间】:2014-11-06 05:18:32 【问题描述】:我有以下 UITableviewCell 布局,我正在使用自动布局来处理这个
=========
| Image | Name Label
| | Short description Label
=========
Description Label
这里的描述标签是可选的,它会根据内容隐藏/显示,我正在使用heightForRowAtIndexPath
计算单元格的高度
- (CGFloat)heightForTableView:(UITableView *)tableView cell:(UITableViewCell *)cell atIndexPath:(NSIndexPath *)indexPath
cell.bounds = CGRectMake(0, 0, CGRectGetWidth(tableView.bounds), CGRectGetHeight(cell.bounds));
[cell setNeedsLayout];
[cell layoutIfNeeded];
CGSize cellSize = [cell.contentView systemLayoutSizeFittingSize:UILayoutFittingCompressedSize];
// Add extra padding
CGFloat height = cellSize.height;// + 1;
return height;
即使我隐藏了隐藏描述标签,它也会为单元格返回相同的高度,我缺少什么?
谁能建议使用自动布局处理此类场景的最佳方法?
编辑 1:设置空的作品,但有没有更好的方法?
【问题讨论】:
可以显示计算单元格高度的完整代码吗? 你在哪里隐藏标签?在调用此方法之前? 用模型配置时是的 能否请您尝试将一个空字符串设置为 detailLabel 设置空作品但有没有更好的办法? 【参考方案1】:heightForRowAtIndexPath 也会为所有行调用。因此,对于您隐藏描述标签的行,对于同一行,您可以在 heightForRowAtIndexPath 方法中设置高度。
例如。 对于第 4 行,您想通过检查某些条件来隐藏描述标签。
在 heightForRowAtIndexPath 中,您可以检查同一行的相同条件,并且可以在不显示描述标签的情况下返回所需的高度。
让我们说,
if(description.length==0)
return 100;// description label hidden
else
return 140;// description label shown
【讨论】:
我更新了计算单元格高度的方法,我只希望它返回精确值 忘记计算单元高度的方法,试试我说的吧。它必须工作 我有很多不同的单元格,所以我不能简单地使用它【参考方案2】:我建议如下计算每个单元格的高度。通过查看您的问题,我假设如果没有描述标签,所有单元格都应该具有相同的高度,对吗?假设它是 60。因此,您需要做的就是根据每个单元格的描述文本计算每个单元格的高度,并将其添加到没有描述文本的单元格高度中。在您的heightForTableView
代表中会是这样的。
- (CGFloat)heightForTableView:(UITableView *)tableView cell:(UITableViewCell *)cell atIndexPath:(NSIndexPath *)indexPath
int cellWidth = 320; // assuming it is 320
int constantHeight = 60;
NSString * str = [[yourarray objectAtIndex:indexPath.row] objectForKey:@"DescriptionKey"];
int height = [self calculateHeightForText:str withWidth:cellWidth andFont:[UIFont systemFontOfSize:16]];
// replace systemFontSize with your own font
return height + constantHeight;
// Depreciated in ios7
- (int)calculateHeightForText:(NSString *)string withWidth:(int)width andFont:(UIFont *)font
CGSize textSize = [string sizeWithFont:font constrainedToSize:CGSizeMake(width, 20000) lineBreakMode: NSLineBreakByWordWrapping];
return ceil(textSize.height);
// Introduced in iOS7
- (int)calculateHeightForText:(NSString *)string withWidth:(int)width andFont:(UIFont *)font
int maxHeightForDescr = 1000;
NSDictionary *attributes = @NSFontAttributeName: font;
CGRect rect = [string boundingRectWithSize:CGSizeMake(width, maxHeightForDescr)
options:NSStringDrawingUsesLineFragmentOrigin
attributes:attributes
context:nil];
return rect.size.height;
我为 calculateHeightForText 编写了两种方法,一种在 iOS7 中已被贬值,适用于 iOS6 和更少以及 iOS7,但第二种方法是 iOS7 的推荐方法,但不适用于 iOS7。如果您发现一些令人困惑的事情,或者需要任何进一步的帮助,请告诉我。很乐意提供进一步的帮助。
【讨论】:
以上是关于UITableviewCell 高度自动布局的主要内容,如果未能解决你的问题,请参考以下文章
如何使用自动布局动态更改 UITableViewCell 的高度?
uitableviewcell中的swift uitableview,自动布局始终高度为0
UITableViewCell 高度自动布局在 iOS 10 上不起作用
UITableViewCell 高度根据行内容使用自动布局动态计算