为什么我无法在我的视图上安装约束?
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)
我正在尝试为按钮设置动画,使其从 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)