使用自动布局和systemLayoutSizeFittingSize

时间:2015-02-05 04:31:38

标签: ios objective-c swift autolayout

我有一个非常简单的观点,我不能为我的生活找出问题所在。我已成功使用自动布局,systemLayoutSizeFittingSize用于相当复杂的自定义UITableViewCells。这是我第一次将它用于UIView(用于UITableView.tableHeaderView)而我无法使用它。

我在视图中有一个简单的标签,我想覆盖整个视图。我已将TrailingLeadingTopBottom约束添加到针对父对应边的标签上。当我这样做时,systemLayoutSizeFittingSize会计算出正确的height,但我收到以下错误:

Unable to simultaneously satisfy constraints.
    Probably at least one of the constraints in the following list is one you don't want. Try this: (1) look at each constraint and try to figure out which you don't expect; (2) find the code that added the unwanted constraint or constraints and fix it. (Note: If you're seeing NSAutoresizingMaskLayoutConstraints that you don't understand, refer to the documentation for the UIView property translatesAutoresizingMaskIntoConstraints) 
(
    "<NSLayoutConstraint:0x7fbb71d9a310 V:|-(5)-[UILabel:0x7fbb71df5120'Test Label']   (Names: '|':mailapp.MailTableHeaderView:0x7fbb71d2c490 )>",
    "<NSLayoutConstraint:0x7fbb71d2ebf0 UILabel:0x7fbb71df5120'Test Label'.bottom == app.HeaderView:0x7fbb71d2c490.bottom - 5>",
    "<NSLayoutConstraint:0x7fbb71de31d0 V:[app.HeaderView:0x7fbb71d2c490(0)]>"
)

Will attempt to recover by breaking constraint 
<NSLayoutConstraint:0x7fbb71d2ebf0 UILabel:0x7fbb71df5120'Test Label'.bottom == app.HeaderView:0x7fbb71d2c490.bottom - 5>

Make a symbolic breakpoint at UIViewAlertForUnsatisfiableConstraints to catch this in the debugger.
The methods in the UIConstraintBasedLayoutDebugging category on UIView listed in <UIKit/UIView.h> may also be helpful.

现在,如果我删除标签上的“bottom”约束,则自动布局正常工作,但现在systemLayoutSizeFittingSize返回0.

使约束满足自动布局引擎的正确方法是什么,以及让systemLayoutSizeFittingSize计算正确的大小?

正如我所提到的,最令人困惑的是我已经成功地将它用于复杂的自动布局,但我注意到所有这些都是UITableViewCells。我不确定是否存在差异。

2 个答案:

答案 0 :(得分:1)

我发现了问题,但我不明白为什么。对于UITableViewHeader,我不能为视图做典型的自动布局。也就是说,我必须将translatesAutoresizingMaskIntoConstraints设置为true。实际上,我不能使用自动布局作为标题视图,我必须手动设置框架。

在标题视图中,我可以成功使用子视图的自动布局。

所以我的算法就像构建tableHeaderView

一样
  • 使用任意框架
  • 创建标题视图
  • 计算约束(标题视图的子视图)
  • 设置标题视图的frame.width以匹配父tableView.frame.width
  • 布置标题视图
  • 使用systemLayoutSizeFittingSize计算身高
  • 更新标题视图&#39; frame.height

这对我有用。如果我创建标题视图并将translatesAutoresizingMaskIntoConstraints设置为false,则无法使其生效。

答案 1 :(得分:0)

根据Apple Visual Format Language,以下内容似乎是设置了&#39; 0&#39; HeaderView上的高度约束。

E.g。

"<NSLayoutConstraint:0x7fbb71de31d0 V:[app.HeaderView:0x7fbb71d2c490(0)]>"

我首先要研究这一点,因为高度为0可能会破坏你的其他标签限制的顶部和底部间距。