如何找出与NSLayoutConstraints的确切冲突?

时间:2015-03-20 08:46:21

标签: ios swift autolayout

我试图将 40x40徽标放置在屏幕顶部, 20pt 从顶部开始,最后与父视图水平对齐。

var views = ["tableView":self.tableView!,"logoImageView":logoImageView,"view":self.view]

self.view.addConstraints(NSLayoutConstraint.constraintsWithVisualFormat("H:[logoImageView(40)]", options: nil, metrics: nil, views: views))

self.view.addConstraints(NSLayoutConstraint.constraintsWithVisualFormat("V:[logoImageView(40)]", options: nil, metrics: nil, views: views))

self.view.addConstraints(NSLayoutConstraint.constraintsWithVisualFormat("V:|-20-[logoImageView]", options: nil, metrics: nil, views: views))        

self.view.addConstraints(NSLayoutConstraint.constraintsWithVisualFormat("V:[view][logoImageView]", options: NSLayoutFormatOptions.AlignAllCenterX, metrics: nil, views: views));

但这是我在调试器/控制台中遇到的错误。

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:0x7fa78487e8f0 V:|-(20)-[UIImageView:0x7fa784b29350]   (Names: '|':UIView:0x7fa78373b8e0 )>",
    "<NSLayoutConstraint:0x7fa784886f70 V:[UIView:0x7fa78373b8e0]-(0)-[UIImageView:0x7fa784b29350]>",
    "<NSLayoutConstraint:0x7fa78488caa0 'UIView-Encapsulated-Layout-Height' V:[UIView:0x7fa78373b8e0(667)]>"
)

Will attempt to recover by breaking constraint 
<NSLayoutConstraint:0x7fa784886f70 V:[UIView:0x7fa78373b8e0]-(0)-[UIImageView:0x7fa784b29350]>

如果有人可以帮助解释问题的位置以及执行NSLayoutFormatOptions的正确方法,那会很棒。

谢谢!

2 个答案:

答案 0 :(得分:2)

问题在于这两个限制:

self.view.addConstraints(NSLayoutConstraint.constraintsWithVisualFormat("V:|-20-[logoImageView]", options: nil, metrics: nil, views: views))        
self.view.addConstraints(NSLayoutConstraint.constraintsWithVisualFormat("V:[view][logoImageView]", options: NSLayoutFormatOptions.AlignAllCenterX, metrics: nil, views: views));

第一个说logoImageView的顶部应该是超级视图顶部的20个点。第二个说logoImageView的顶部应该是view底部的0点。

问题是viewlogoImageView的超级视图。您可以告诉我,因为此约束中的超级视图(|):

"<NSLayoutConstraint:0x7fa78487e8f0 V:|-(20)-[UIImageView:0x7fa784b29350]   (Names: '|':UIView:0x7fa78373b8e0 )>",

与此约束中的相邻视图相同:

"<NSLayoutConstraint:0x7fa784886f70 V:[UIView:0x7fa78373b8e0]-(0)-[UIImageView:0x7fa784b29350]>",

因此,这两个约束要求view高20点。但是,表视图为该视图强加了667个点的高度,如此约束所示:

"<NSLayoutConstraint:0x7fa78488caa0 'UIView-Encapsulated-Layout-Height' V:[UIView:0x7fa78373b8e0(667)]>"

因此发生了冲突。

我怀疑问题是您已将logoImageView添加到错误的视图中,或者您打算在V:[view][logoImageView]可视格式字符串中列出其他视图。

答案 1 :(得分:0)

我发现了这个方式:

  1. 当您注意到错误日志时,请按Pause以启动lldb调试会话
  2. 在控制台类型中: expr [(UIImageView *)0x7fa784b29350 setHidden: YES];
  3. 你会注意到视图

    <NSLayoutConstraint:0x7fa78487e8f0 V:|-(20)-[UIImageView:0x7fa784b29350]>
    

    会消失,所以你会知道它是