自从使用Storyboard后,感觉添加动画变的操作好复杂,以前只要几行代码可以搞定的事情,到了Storyboard时代,变成了拖来拖去的操作,复杂的界面想加个动画有时还觉得无从下手,下面介绍的一个动画操作很简单,利用Constraint的优先级来设置动画,这个是这篇文章的核心。
首先展示下动画效果
![](https://img.haomeiwen.com/i848200/8ef422d98d603d62.gif)
好了,我们开始一步步实现这个动画
首先拖动2个View到ViewController上,设置各自的约束,然后拖一个UISwitch放在界面下方,方便控制动画
红色View的约束如下
![](https://img.haomeiwen.com/i848200/eee3567add2c29b9.png)
蓝色View的约束如下:
![](https://img.haomeiwen.com/i848200/a64b27f42d9e1215.png)
现在我们需要红色的View可以扩充到全屏,那么接下来我们需要添加一个约束,就是红色View到父View的右侧约束
![](https://img.haomeiwen.com/i848200/c01d7d40debb4bf7.png)
再设置下约束的优先级为High
![](https://img.haomeiwen.com/i848200/8c2a3ebec582ab3f.png)
接下来我们需要降低蓝色View的右侧约束的优先级,这样才可以让红色View可以扩充到父View
![](https://img.haomeiwen.com/i848200/20ccc5f687dda622.png)
同样设置优先级成High
![](https://img.haomeiwen.com/i848200/c606a1f1cf5ba84b.png)
然后把这个2个约束都拖到代码里面
@IBOutlet weak var redViewToViewConstraint: NSLayoutConstraint!
@IBOutlet weak var blueViewTrailingConstraint: NSLayoutConstraint!
接下来设置动画,我们需要将红色View右侧约束变成0,同时需要降低蓝色View右侧约束的优先级
这里有个示意图,大致画了一下,大家随便看看下吧
![](https://img.haomeiwen.com/i848200/e53ad6f2e027c3de.png)
func updateConstraintsForMode(isOn : Bool)
{
if (isOn) {
self.redViewToViewConstraint.constant = 0
self.blueViewTrailingConstraint.priority = UILayoutPriorityDefaultHigh - 1
} else {
self.blueViewTrailingConstraint.priority = UILayoutPriorityDefaultHigh + 1
}
}
最后将UISwitch的Action拖进代码,加上启用动画代码,就完成啦
@IBAction func switchAction(sender: UISwitch) {
updateConstraintsForMode(sender.on)
UIView.animateWithDuration(1.0) { () -> Void in
self.view.layoutIfNeeded()
}
}
网友评论