针对初始零大小视图的不可满足的布局约束更好的解决方法?

时间:2013-08-23 03:59:52

标签: ios autolayout

虽然不是重要的,但看到这些警告是非常烦人的:

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:0x19288a20 V:|-(6)-[UILabel:0x19288640]   (Names: '|':_UITableViewHeaderFooterContentView:0x192885b0 )>",
    "<NSLayoutConstraint:0x19288a70 V:[UILabel:0x19288640]-(6)-|   (Names: '|':_UITableViewHeaderFooterContentView:0x192885b0 )>",
    "<NSAutoresizingMaskLayoutConstraint:0x19289cd0 h=--& v=--& V:[_UITableViewHeaderFooterContentView:0x192885b0(0)]>" )

Will attempt to recover by breaking constraint  <NSLayoutConstraint:0x19288a70 V:[UILabel:0x19288640]-(6)-|   (Names: '|':_UITableViewHeaderFooterContentView:0x192885b0 )>

我的约束没有错。当视图最初为零大小时,UIKit尝试使用这些约束对UITableViewHeaderFooterView进行布局时,会出现此问题。当然,任何积极的指标都无法满足任何限制。

一个明显的解决方法是为每个正面指标设置低于UILayoutPriorityRequired优先级或使用NSLayoutRelationLessThanOrEqual而不是NSLayoutRelationEqual。但是我需要将这些拐杖添加到我对所有观点的所有约束中。更不用说我真正想要的是硬而快,而不是可选约束。

另一种解决方法是为UITableViewHeaderFooterView设置初始框架。但是考虑到它的指定init方法是-initWithReuseIdentifier:而不是-initWithFrame:UITableViewUITableViewDelegate有责任为UITableViewHeaderFooterView指定框架,它既不会感觉良好解决方法。

那么更好的吗?

1 个答案:

答案 0 :(得分:10)

我认为您的特定问题源于尝试在UITableViewHeaderFooterView的实例上设置“容器”大小限制。问题类似于希望根据询问here的自动布局自己调整单元格大小。

具体来说,对于这个问题,视图的大小为零,但约束条件规定视图在维度上的至少 12pt(违反当前状态)。在这种情况下尤其违反了这一点,由于页眉/页脚视图使用框架/自动调整遮罩而不是自动布局来调整大小,因此无法处理,因此例外。

这种情况有两种选择:

  1. 通过使约束的优先级低于1000,使您的约束不像您在问题的第二部分中所建议的那样“必需”。
  2. 推迟安装约束,直到页眉/页脚具有已定义的大小。您已经知道您的视图将具有大小并且您的约束条件有意义。对于边缘上小于12pt的视图(在您的情况下水平地),您的约束对系统没有意义。你可以通过以下方式破解它:
    1. 检查layoutSubviews是否为非零bounds.size,或者(如果您尚未执行此操作)
    2. updateConstraints子类的UITableViewHeaderFooterView中安装约束(仅一次)。
    3. 如果您检测到updateConstraints不是self.bounds.size(这将是正确的解决方案),您还可以合并上述两个解决方案并仅在CGSizeZero中安装自动布局约束。