iOS動畫——Layer Animations(一)

Layer Animations與我們前面第一篇講過的View Animation有點(diǎn)類似啸盏,但是Layer Animation比之多了很多效果猫胁,更加強(qiáng)大维咸。
我們先來看一下今天我們要實(shí)現(xiàn)的效果渠啤,今天實(shí)現(xiàn)的效果用第一篇View Animations能實(shí)現(xiàn)相同效果狐肢。

  • 本文所講為實(shí)現(xiàn)此動畫的相關(guān)知識。
動畫由書籍《iOS Animations by tutorials》提供埃篓,我只是一個復(fù)述者

哦~先來看一下Layer是什么吧:

比較通俗的來說处坪,CALayer就是UIView的視圖層,你所看到的UIView架专,其實(shí)是UIView的layer同窘。這么說吧,CALayer就是樹葉的葉綠素部脚,和葉綠素不同的就是想邦,CALayer更加的“單純”,我們知道葉綠素是包括很多基質(zhì)的委刘,而CALayer僅僅是代表了你能看到的一切丧没。


我們今天把所有的重點(diǎn)都放在動畫的編寫上,默認(rèn)有swift基礎(chǔ)
如果你觀察都仔細(xì)的話锡移,你會發(fā)現(xiàn)呕童,背景上的云是漸入的,也就是透明度由0到1淆珊,當(dāng)然這個用我們前面學(xué)的UIViewAnimation是很容易實(shí)現(xiàn)的夺饲,那么用CALayer如何實(shí)現(xiàn)呢,看下面的代碼:
<pre><code>
//1
let fadeIn = CABasicAnimation(keyPath: "opacity")
//2
fadeIn.fromValue = 0.0
//3
fadeIn.toValue = 1.0
//4
fadeIn.duration = 0.5
//5
fadeIn.fillMode = kCAFillModeBackwards
//6
fadeIn.beginTime = CACurrentMediaTime() + 0.5
cloud1.layer.addAnimation(fadeIn, forKey: nil)

fadeIn.beginTime = CACurrentMediaTime() + 0.7
cloud2.layer.addAnimation(fadeIn, forKey: nil)

fadeIn.beginTime = CACurrentMediaTime() + 0.9
cloud3.layer.addAnimation(fadeIn, forKey: nil)

fadeIn.beginTime = CACurrentMediaTime() + 1.1
cloud4.layer.addAnimation(fadeIn, forKey: nil)

</code></pre>

很明顯我們是給四朵云的layer添加了動畫施符,然后實(shí)現(xiàn)了漸入的效果往声。

  • 1、這句話聲明了一個** CABasicAnimation戳吝,注意到里面填寫的參數(shù)沒浩销,填的是 opacity,就是透明度的意思听哭,這里頭還能填寫很多其他值慢洋,比如position**塘雳,當(dāng)然這些我們后面都會講的。
  • 2普筹、我們對動畫的初始值進(jìn)行設(shè)定粉捻,也就是透明度最開始為0.
  • 3、我們對動畫的最終值進(jìn)行設(shè)定斑芜,也就是透明度為1肩刃。
  • 4、動畫持續(xù)時間杏头,我們設(shè)定為0.5秒盈包。和前面三句合起來,就表達(dá)了這么一個意思:這個動畫是對對象的透明度進(jìn)行改變醇王,在0.5秒內(nèi)呢燥,透明度從0變化為1.
  • 5、我們給fillMode屬性填的值是kCAFillModeBackwards寓娩,那么kCAFillModeBackwards這個值有什么用呢叛氨,這個屬性可以顯示對象的frame,我們可以把這一句注釋以后運(yùn)行程序來看一下效果棘伴,我們會發(fā)現(xiàn)寞埠,在進(jìn)行動畫之前,云朵任然可見焊夸,而這顯然是一個BUG仁连,如何解決這個BUG呢,其實(shí)方法很多阱穗,比如我們可以講云朵的透明度都設(shè)置為0饭冬,然后計算好動畫時間,當(dāng)動畫結(jié)束以后將云朵的透明度設(shè)置為1揪阶,這樣做當(dāng)然可以實(shí)現(xiàn)相同的效果昌抠,但是這樣做實(shí)在是~~~~太不優(yōu)雅了,還有一種做法就是添加fillMode屬性鲁僚,kCAFillModeBackwards的意思是顯示動畫的初始狀態(tài)炊苫,同時還有其他兩個值kCAFillModeForwards可以顯示對象動畫之后的效果,kCAFillModeBoth則是兼顧以上兩個效果蕴茴。
  • 6劝评、這個屬性很好解釋姐直,每一朵云朵的動畫并不是同時進(jìn)行的倦淀,那么我們就給云朵設(shè)定開始的時間,這個屬性和我們前面說過的UIViewAnimation的delay這個參數(shù)比較類似声畏。

以上內(nèi)容實(shí)現(xiàn)了云朵的漸入動畫撞叽。

如果對我已經(jīng)說過好幾遍的UIViewAniamtion有疑問的話姻成,請自行閱讀本人前面的文章,覺得不錯的話請關(guān)注本人愿棋,再點(diǎn)一個喜歡吧科展,親~~


接下來實(shí)現(xiàn)的是標(biāo)題、Username糠雨、PassWord有screen外由左向右移動到屏幕中心的動畫才睹,直接上代碼:

<pre><code>
//1
let flyRight = CABasicAnimation(keyPath: "position.x")
flyRight.toValue = view.bounds.size.width/2
flyRight.fromValue = -view.bounds.size.width/2
flyRight.duration = 0.5
heading.layer.addAnimation(flyRight, forKey: nil)
//2
flyRight.beginTime = CACurrentMediaTime() + 0.3
flyRight.fillMode = kCAFillModeBackwards
username.layer.addAnimation(flyRight, forKey: nil)

flyRight.beginTime = CACurrentMediaTime() + 0.4
password.layer.addAnimation(flyRight, forKey: nil)
</code></pre>

  • //1 通過對云朵動畫的講解,相信其實(shí)我們已經(jīng)能夠大致看懂這一段代碼了甘邀,和上面唯一不同的就是琅攘,我們這里創(chuàng)建的CABasicAnimation的動畫對象為"position.x"fromvaluetoVaule相信也不用進(jìn)行太多講解松邪,值得一題的是我們的值指的是對象的center.x坞琴,而不是左上角。
  • //2 對username延遲0.3秒進(jìn)行逗抑。同時同樣設(shè)定
    flyRight.fillMode = kCAFillModeBackwards

是不是很簡單呢剧辐,是的~


Log in 按鈕的動畫,上代碼:
<pre><code>
UIView.animateWithDuration(0.5, delay: 0.5, usingSpringWithDamping: 0.5, initialSpringVelocity: 0.0, options: nil, animations: {
self.loginButton.center.y -= 30.0
self.loginButton.alpha = 1.0
}, completion: nil)
</code></pre>

對于這一段代碼的解釋在這里邮府,說的十分詳細(xì)荧关,作者也長得很帥,看頭像就看得出來:http://www.reibang.com/p/bd7bf438b288 喜歡的話請關(guān)注他褂傀。


我們還發(fā)現(xiàn)云朵是不斷的移動的羞酗,繼續(xù)上代碼:
<pre><code>
func animateCloud(cloud: UIImageView) {
let cloudSpeed = 60.0 / view.frame.size.width
let duration = (view.frame.size.width - cloud.frame.origin.x) * cloudSpeed
UIView.animateWithDuration(NSTimeInterval(duration), delay: 0.0, options: .CurveLinear, animations: {
cloud.frame.origin.x = self.view.frame.size.width
}, completion: {_ in
cloud.frame.origin.x = -cloud.frame.size.width
self.animateCloud(cloud)
})
}
</code></pre>

解釋請參考Log in按鈕的解釋。


先就只剩下點(diǎn)擊Log in按鈕以后的動畫了紊服,我們先來看一下發(fā)生什么了檀轨,當(dāng)我們點(diǎn)擊按鈕以后,按鈕duang~的一下蹦到下面了欺嗤,同時顏色變了参萄,圓角變大了,然后添加了一個活動指示器煎饼。

上代碼:
<pre><code>
@IBAction func login() {

//1
UIView.animateWithDuration(1.5, delay: 0.0, usingSpringWithDamping: 0.2, initialSpringVelocity: 0.0, options: nil, animations: {
  self.loginButton.bounds.size.width += 80.0
}, completion: nil)

//2
UIView.animateWithDuration(0.33, delay: 0.0, usingSpringWithDamping: 0.7, initialSpringVelocity: 0.0, options: nil, animations: {
  self.loginButton.center.y += 60.0
  
//3
  self.spinner.center = CGPoint(x: 40.0, y: self.loginButton.frame.size.height/2)
  self.spinner.alpha = 1.0

}, completion: {_ in
//4
  self.showMessage(index: 0)
})
//5
let tintColor = UIColor(red: 0.85, green: 0.83, blue: 0.45, alpha: 1.0)
tintBackgroundColor(layer: loginButton.layer, toColor: tintColor)
//6
roundCorners(layer: loginButton.layer, toRadius: 25.0)

}

</code></pre>

這一段就厲害了讹挎,因?yàn)檫@一段特別的長。

  • 1吆玖、duang~的一下按鈕變長了筒溃。
  • 2、duang~的一下按鈕下移了沾乘。
  • 3怜奖、添加活動指示器。
  • 4翅阵、添加message這個后面再說歪玲。
  • 5迁央、調(diào)用tintBackgroundColor方法,改變顏色滥崩,這是tintBackgroundColor方法的代碼:
    <pre><code>
    func tintBackgroundColor(#layer: CALayer, #toColor: UIColor) {
    let tint = CABasicAnimation(keyPath: "backgroundColor")
    tint.fromValue = layer.backgroundColor
    layer.backgroundColor = toColor.CGColor
    tint.toValue = toColor.CGColor
    tint.duration = 1.0
    tint.fillMode = kCAFillModeBoth
    layer.addAnimation(tint, forKey: nil)
    }
    </code></pre>
    其實(shí)這個方法和前面的CABasicgroundColor大體是相同的岖圈,我們先把顏色改變成我們需要變成的顏色,然后執(zhí)行動畫钙皮。
  • 6蜂科、增大圓角的動畫
    <pre><code>
    func roundCorners(#layer: CALayer, #toRadius: CGFloat) {
    let round = CABasicAnimation(keyPath: "cornerRadius")
    round.fromValue = layer.cornerRadius
    layer.cornerRadius = toRadius
    round.toValue = toRadius
    round.duration = 0.33
    layer.addAnimation(round, forKey: nil)
    }
    </code></pre>
    這個實(shí)現(xiàn)的方法大體是上面改變顏色的思想是一模一樣的。也是先改變圓角短条,然后執(zhí)行動畫崇摄,最后顯示的會是你一開始設(shè)定的圓角。

現(xiàn)在整個動畫就只剩下了那個message的動畫慌烧,和message的動畫結(jié)束以后逐抑,Log in按鈕彈回的動畫,而Log in按鈕彈回的動畫和前面剛說過的按鈕彈下是一模一樣的屹蚊,只是相反而已厕氨。我們來看一下message的動畫:
<pre><code>
func removeMessage(#index: Int) {
UIView.animateWithDuration(0.33, delay: 0.0, options: nil, animations: {
self.status.center.x += self.view.frame.size.width
}, completion: {_ in
self.status.hidden = true
self.status.center = self.statusPosition

  self.showMessage(index: index+1)
})

}

func resetForm() {
UIView.transitionWithView(status, duration: 0.2, options: .TransitionFlipFromTop, animations: {
self.status.hidden = true
self.status.center = self.statusPosition
}, completion: nil)

UIView.animateWithDuration(0.2, delay: 0.0, options: nil, animations: {
  self.spinner.center = CGPoint(x: -20.0, y: 16.0)
  self.spinner.alpha = 0.0
  self.loginButton.bounds.size.width -= 80.0
  self.loginButton.center.y -= 60.0
}, completion: {_ in
  let tintColor = UIColor(red: 0.63, green: 0.84, blue: 0.35, alpha: 1.0)
  tintBackgroundColor(layer: self.loginButton.layer, toColor: tintColor)
  roundCorners(layer: self.loginButton.layer, toRadius: 10.0)
})

}

</code></pre>

這一段代碼用的全部都是UIViewAnimation,就不做多解釋汹粤,還是比較好理解的命斧,若是不理解,請看我前面的寫過的文章嘱兼。

我應(yīng)該沒有落下什么了~~~

各位看官看到這里也是難為你們了国葬。若是有問題歡迎留言提問。

所有代碼已經(jīng)上傳github:https://github.com/superxlx/iOS_Animation_Test3

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末芹壕,一起剝皮案震驚了整個濱河市汇四,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌踢涌,老刑警劉巖通孽,帶你破解...
    沈念sama閱讀 216,372評論 6 498
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異睁壁,居然都是意外死亡背苦,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,368評論 3 392
  • 文/潘曉璐 我一進(jìn)店門潘明,熙熙樓的掌柜王于貴愁眉苦臉地迎上來行剂,“玉大人,你說我怎么就攤上這事钳降『裨祝” “怎么了?”我有些...
    開封第一講書人閱讀 162,415評論 0 353
  • 文/不壞的土叔 我叫張陵牲阁,是天一觀的道長固阁。 經(jīng)常有香客問我,道長城菊,這世上最難降的妖魔是什么备燃? 我笑而不...
    開封第一講書人閱讀 58,157評論 1 292
  • 正文 為了忘掉前任,我火速辦了婚禮凌唬,結(jié)果婚禮上并齐,老公的妹妹穿的比我還像新娘扩借。我一直安慰自己扇谣,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,171評論 6 388
  • 文/花漫 我一把揭開白布渊季。 她就那樣靜靜地躺著更耻,像睡著了一般测垛。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上秧均,一...
    開封第一講書人閱讀 51,125評論 1 297
  • 那天食侮,我揣著相機(jī)與錄音,去河邊找鬼目胡。 笑死锯七,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的誉己。 我是一名探鬼主播眉尸,決...
    沈念sama閱讀 40,028評論 3 417
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼巨双!你這毒婦竟也來了噪猾?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 38,887評論 0 274
  • 序言:老撾萬榮一對情侶失蹤筑累,失蹤者是張志新(化名)和其女友劉穎畏妖,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體疼阔,經(jīng)...
    沈念sama閱讀 45,310評論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡戒劫,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,533評論 2 332
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了婆廊。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片迅细。...
    茶點(diǎn)故事閱讀 39,690評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖淘邻,靈堂內(nèi)的尸體忽然破棺而出茵典,到底是詐尸還是另有隱情,我是刑警寧澤宾舅,帶...
    沈念sama閱讀 35,411評論 5 343
  • 正文 年R本政府宣布统阿,位于F島的核電站彩倚,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏扶平。R本人自食惡果不足惜帆离,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,004評論 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望结澄。 院中可真熱鬧哥谷,春花似錦、人聲如沸麻献。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,659評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽勉吻。三九已至监婶,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間齿桃,已是汗流浹背压储。 一陣腳步聲響...
    開封第一講書人閱讀 32,812評論 1 268
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留源譬,地道東北人集惋。 一個月前我還...
    沈念sama閱讀 47,693評論 2 368
  • 正文 我出身青樓,卻偏偏與公主長得像踩娘,于是被迫代替她去往敵國和親刮刑。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,577評論 2 353

推薦閱讀更多精彩內(nèi)容

  • Core Animation Core Animation养渴,中文翻譯為核心動畫雷绢,它是一組非常強(qiáng)大的動畫處理API,...
    45b645c5912e閱讀 3,027評論 0 21
  • 在iOS實(shí)際開發(fā)中常用的動畫無非是以下四種:UIView動畫理卑,核心動畫翘紊,幀動畫,自定義轉(zhuǎn)場動畫藐唠。 1.UIView...
    請叫我周小帥閱讀 3,092評論 1 23
  • 顯式動畫 顯式動畫帆疟,它能夠?qū)σ恍傩宰鲋付ǖ淖远x動畫,或者創(chuàng)建非線性動畫宇立,比如沿著任意一條曲線移動踪宠。 屬性動畫 ...
    清風(fēng)沐沐閱讀 1,933評論 1 5
  • 聲明:本文是本人 編程小翁 原創(chuàng),轉(zhuǎn)載請注明妈嘹。 動效設(shè)計一直是iOS平臺的優(yōu)勢柳琢,良好的動效設(shè)計可以很好地提升用戶體...
    編程小翁閱讀 10,732評論 21 111
  • 在iOS中隨處都可以看到絢麗的動畫效果,實(shí)現(xiàn)這些動畫的過程并不復(fù)雜,今天將帶大家一窺ios動畫全貌柬脸。在這里你可以看...
    每天刷兩次牙閱讀 8,485評論 6 30