【问题标题】:AutoLayout error when anchoring a view to main view - Swift将视图锚定到主视图时出现自动布局错误 - Swift
【发布时间】:2019-11-07 12:38:14
【问题描述】:

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

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 测试 AutoLayout[42202:4013241] *** 由于未捕获的异常“NSGenericException”而终止应用程序,原因:“无法使用锚点激活约束,因为它们没有共同点祖先。约束或其锚点是否引用不同视图层次结构中的项目?这是非法的。'

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

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

如果我只有“myContainer”,知道为什么会出现错误吗?

【问题讨论】:

标签: ios swift autolayout


【解决方案1】:

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

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 本身centerX 和 centerY 被添加到父视图中。

【讨论】:

  • 哇,非常感谢您指出这一点。我会尽快将其标记为正确答案。
  • 另外,感谢您提供有关激活约束的提示。
【解决方案2】:

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

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)
])
}

【讨论】:

    猜你喜欢
    • 2017-11-08
    • 2016-09-30
    • 1970-01-01
    • 2014-03-28
    • 2017-11-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多