有没有办法询问 AutoLayout 约束视图的高度?

Posted

技术标签:

【中文标题】有没有办法询问 AutoLayout 约束视图的高度?【英文标题】:Is there a way to ask an AutoLayout constrained view for it's height? 【发布时间】:2015-01-23 02:14:56 【问题描述】:

如果UIView 子类使用约束以编程方式布局,并且它包含一些多行标签,那么在给定任意宽度的情况下,如何计算该视图所需的高度?

我知道systemLayoutSizeFittingSize: 方法,但这些似乎期望像UILayoutFittingCompressedSize 这样的东西,而不是特定的宽度。如果我不提供另一个,它如何返回准确的高度或宽度?

【问题讨论】:

布局完成后你可以很容易地得到结果高度,但是如果你使用约束,为什么你需要在布局之前计算高度呢? 我打算将视图用作tableHeaderView。我希望避免在没有框架的情况下设置它并强制布局只是为了获得大小,然后才应用该大小并重新设置 tableHeaderView。 特别是-***.com/a/28102157/225253 啊!就自动布局而言,标题似乎是一个很大的疏忽,您可以尝试其他策略(例如使用自定义视图和 layoutSubviews),但在表标题方面不知道有什么更简单的方法。 【参考方案1】:

据我所知,您需要单独计算每个标签的大小。这应该可以计算单个多行标签的大小。

CGSize boundingRectSize = CGSizeMake(widthToConstrainTo, CGFLOAT_MAX);
NSDictionary *attributes = @NSFontAttributeName : [UIFont fontWithName:fontName size:fontSize];
CGRect labelSize = [labelString boundingRectWithSize:boundingRectSize 
                                             options:NSStringDrawingUsesLineFragmentOrigin | NSStringDrawingUsesFontLeading
                                          attributes:attributes
                                             context:nil];

【讨论】:

以上是关于有没有办法询问 AutoLayout 约束视图的高度?的主要内容,如果未能解决你的问题,请参考以下文章

如果为目标视图指定了初始帧,为啥 AutoLayout 不遵守约束?

添加到父视图时向 UITableView 添加 AutoLayout 约束

AutoLayout 和 Embedded stackview 约束冲突

AutoLayout:在代码中居中两个视图会导致约束异常?

Xcode Autolayout - 横向/纵向约束

如何使用 AutoLayout 根据父高度调整子视图高度而不添加/删除约束