使用自动布局的 UItableviewcell 中的多行 UIlabel
Multiple line UIlabel in UItableviewcell using Autolayout
我已将 setMaXPreferredLayoutWidth
设置为 UILabel
并将所有必需的约束添加到 UIlabel
现在我可以在我的 UItableviewcell
中看到多行 UIlabel
但是我的问题是我根据 MaxpreferredLayoutWidth
值在 UIlabel
的顶部和底部获得了额外的填充。
当我将 MaxPreferreLayoutWidth
设置为 200 时,我得到了这个
当我将 MaxPreferreLayoutWidth
设置为 100 时,我得到了这个
一般UIlabel
身高取决于preferredMaxLayoutWidth
。
任何人都可以告诉我如何删除这个额外的填充并呈现 UIlabel
的确切高度吗?
试试这个代码,
CGSize suggestedSize = [textWithMultipleLines sizeWithFont:myLabel.font constrainedToSize:CGSizeMake(width, FLT_MAX) lineBreakMode:NSLineBreakByWordWrapping];//here "width" is the maximum acceptable width of myLabel
CGRect labelFrame = myLabel.frame;
labelFrame.size = suggestedSize;
[myLabel setFrame:labelFrame];
并在
- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath{
{
//get the string assigned to label
CGSize suggestedSize = [stringAssignedToLabel sizeWithFont:myLabel.font constrainedToSize:CGSizeMake(width, FLT_MAX) lineBreakMode:NSLineBreakByWordWrapping];
return suggestedSize.height+5;
}
最简单的方法是扩展您自己的 UITableViewCell class,并在那里创建一个 UILabel,同时创建一个 public getMethod:
Interface:
- (CGFloat)getLabelHeight;
Implementation:
- (CGFloat)getLabelHeight {
return label.frame.size.height
}
TableView File:
-(CGFloat)heightForRowAtIndexPath {
return [cell getLabelHeight]
}
- (UITableViewCell *)cellForRowAtIndexPath:(NSIndexPath)indexPath {
your_cell_instance = [[Your_Cell_Class alloc]initWithTableViewCellStyle:UITableViewCellStyleDefault andReuseID:your_reuse_id];
your_cell_instance.text = @"Your Long Text"
[your_cell_instance setNumberOfLines:0];
[your_cell_instance sizeToFit];
return your_cell_instance;
}
重要的是首先设置标签的文本,然后 // 行数和 sizeToFit //
并且您需要在适当的时候重新加载 tableView 数据
我还没来得及测试,但我希望它有用。
我们在heightForRowAtIndexPath
中计算单元格的高度时必须设置tableviewcell的框架
例如:
[tableViewCell setFrame:CGRectMake(0, 0, CGRectGetWidth(self.tableView.bounds), CGRectGetHeight(tableViewCell.bounds))];
然后在 UItableviewcell
的 layoutSubviews
方法中我们必须设置 preferredMaxLayoutwidth
例如:
[self.multilineLabel setPreferredMaxLayoutWidth:CGRectGetWidth(self.bounds)];
我已将 setMaXPreferredLayoutWidth
设置为 UILabel
并将所有必需的约束添加到 UIlabel
现在我可以在我的 UItableviewcell
中看到多行 UIlabel
但是我的问题是我根据 MaxpreferredLayoutWidth
值在 UIlabel
的顶部和底部获得了额外的填充。
当我将 MaxPreferreLayoutWidth
设置为 200 时,我得到了这个
当我将 MaxPreferreLayoutWidth
设置为 100 时,我得到了这个
一般UIlabel
身高取决于preferredMaxLayoutWidth
。
任何人都可以告诉我如何删除这个额外的填充并呈现 UIlabel
的确切高度吗?
试试这个代码,
CGSize suggestedSize = [textWithMultipleLines sizeWithFont:myLabel.font constrainedToSize:CGSizeMake(width, FLT_MAX) lineBreakMode:NSLineBreakByWordWrapping];//here "width" is the maximum acceptable width of myLabel
CGRect labelFrame = myLabel.frame;
labelFrame.size = suggestedSize;
[myLabel setFrame:labelFrame];
并在
- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath{
{
//get the string assigned to label
CGSize suggestedSize = [stringAssignedToLabel sizeWithFont:myLabel.font constrainedToSize:CGSizeMake(width, FLT_MAX) lineBreakMode:NSLineBreakByWordWrapping];
return suggestedSize.height+5;
}
最简单的方法是扩展您自己的 UITableViewCell class,并在那里创建一个 UILabel,同时创建一个 public getMethod:
Interface:
- (CGFloat)getLabelHeight;
Implementation:
- (CGFloat)getLabelHeight {
return label.frame.size.height
}
TableView File:
-(CGFloat)heightForRowAtIndexPath {
return [cell getLabelHeight]
}
- (UITableViewCell *)cellForRowAtIndexPath:(NSIndexPath)indexPath {
your_cell_instance = [[Your_Cell_Class alloc]initWithTableViewCellStyle:UITableViewCellStyleDefault andReuseID:your_reuse_id];
your_cell_instance.text = @"Your Long Text"
[your_cell_instance setNumberOfLines:0];
[your_cell_instance sizeToFit];
return your_cell_instance;
}
重要的是首先设置标签的文本,然后 // 行数和 sizeToFit //
并且您需要在适当的时候重新加载 tableView 数据
我还没来得及测试,但我希望它有用。
我们在heightForRowAtIndexPath
中计算单元格的高度时必须设置tableviewcell的框架
例如:
[tableViewCell setFrame:CGRectMake(0, 0, CGRectGetWidth(self.tableView.bounds), CGRectGetHeight(tableViewCell.bounds))];
然后在 UItableviewcell
的 layoutSubviews
方法中我们必须设置 preferredMaxLayoutwidth
例如:
[self.multilineLabel setPreferredMaxLayoutWidth:CGRectGetWidth(self.bounds)];