最近在使用Swift编写程序时 使用UIView动画 对约束执行动画遇到了一个小坑
1.在控制器中添加一个 容器view, 容器view的约束是宽高都是300/ 水平居中/ 竖直居中
2. 在容器view中添加一个imageView, imageView的约束是:和容器view等宽等高 / 水平居中 /顶部对齐
着这里希望通过修改imageView的顶部约束来执行动画
private func startAnimation(){
self.imageViewCons.constant = -self.contentViewCons.constant;
self.imageView.layoutIfNeeded();
UIView.animateWithDuration(2.0, animations: { () -> Void in
self.imageViewCons.constant = self.contentViewCons.constant;
UIView.setAnimationRepeatCount(MAXFLOAT);
// 修改布局约束
self.imageView.layoutIfNeeded();
}) { (_) -> Void in
};
}
结果是直接停止在最终状态.
因为在使用约束添加动画的时候,有个原则就是动画要添加到当前视图的父视图上。
所以我们需要修改更新约束的对象为父视图
private func startAnimation(){
self.imageViewCons.constant = -self.contentViewCons.constant;
self.contentView.layoutIfNeeded();
UIView.animateWithDuration(2.0, animations: { () -> Void in
self.imageViewCons.constant = self.contentViewCons.constant;
UIView.setAnimationRepeatCount(MAXFLOAT);
// 调用父视图的刷新约束
self.contentView.layoutIfNeeded();
}) { (_) -> Void in
};
}
这样动画既可以正常执行了.