自我调整大小的 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
。所有这些都垂直放置在里面。我希望 UILabel
和 UIView
在需要时自动调整大小。他们正在按预期调整大小。但问题是,调整大小后我无法获得它们的高度。 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 高度计算的主要内容,如果未能解决你的问题,请参考以下文章
如何在其中使用UIStackView自定义UITableViewCell的大小
在 UITableViewCell 中调整 UITextView 的大小
在 UITableViewCell 中自动调整 UITextField 的大小