UITableViewCell通过自动布局获取子视图高度

时间:2014-02-24 21:05:46

标签: ios iphone cocoa-touch uitableview

我有一个UITableViewCell子类,我正在使用自动布局,并且我希望在自动布局过程完成后获得UILabel子视图的高度。

我尝试了layoutSubviews并获得了frame的{​​{1}}属性,但这似乎是标签在被回收之前的旧高度。

然后我试图覆盖UILabel,但我发现它从未被调用过。

完成自动布局并应用约束后,如何获取layoutIfNeeded子视图的帧?当然这应该很简单!

1 个答案:

答案 0 :(得分:0)

假设标签是表格单元格内容视图的直接子视图,那么我的问题是您可以在layoutSubviews方法中访问标签边界的最终屏幕上的内容视图值。表格单元格(而不是表格单元格本身的layoutSubviews方法)。

但是,如果您的标签不是多行的,那么只需在attributedText属性中随时抓取标签的高度,如下所示:

NSAttributedString *attrString = label.attributedText;
CGFloat labelHeight = ceilf(attrString.size.height);

或者,您可以使用标签的font属性来确定标签的高度(同样,仅当标签不是多行标签时):

UIFont *font = label.font;
CGFloat labelHeight = ceilf(font.lineHeight);

如果您的标签是多线的,那么计算线高的最佳选择如下:

// but you have to know the label's width
CGFloat labelWidth = …
NSAttributedString *attrString = label.attributedText;
CGRect rect = [attrString boundingRectWithSize:CGSizeMake(labelWidth, FLT_MAX) options:NSStringDrawingUsesLineFragmentOrigin context:nil];
CGFloat labelHeight = ceilf(rect.size.height);

您可以手动计算标签的宽度。通常它是主视图的边界宽度减去水平间距边距的固定量。