AutoLayout - 以编程方式添加约束会导致应用崩溃

时间:2013-12-17 16:59:52

标签: ios objective-c cocoa-touch autolayout

我遇到了AutoLayout的问题,这让我很头疼。我有一个scrollview&使用Autolayout在.xib中设置容器视图。我需要动态地将子视图添加到容器视图中,并尝试让它们与Auto Layout一起玩得很好。这不太顺利......

这是我想要完成的图片: enter image description here

所以滚动视图容器图层已经在xib中设置了自动布局和视图1-3我试图以编程方式添加。我的第一个方法是:

[containerView addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"H:|-20-[viewOne]" options:0 metrics:nil views:NSDictionaryOfVariableBindings(viewOne)]]

导致:

  

无法同时满足约束条件。   可能至少下列列表中的一个约束是您不想要的约束。试试这个:(1)看看每个约束并试着找出你不期望的东西; (2)找到添加了不需要的约束或约束的代码并修复它。 (注意:如果你看到你不理解的NSAutoresizingMaskLayoutConstraints,请参阅UIView属性的文档translatesAutoresizingMaskIntoConstraints)

(
      "<NSLayoutConstraint:0x9d84de0 H:|-(20)-[UIView:0x9d922e0]   (Names: '|':UIView:0x9d91fb0 )>",
      "<NSAutoresizingMaskLayoutConstraint:0x9d9fe90 h=--& v=--& UIView:0x9d922e0.midX ==>"
)

我也尝试过使用constraintWithItem:attribute:relatedBy:toItem:attribute:multiplier:constant,但我正在努力让它以我想要的方式运作。我做了一些根本错误的事情吗?

斯蒂芬

3 个答案:

答案 0 :(得分:2)

另一个可能的原因:使用乘数0而不是1 ...

答案 1 :(得分:1)

  1. 确保所有子视图'translatesAutoresizingMaskIntoConstraints为NO。
  2. 确保不要在您的子视图中设置框架,因为AutoLayout正在讨论视图的关系而非框架。
  3. 确保您有足够的约束,系统不会混淆。

答案 2 :(得分:0)

我有完全相同的问题(非常令人沮丧,但调试器提供了一个很好的提示。)在我的情况下,我在将子视图添加到超级视图之前创建了一个超级视图约束。看起来这应该可行,因为没有实际的超级视图对象传递给约束构建器函数。这是之前和之后(我很快,希望你可以遵循):

破碎版:

let v0 = UILabel(frame: CGRect(x: 100, y: 50, width: 200, height: 20))
v0.text = "Hello"
let v1 = UILabel(frame: CGRect(x: 100, y: 100, width: 200, height: 20))
v1.text = "World"


let c0 : AnyObject[]! = NSLayoutConstraint.constraintsWithVisualFormat(
    "V:|-20-[top]-10-[bottom]",
    options: NSLayoutFormatOptions.fromMask(0),
    metrics: nil,
    views: ["top":v0, "bottom":v1])

mainView.autoresizesSubviews = true

for v in [v0, v1, mainView]
{
    mainView.setTranslatesAutoresizingMaskIntoConstraints(false)
}

for v in [v0, v1]
{
    mainView.addSubview(v)
}


mainView.addConstraints(c0)

修正版:

let v0 = UILabel(frame: CGRect(x: 100, y: 50, width: 200, height: 20))
v0.text = "Hello"
let v1 = UILabel(frame: CGRect(x: 100, y: 100, width: 200, height: 20))
v1.text = "World"

mainView.autoresizesSubviews = true

for v in [v0, v1, mainView]
{
    mainView.setTranslatesAutoresizingMaskIntoConstraints(false)
}

for v in [v0, v1]
{
    mainView.addSubview(v)
}


let c0 : AnyObject[]! = NSLayoutConstraint.constraintsWithVisualFormat(
    "V:|-20-[top]-10-[bottom]",
    options: NSLayoutFormatOptions.fromMask(0),
    metrics: nil,
    views: ["top":v0, "bottom":v1])

mainView.addConstraints(c0)