你可以從登錄項(xiàng)目開始。下載地址https://github.com/chenruiming/OrangeLogin
下載并運(yùn)行項(xiàng)目,看到熟悉的登錄屏幕:
你的任務(wù)是刪除現(xiàn)有的視圖動(dòng)畫,并用基于層的動(dòng)畫逐個(gè)替換它們。
打開ViewController.swift,找到viewWillAppear().
刪除這行
heading.center.x -= view.bounds.width
不再需要執(zhí)行此操作,因?yàn)榭梢栽趯觿?dòng)畫中指定開始和結(jié)束值。
接下來,向下滾動(dòng)到viewDidAppear(),并刪除如下所示移動(dòng)標(biāo)題的動(dòng)畫調(diào)用:
UIView.animate(withDuration: 0.5) {
self.heading.center.x += self.view.bounds.width
}
構(gòu)建并運(yùn)行項(xiàng)目;觀看動(dòng)畫屏幕并檢查表單標(biāo)題不再是動(dòng)畫。
現(xiàn)在你已經(jīng)刪除了舊的視圖動(dòng)畫代碼,現(xiàn)在是添加一些圖層動(dòng)畫的時(shí)候了!找到viewWillAppear(),并在方法的頂部添加以下代碼,在對(duì)super的調(diào)用下面:
let flyRight = CABasicAnimation(keyPath: "position.x")
flyRight.fromValue = -view.bounds.size.width/2
flyRight.toValue = view.bounds.size.width/2
flyRight.duration = 0.5
核心動(dòng)畫中的動(dòng)畫對(duì)象是簡單的數(shù)據(jù)模型;創(chuàng)建模型的實(shí)例并相應(yīng)地設(shè)置其數(shù)據(jù)屬性。
CABasicAnimation的一個(gè)實(shí)例描述了一個(gè)潛在的層動(dòng)畫:你可以選擇現(xiàn)在運(yùn)行,稍后運(yùn)行,或者根本不運(yùn)行。
由于動(dòng)畫沒有綁定到特定的層,你可以在其他層上重用動(dòng)畫,每個(gè)層將獨(dú)立運(yùn)行動(dòng)畫。
在動(dòng)畫模型中,你可以將要?jiǎng)赢嫷膶傩宰鳛闉閗eypath參數(shù);這很方便。
這里,你只將位置的x分量動(dòng)畫。Core Animation方便地公開了位置、邊界和轉(zhuǎn)換的各個(gè)成員,這樣你就可以分別對(duì)它們進(jìn)行動(dòng)畫處理。
接下來,為你在keypath上指定的屬性設(shè)置fromValue和toValue。在這種情況下,你希望它從屏幕的左邊開始,然后在屏幕的中心結(jié)束。
最后,動(dòng)畫持續(xù)時(shí)間的概念沒有改變;這里你將持續(xù)時(shí)間設(shè)置為0.5秒。
現(xiàn)在你的動(dòng)畫都設(shè)置好了,你可以把它添加到你的應(yīng)用中的一個(gè)圖層,看看它是什么樣子的。在剛剛添加的代碼下面添加以下一行,將動(dòng)畫添加到標(biāo)題層:
heading.layer.add(flyRight, forKey: nil)
add(_:forKey:)復(fù)制了動(dòng)畫對(duì)象,并告訴Core animation在層上運(yùn)行它。key參數(shù)是一個(gè)標(biāo)識(shí);如果需要更改或停止動(dòng)畫,之后你可以通過標(biāo)識(shí)找到動(dòng)畫。
構(gòu)建并運(yùn)行你的項(xiàng)目;你會(huì)看到表單標(biāo)題移動(dòng)到屏幕中心,正如預(yù)期的那樣,圖層及其包含的視圖平滑地進(jìn)入位置。
注意:像CGRect或CATransform3D這樣的動(dòng)畫結(jié)構(gòu)并不像上面提到的對(duì)象值那樣簡單。