无法为视图

时间:2016-01-29 15:36:32

标签: ios swift uiview autolayout constraints

我试图以这种方式向图像视图和超级视图添加约束:

let newConstraint = NSLayoutConstraint(
  item: self.image, 
  attribute: NSLayoutAttribute.Top, 
  relatedBy: NSLayoutRelation.Equal, 
  toItem: self.topLayoutGuide, 
  attribute: NSLayoutAttribute.Bottom, 
  multiplier: 1, 
  constant: 200)
image.addConstraint(newConstraint)

当我运行我的应用程序时,它会以此输出崩溃:

  

无法在视图上安装约束。约束是否引用了视图子树之外的内容?这是非法的。

有什么想法吗?

2 个答案:

答案 0 :(得分:2)

将约束添加到self.view而不是self.image

self.view.addConstraint(newConstraint)

self.topLayoutGuideself.view的子元素,而不是self.image。并且正如错误所述,在约束中引用来自安装约束的视图的子树之外的东西是非法的。

换句话说,self.imageself.topLayoutGuide是视图层次结构中的兄弟,您必须将约束添加到这些兄弟姐妹的“父亲”(self.view)。

答案 1 :(得分:0)

对于那些对Interface Builder(StoryBoard)解决方案感兴趣的人:

如果顶部/底部约束无法添加/编辑,如图所示。 enter image description here

首先,在“导航到相关项目”窗格中选择要添加这些约束的项目,然后在视图中按住CTRL键将其单击到附近的项目,并将其顶部/底部任意地限制在该项目上。

enter image description here enter image description here

这将创建一个您原本无法添加的约束,现在可以找到它,并打开属性检查器以根据需要进行编辑;因此,是任意的初始选择。

enter image description here enter image description here

这似乎仅在您的视图包含其他您可以毫无问题地约束的项目时才有效,因为添加此约束将取决于至少一个已经存在的约束。