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

时间:2017-09-25 19:47:00

标签: ios swift nslayoutconstraint uiviewanimation

我正在尝试将一个按钮从我class JobA extends Job { private $taskList; public function __construct(TaskList $taskList) { $this->taskList = $taskList; } public function handle() { $this->taskList->run(); } } class TaskList { private $tasks = [ TaskA::class, TaskB::class, ... ]; public function run() { foreach($this->tasks as $task) { // resolve $task and call it's own run method.. } } public function addToSchedule(Schedule $schedule) { $scheduler->job(new JobA($this))->everyFiveMinutes(); } } 的可见边界外部动画到它的中心。我在我的故事板中有一个名为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) } 的引用的以下错误消息。

  

隐含使用' self'关闭;使用' self。'捕获   语义显式

但当我使用toItem: view时,我的应用程序崩溃并显示错误消息:

  

无法在视图上安装约束。约束是否引用   来自视图子树外的东西?这是非法的。

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

2 个答案:

答案 0 :(得分:3)

错误很明显。您正在将引用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)

答案 1 :(得分:0)

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