具有多行 UILabel 的自定义 Tableview 单元格需要动态高度

Posted

技术标签:

【中文标题】具有多行 UILabel 的自定义 Tableview 单元格需要动态高度【英文标题】:Custom Tableview cell with multiline UILabel needs dynamic height 【发布时间】:2016-01-23 04:05:20 【问题描述】:

我使用 Interface Builder 创建了一个自定义 TableView 单元格。这是它的样子:

对于描述标签,我需要它来自动换行,所以我这样设置:

在我的 SettingsPageViewController 中,我重写了以下表格视图方法:

@implementation SBSettingsViewController

    NSArray *settingHeaders;
    NSArray *settingDescriptions;

- (void)viewDidLoad 
[super viewDidLoad];

[self setupLeftMenuButton];
// Do any additional setup after loading the view from its nib.
settingHeaders = [NSArray arrayWithObjects:@"Label Header 1",@"Label Header 2",nil];
settingDescriptions = [NSArray arrayWithObjects:@"Two line description Two line description Two line description ",@"One Line Description",nil];


- (void)didReceiveMemoryWarning 
[super didReceiveMemoryWarning];
// Dispose of any resources that can be recreated.


- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section

return [settingHeaders count];


- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
static NSString *simpleTableIdentifier = @"SettingsTableCell";

SettingsTableViewCell *cell = (SettingsTableViewCell *)[tableView dequeueReusableCellWithIdentifier:simpleTableIdentifier];
if (cell == nil)

    NSArray *nib = [[NSBundle mainBundle] loadNibNamed:@"SettingsTableCell" owner:self options:nil];
    cell = [nib objectAtIndex:0];


cell.settingsHeaderLabel.text = [settingHeaders objectAtIndex:indexPath.row];
cell.settingsDescriptionLabel.text = [settingDescriptions objectAtIndex:indexPath.row];

cell.settingsDescriptionLabel.lineBreakMode = NSLineBreakByWordWrapping;
cell.settingsDescriptionLabel.numberOfLines = 0;
CGRect appFrame=[[UIScreen mainScreen] bounds];
cell.settingsDescriptionLabel.preferredMaxLayoutWidth = appFrame.size.width - 15;

[cell.settingsDescriptionLabel sizeToFit];
[cell.settingsDescriptionLabel setNeedsDisplay];
[cell layoutIfNeeded];

return cell;


-(void)tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath

if ([tableView respondsToSelector:@selector(setSeparatorInset:)]) 
    [tableView setSeparatorInset:UIEdgeInsetsZero];


if ([tableView respondsToSelector:@selector(setLayoutMargins:)]) 
    [tableView setLayoutMargins:UIEdgeInsetsZero];


if ([cell respondsToSelector:@selector(setLayoutMargins:)]) 
    [cell setLayoutMargins:UIEdgeInsetsZero];



- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath

return 85;

生成的页面如下所示:

如您所见,第一个 tableview 单元格的描述标签没有自动换行。它只是切断。 如何将其包裹起来?

另外,我希望动态调整 Tableview 单元格的高度。我试图将 heightForRowAtIndexPath: 更改为 UITableViewAutomaticDimension 但这只是让它看起来非常奇怪:

如何调整表格视图高度,以使 1 行描述标签略短的行?

感谢您的帮助!

【问题讨论】:

sizeToFit() returns wrong height - Need to find cell width in heightForRow的可能重复 查看此链接 - ***.com/questions/34724783/… 【参考方案1】:

将标题标签的顶部、前导、尾随到超级视图和底部(垂直)约束到描述标签。 与描述标签相同 > 超级视图的前导、尾随和下边距。

现在设置标题标签高度修复和描述标签使多行(Lines = 0)

对于在 viewDidLoad 中设置的表视图

_tableView.estimatedRowHeight = 100.0;
_tableView.rowHeight = UITableViewAutomaticDimension;

让我知道这是否有效...

【讨论】:

初学者问题:如何从我的 XIB 文件中连接我的 tableView 以便 ViewController 可以访问它?我有数据源和委托连接到文件的所有者。我还有什么需要做的吗? 这项工作我遵循了上面推荐的一些教程,并将我在 XIB 中的 tableview 中的 IBOutlet 添加到我的 viewcontroller.m 文件中......谢谢大家!

以上是关于具有多行 UILabel 的自定义 Tableview 单元格需要动态高度的主要内容,如果未能解决你的问题,请参考以下文章

如何创建具有最大宽度的多行 UILabel?

具有多个 UILabel 和图像的自定义按钮

使用 UITableViewAutomaticDimension 显示多行标签的自定义单元格

基于多行 UILabel 自动调整 UIView 的大小

具有自动布局的自定义 UITableViewCell 会导致警告

具有自动布局配置的 UITableCell 被截断的多行 UILabel