对superview的约束不起作用

时间:2015-05-21 21:29:27

标签: swift autolayout

我将一个subView添加到superview,我想约束子视图。但它没有做任何事情。子视图在superview上全屏添加。请帮助我,出了什么问题?

这是我的代码:

  override func viewWillAppear(animated: Bool) {
    super.viewWillAppear(animated)
    setupConstraints()
  }

  func setupConstraints(){   
    heightConstraint = NSLayoutConstraint(item: view, attribute: NSLayoutAttribute.Height, relatedBy: NSLayoutRelation.Equal, toItem: nil, attribute: NSLayoutAttribute.NotAnAttribute, multiplier: 1, constant: 80)
    bottomConstraint = NSLayoutConstraint(item: view, attribute: NSLayoutAttribute.CenterY, relatedBy: NSLayoutRelation.Equal, toItem: view.superview!, attribute: NSLayoutAttribute.CenterY, multiplier: 1, constant: 30)
    widthConstraint = NSLayoutConstraint(item: view, attribute: NSLayoutAttribute.Width, relatedBy: NSLayoutRelation.Equal, toItem: view.superview!, attribute: NSLayoutAttribute.Width, multiplier: 1, constant: 0)

    view.setTranslatesAutoresizingMaskIntoConstraints(false)
    view.superview!.setTranslatesAutoresizingMaskIntoConstraints(false)

    view.addConstraint(heightConstraint!)
    view.addConstraint(widthConstraint!)
    view.addConstraint(bottomConstraint!)
  }

1 个答案:

答案 0 :(得分:3)

问题是你的约束是模棱两可的(欠定)。没有足够的信息可以知道将heightConstraint = NSLayoutConstraint(item: view, attribute: NSLayoutAttribute.Height, relatedBy: NSLayoutRelation.Equal, toItem: nil, attribute: NSLayoutAttribute.NotAnAttribute, multiplier: 1, constant: 80) 放在哪里。

必须知道四条信息:

bottomConstraint = NSLayoutConstraint(item: view, attribute: NSLayoutAttribute.CenterY, relatedBy: NSLayoutRelation.Equal, toItem: view.superview!, attribute: NSLayoutAttribute.CenterY, multiplier: 1, constant: 30)

查看你的约束,并考虑每个人的决定:

widthConstraint = NSLayoutConstraint(item: view, attribute: NSLayoutAttribute.Width, relatedBy: NSLayoutRelation.Equal, toItem: view.superview!, attribute: NSLayoutAttribute.Width, multiplier: 1, constant: 0)

那是高度。

view.superview!.setTranslatesAutoresizingMaskIntoConstraints(false)

那是你的位置。

view.superview

那是宽度。

哎呀! x位置怎么样?

您的代码的另一个问题可能是这一行:

extension NSLayoutConstraint {
    class func reportAmbiguity (var v:UIView?) {
        if v == nil {
            v = UIApplication.sharedApplication().keyWindow
        }
        for vv in v!.subviews as! [UIView] {
            println("\(vv) \(vv.hasAmbiguousLayout())")
            if vv.subviews.count > 0 {
                self.reportAmbiguity(vv)
            }
        }
    }
    class func listConstraints (var v:UIView?) {
        if v == nil {
            v = UIApplication.sharedApplication().keyWindow
        }
        for vv in v!.subviews as! [UIView] {
            let arr1 = vv.constraintsAffectingLayoutForAxis(.Horizontal)
            let arr2 = vv.constraintsAffectingLayoutForAxis(.Vertical)
            NSLog("\n\n%@\nH: %@\nV:%@", vv, arr1, arr2);
            if vv.subviews.count > 0 {
                self.listConstraints(vv)
            }
        }
    }
}

您可以通过说明删除NSLayoutConstraint.reportAmbiguity(view.superview!)自动生成的约束 - 但不要用任何新约束替换它们。因此,此时可能也会进行模糊配置(除非它已经有一组我们不知道的完整约束,但在那种情况下,该行是不必要的)。

在我的书中,我提供了一些实用程序方法的代码,以帮助追踪这类事情:

viewDidLayoutSubviews

如果您在view注入视图层次结构后,最好一次view运行_,您会发现var, _ = func(args) 报告不明确。这就是为什么你没有看到你期望的原因。