我有一个非常简单的观点,我不能为我的生活找出问题所在。我已成功使用自动布局,systemLayoutSizeFittingSize
用于相当复杂的自定义UITableViewCells
。这是我第一次将它用于UIView
(用于UITableView.tableHeaderView
)而我无法使用它。
我在视图中有一个简单的标签,我想覆盖整个视图。我已将Trailing
,Leading
,Top
和Bottom
约束添加到针对父对应边的标签上。当我这样做时,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
。我不确定是否存在差异。
答案 0 :(得分:1)
我发现了问题,但我不明白为什么。对于UITableViewHeader,我不能为视图做典型的自动布局。也就是说,我必须将translatesAutoresizingMaskIntoConstraints
设置为true
。实际上,我不能使用自动布局作为标题视图,我必须手动设置框架。
在标题视图中,我可以成功使用子视图的自动布局。
所以我的算法就像构建tableHeaderView
:
frame.width
以匹配父tableView.frame.width
systemLayoutSizeFittingSize
计算身高frame.height
这对我有用。如果我创建标题视图并将translatesAutoresizingMaskIntoConstraints
设置为false
,则无法使其生效。
答案 1 :(得分:0)
根据Apple Visual Format Language,以下内容似乎是设置了&#39; 0&#39; HeaderView上的高度约束。
E.g。
"<NSLayoutConstraint:0x7fbb71de31d0 V:[app.HeaderView:0x7fbb71d2c490(0)]>"
我首先要研究这一点,因为高度为0可能会破坏你的其他标签限制的顶部和底部间距。