Constraint的动画如果按照一般的写法,是无效的。比如:
[UIView animateWithDuration:1.0f animations:^
{
_animateConstraint.constant = -180.0f;
}]
至于是什么原因,暂时还不了解,以后会持续关注这个问题。
网络上为了解决这个约束的动画的问题,大部分用的是View的一个方法—layoutIfNeeded。大概的作用是,持续刷新,然后就有动画了,当然这是我自己的猜测。我也不是很熟悉Layout方面的内容,并且我做了这方面的尝试之后,没有成功。
在一次偶然的日常查阅中,突然有位网友提到了bounds这个属性。于是有了下面这段代码:
CGRect originalBounds = _loginView.bounds;
CGRect newBounds = originalBounds;
newBounds.origin.y += 180.0f;
[UIView animateWithDuration:0.3f animations:^
{
_loginView.bounds = newBounds;
}
completion:^(BOOL finished)
{
_loginView.bounds = originalBounds;
_animateConstraint.constant = -180.0f;
}];
其中_loginView是需要完成动画的View,_animateConstraint是该View的约束,是距上方最近的控件的距离。
这段代码的思路是,先用bounds完成动画(为什么不用frame?自动布局里面frame是无效的?我没做过验证,不确定),但动画完成后该View处于自己有效范围外,所以动画完成之后,我将该View的bounds恢复,然后更改他的Constraint,保持在动画结束的位置,这样就比较漂亮的完成动画了。
当然,有空会试试LayoutIfNeeded来完成动画。