在Swift中,如何使用自动布局(如页面滑入)来animationUIView?

我尝试创build一个UIView代表一个页面,其大小与设备屏幕相同。 由于该应用程序支持方向,我使用AutoLayout构造它。

它工作正常,直到我试图animation的页面从右侧滑入。 这是我经过一番调查后才能得出的最好的结果:

myView = UIView() myView.backgroundColor = UIColor.orangeColor() parentView.addSubview(myView) myView.translatesAutoresizingMaskIntoConstraints = false myView.leftAnchor.constraintEqualToAnchor(parentView.rightAnchor).active = true myView.widthAnchor.constraintEqualToAnchor(parentView.widthAnchor).active = true myView.heightAnchor.constraintEqualToAnchor(parentView.heightAnchor).active = true UIView.animateWithDuration(Double(1.0), animations: { self.myView.leftAnchor.constraintEqualToAnchor(self.parentView.leftAnchor).active = true self.myView.layoutIfNeeded() }) 

使用上面的代码, myView页面从myView滑入,这不是我所期望的,而日志也表示Unable to simultaneously satisfy constraints

任何build议来帮助我,纠正我更好的理解AutoLayout和animation非常赞赏。 谢谢。

在我原来的问题中,我以为我覆盖了一个现有的规则(左边的锚点),但实际上我是为左边的锚点创build了一个新的规则,所以冲突和失败都是animation的。

在另一个关于改变AutoLayout规则的问题中,在 @vacawama的帮助下 ,现在工作如下:

 override func viewDidLoad() { super.viewDidLoad() let myView = UIView() myView.backgroundColor = UIColor.orangeColor() myView.translatesAutoresizingMaskIntoConstraints = false view.addSubview(myView) myView.topAnchor.constraintEqualToAnchor(view.topAnchor).active = true myView.widthAnchor.constraintEqualToAnchor(view.widthAnchor).active = true myView.heightAnchor.constraintEqualToAnchor(view.heightAnchor).active = true var leftConstraint = myView.leftAnchor.constraintEqualToAnchor(view.rightAnchor) leftConstraint?.active = true myView.layoutIfNeeded() /* try to deactivate a rule and create a new rule, then animate it */ leftConstraint?.active = false leftConstraint = myView.leftAnchor.constraintEqualToAnchor(view.leftAnchor) leftConstraint?.active = true UIView.animateWithDuration(1.0) { self.view.layoutIfNeeded() } } 

但是,如果我改变最后一行,而不是在myView上调用layoutIfNeeded() ,它不是animation(欢迎任何评论)。 我真的想调用它在一个子视图,而不是一个父视图,因为我不希望所有的子视图animation(在一个完整的用例)。 所以它可能需要一些解决方法,但基本的概念是在那里,并已经解决了原来的问题。

代码稍作改动

 myView.translatesAutoresizingMaskIntoConstraints = false //myView.leftAnchor.constraintEqualToAnchor(view.rightAnchor).active = true myView.widthAnchor.constraintEqualToAnchor(view.widthAnchor).active = true myView.heightAnchor.constraintEqualToAnchor(view.heightAnchor).active = true //self.myView.leftAnchor.constraintEqualToAnchor(self.view.leftAnchor).active = true self.myView.layoutIfNeeded() myView.frame.origin.x += myView.frame.width UIView.animateWithDuration(1.0, animations: {() ->Void in self.myView.frame.origin.x = 0 })