是的,很明確的告訴各位看官,AutoLayout的確能做動畫。AutoLayout是用來做各種約束,是用來適配不同屏幕的,那么當我們改變其中某些約束并講這個改變的過程以緩慢的速度顯示,那么是不是就實現了動畫~
先來看一個酷炫的動畫,這個動畫由書籍iOS Animations by tutorials提供:

由書籍iOS Animations by tutorials提供
接下來我們將圍繞這個動畫的實現過程來進行敘述。
首先給我們最上方的這個類似Navigation的menu做動畫,很明顯我們在這里是改變了這個view的Height,既然如此,我們首先要做的就是獲取這個menuView的約束條件,我們在代碼中添加以下一行:
@IBOutlet var menuHeightConstraint: NSLayoutConstraint!
如何給約束條件做關聯,首先找到我們的約束條件:

這個就是我們的menuView的高度的約束條件
雙擊這個約束條件,然后選擇Connections Inspector,如下圖操作:

1.png
然后選擇menuHeightConstraint,這樣我們就給約束條件做了一個關聯。
現在我們在那個“+”按鈕的方法里添加以下代碼:
isMenuOpen = !isMenuOpen
menuHeightConstraint.constant = isMenuOpen ? 200.0 : 60.0
titleLabel.text = isMenuOpen ? "Select Item" : "Packing List"
UIView.animateWithDuration(1.0, delay: 0.0,
usingSpringWithDamping: 0.4, initialSpringVelocity: 10.0,
options: .CurveEaseIn, animations: {
self.view.layoutIfNeeded()
let angle = self.isMenuOpen ? CGFloat(M_PI_4) : 0.0
self.buttonMenu.transform = CGAffineTransformMakeRotation(angle)
}, completion: nil)
我們來看一下效果,我可以看到menuView很拽的下來了,還duang~duang~duang~的。這段代碼在上一篇我們大多都講過了,除了這個函數:
self.view.layoutIfNeeded()
這個函數是什么意思呢,你可以這樣理解,AutoLayout對于約束試一次計算,一次實現,但是當你加上這個函數以后,View還是一次實現了~~~額~~~但是,iOS沒有機會去刷新視圖,所有就會有動畫的效果。~這一點好像和那個很廢的包,java里的‘swing’有點類似~~~
對于 UIView.animateWithDuration這個函數若是有什么不懂的,請自行參考我的上一篇文章。
很多時候,我們不能或者不想給我們的約束做一個關聯,那么這個時候我們如何獲取我們的約束從而改變他呢?我們這里有一個函數.constraints()這個函數返回一個數組,這個數組中有這個控件的所有的約束。接下來我們給標題添加動畫,我們上面看到,動畫中標題duang~的一下跑到了左邊。
for constraint in titleLabel.superview!.constraints() as! [NSLayoutConstraint] {
if constraint.secondItem as? NSObject == titleLabel && constraint.secondAttribute == .CenterX {
constraint.constant = isMenuOpen ? 100.0 : 0.0
新聞熱點
疑難解答