为什么我无法在我的视图上安装约束?

Why am I unable to install a constraint on my view?

我正在尝试为按钮设置动画,使其从 UIViewController 的可见边界外移动到按钮的中心。我的故事板中有一个名为 myButtonLeading 的约束设置,我将其作为动画的一部分删除,然后我想添加一个名为 newCenterConstraint.

的新约束
@IBAction func updateDidTouch(_ sender: Any) {

    UIView.animate(withDuration: 0.5, delay: 0, options: UIViewAnimationOptions.curveEaseInOut, animations: {

        let newCenterConstraint = NSLayoutConstraint(item: self.myButton, attribute: .centerX, relatedBy: .equal, toItem: view, attribute: .centerX, multiplier: 1.0, constant: 0.0)

        self.myButton.removeConstraint(self.myButtonLeading)
        self.myButton.addConstraint(newCenterConstraint)

        self.view.layoutIfNeeded()

    }, completion: nil)
}

我现在拥有的代码给出了以下关于我对 toItem: view.

的引用的错误消息

Implicit use of 'self' in closure; use 'self.' to make capture semantics explicit

但是当我使用 self.view 时,我的应用程序崩溃并显示一条错误消息:

Unable to install constraint on view. Does the constraint reference something from outside the subtree of the view? That's illegal.

我在添加新的 centerX 约束时哪里出错了?

我只会使用带有常量的 centerX 约束来将其偏移到屏幕外。然后将常量设置为 0 的动画。

错误很明显。您正在将引用 self.view 的约束添加到 self.view.

的子视图

要解决此问题,请替换此行:

self.myButton.addConstraint(newCenterConstraint)

有:

self.view.addConstraint(newCenterConstraint)

不过,正如 Lou Franco 所建议的,更好的方法是不对新约束的添加进行动画处理,而是更改中心 x 约束的常量并对 layoutIfNeeded 函数进行动画处理。 (为此,您必须为中心 x 约束连接一个出口。)

看起来像这样:

UIView.animate(withDuration: 0.5, delay: 0, options: UIViewAnimationOptions.curveEaseInOut, animations: {
  self.centerConstraint.constant = 0
  self.view.layoutIfNeeded()
}, completion: nil)