将视图锚定到主视图时出现 AutoLayout 错误 - Swift

AutoLayout error when anchoring a view to main view - Swift

因为他们没有共同的祖先。约束或其锚点是否引用不同视图层次结构中的项目?

override func viewDidLoad() {
        super.viewDidLoad()

        let myContainer = UIView()
        myContainer.backgroundColor = .purple
        myContainer.translatesAutoresizingMaskIntoConstraints = false
        myContainer.centerYAnchor.constraint(equalTo: view.centerYAnchor).isActive = true
        myContainer.centerXAnchor.constraint(equalTo: view.centerXAnchor).isActive = true
        myContainer.widthAnchor.constraint(equalToConstant: 200).isActive = true
        myContainer.heightAnchor.constraint(equalToConstant: 200).isActive = true
        self.view.addSubview(myContainer)
}

错误:

2019-11-06 20:06:17.763701-0600 Testing AutoLayout[42202:4013241] *** Terminating app due to uncaught exception 'NSGenericException', reason: 'Unable to activate constraint with anchors and because they have no common ancestor. Does the constraint or its anchors reference items in different view hierarchies? That's illegal.'

如果我注释以下两行,错误就会消失,myContainer 视图会显示在左上角。

    //myContainer.centerYAnchor.constraint(equalTo: view.centerYAnchor).isActive = true
    //myContainer.centerXAnchor.constraint(equalTo: view.centerXAnchor).isActive = true

知道为什么如果 'myContainer' 是我唯一的错误吗?

您应该在约束之前添加视图

let myContainer = UIView()
self.view.addSubview(myContainer)
myContainer.backgroundColor = .purple
myContainer.translatesAutoresizingMaskIntoConstraints = false
NSLayoutConstraint.activate([
    myContainer.centerYAnchor.constraint(equalTo: view.centerYAnchor),
    myContainer.centerXAnchor.constraint(equalTo: view.centerXAnchor),
    myContainer.widthAnchor.constraint(equalToConstant: 200),
    myContainer.heightAnchor.constraint(equalToConstant: 200)
])

widthheight 约束通过的原因是它们都添加到 view 本身centerXcenterY 被添加到父视图。

首先,您应该在添加约束之前添加视图(一个或多个视图)。

override func viewDidLoad() {
      super.viewDidLoad()
let myContainer = UIView()
self.view.addSubview(myContainer)
myContainer.backgroundColor = .ColorName
myContainer.translatesAutoresizingMaskIntoConstraints = false
addViewConstraints()
}

func addViewConstraints () {
NSLayoutConstraint.activate([
    myContainer.centerYAnchor.constraint(equalTo: view.centerYAnchor),
    myContainer.centerXAnchor.constraint(equalTo: view.centerXAnchor),
    myContainer.widthAnchor.constraint(equalToConstant: 200),
    myContainer.heightAnchor.constraint(equalToConstant: 200)
])
}