自我调整大小的 UITableViewCell 中的 UIlabel 和 UIView 高度计算

Posted

技术标签:

【中文标题】自我调整大小的 UITableViewCell 中的 UIlabel 和 UIView 高度计算【英文标题】:UIlabel and UIView height calculation inside self resizing UITableViewCell 【发布时间】:2017-10-22 13:43:57 【问题描述】:

我有一个UITableViewCell,它用作自调整大小的tableViewCell。它里面有一个UILabel、一个UIView和一个UIButton。所有这些都垂直放置在里面。我希望 UILabelUIView 在需要时自动调整大小。他们正在按预期调整大小。但问题是,调整大小后我无法获得它们的高度。 frame.size.height 总是显示之前的高度。

这是 xib 文件的图像:

【问题讨论】:

请问您何时获取frame.size.height?是在layoutSubviews吗? 不,我在 cellForRowAtIndexPath 中调用它。前 10 小时 :( 。感谢任何帮助伙伴。 其实我通过调用[theView layoutIfNeeded]得到了UIView的高度。但是 UILabel 太疯狂了,它从 xib 文件返回默认高度。 我已经在我的项目中进行了测试(我有一个只有一个标签的单元格,它可以尽可能地增长)。根据结果​​,不调用layoutIfNeeded,返回默认高度。通过调用layoutIfNeeded,它会返回更多(之前的值是 27.5,现在是 33.5),但不是正确的。 willDisplayCell 也不起作用,但 customCell 中的 layoutSubviews 在第一次通话后起作用。第一次通话也是 27.5。希望这会有所帮助。 所以...@EDUsta,我找到了一种方法。非常感谢您的帮助。我回答了我自己的问题。查看答案。 【参考方案1】:

我通过这样做获得了身高。 cell.detailsTextLabel 的高度是所需的高度。

UILabel *label = [[UILabel alloc] init];
label.numberOfLines = 0;
label.lineBreakMode = NSLineBreakByWordWrapping;
label.preferredMaxLayoutWidth = 373;

[label invalidateIntrinsicContentSize];
label.text = detailsString;
label.font= cell.detailTextLabel.font;

CGFloat theSweetLittleHeight = label.intrinsicContentSize.height;

【讨论】:

【参考方案2】:

我不确定您的自动布局是如何控制标签高度的,但也许您可以依靠根据将显示的文本和您已经使用的已知约束(例如 373 宽度)来确定标签的高度)

CGFloat maxWidth = 373, maxHeight;  // Whatever you desire here, 373 from your example

CGFloat messageHeight = ceilf([detailsString boundingRectWithSize:CGSizeMake(maxWidth, maxHeight)
                                                           options:<ANY_OPTIONS_HERE>
                                                        attributes:@NSFontAttributeName:detailTextLabel.font
                                                           context:nil].size.height);

【讨论】:

感谢您的回答。我试过了。没有太大帮助。 :) 它给你的高度是错误的还是没用? 确保指定options:NSStringDrawingUsesLineFragmentOrigin。每当我使用这种方法时,只要传递正确的字体(字体名称、大小和粗细)和最大 CGSize,它就会为我提供从调用 layoutIfNeeded 或 layoutSubviews 调整到的确切高度。此外,如果您有任何限制来控制适合文本之外的高度,请在获取 messageHeight 后对其进行静态处理【参考方案3】:

您可以为标签和视图的高度约束创建一个出口,如下所示,并在 tableView 加载后从中获取值。

 @IBOutlet weak var labelHeightConstraint: NSLayoutConstraint!
 @IBOutlet weak var viewHeightConstraint: NSLayoutConstraint!
 let labelHeight = labelHeightConstraint.constant
 let viewHeight = viewHeightConstraint.constant

【讨论】:

以上是关于自我调整大小的 UITableViewCell 中的 UIlabel 和 UIView 高度计算的主要内容,如果未能解决你的问题,请参考以下文章

具有三个 UILabel 的自我调整大小的单元格不起作用

如何在其中使用UIStackView自定义UITableViewCell的大小

在 UITableViewCell 中调整 UITextView 的大小

在 UITableViewCell 中自动调整 UITextField 的大小

在自定义 UITableViewCell 中调整 UITextView 的大小

在 UITableViewCell 中调整 UIImageView 的大小