第一節(jié)第二章Spring動(dòng)畫

demo:https://github.com/womendexinshijie/BahamaAirLoginScreenOC1

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?第2章:Springs

在前一章中程拭,您學(xué)習(xí)了如何創(chuàng)建UIKit的基本動(dòng)畫蔗坯,包括如何提供起始值和結(jié)束值隨著時(shí)間的UIKit剔蹋,自動(dòng)為你創(chuàng)建一個(gè)動(dòng)畫。

到目前為止欲主,你的動(dòng)畫一直是單方向的流體運(yùn)動(dòng)较木。當(dāng)你激活一個(gè)視圖的位置時(shí)载碌,它是一個(gè)從A點(diǎn)到B點(diǎn)的簡(jiǎn)單運(yùn)動(dòng)胁后,就像這樣:


在本章中,您將學(xué)習(xí)如何創(chuàng)建更復(fù)雜的動(dòng)畫琼娘,將視圖移動(dòng)到它們與Spring的連接上峭弟,如下所示:


如果你通過(guò)基本動(dòng)畫從A點(diǎn)到B點(diǎn),在此基礎(chǔ)上加點(diǎn)彈性脱拼,動(dòng)畫的運(yùn)動(dòng)將遵循一個(gè)下面的紅色箭頭指示的路徑:


箭頭從A點(diǎn)到B點(diǎn)孟害,但是超過(guò)B點(diǎn)的一小部分,然后箭頭又返回B點(diǎn)另一側(cè)一點(diǎn)挪拟。這種來(lái)回?cái)[動(dòng)重復(fù)直到視圖在B點(diǎn)靜止為止。

這是一個(gè)很好的效果击你;它增加了一個(gè)活潑的玉组,真實(shí)的動(dòng)感,讓人切身的感受到你的動(dòng)畫丁侄。本章將向您展示如何使用此效果為用戶界面添加一點(diǎn)趣味性惯雳。

Spring animations彈性動(dòng)畫

您將繼續(xù)使用上一章的項(xiàng)目;如果您沒(méi)有完成第1章中的練習(xí)(包括第1章最后的挑戰(zhàn))鸿摇,那么您也可以從第2章的資源文件夾中獲取啟動(dòng)項(xiàng)目并使用它開(kāi)始新的征程石景。

構(gòu)建和運(yùn)行你的項(xiàng)目;你應(yīng)該看到屏幕上的視圖(除了登錄按鈕)在應(yīng)用程序打開(kāi)時(shí)會(huì)有像這樣的動(dòng)畫效果:


您的任務(wù)是處理屏幕上的最后一個(gè)非動(dòng)畫元素:登錄按鈕。

打開(kāi)項(xiàng)目的視圖控制器ViewController潮孽,然后將下面的代碼添加到viewWillAppear() :方法內(nèi)的:

self.loginButton.center = CGPointMake(self.loginButton.center.x, self.loginButton.center.y + 30.0);

self.loginButton.alpha = 0.0;

正如前一章所做的那樣揪荣,在y軸上設(shè)置按鈕的起始位置稍低一點(diǎn),并將其alpha值設(shè)置為零往史,使其開(kāi)始為不可見(jiàn)仗颈。

現(xiàn)在viewdidappear()添加以下代碼:

[UIView animateWithDuration:0.5 delay:0.5 usingSpringWithDamping:0.5 initialSpringVelocity:0.0 options:nil animations:^{

? ? ? ? self.loginButton.center = CGPointMake(self.loginButton.center.x, self.loginButton.center.y - 30.0);

? ? ? ? self.loginButton.alpha = 1.0;

? ? } completion:nil];

這段代碼有兩個(gè)要點(diǎn)。

首先椎例,您同時(shí)激活了兩個(gè)不同的屬性挨决!這比你想象的容易,對(duì)吧订歪?

其次脖祈,您第一次使用了一種新的動(dòng)畫方法:

animatewithduration(_:delay: usingSpringWithDamping: initialSpringVelocity: opti ons: animations: completion:)。說(shuō)方法的名字太快可能會(huì)傷害你的舌頭刷晋!??

上面的方法很像你在本書前一章所用的方法盖高,但是它有一些新的參數(shù):

?usingspringwithdamping:控制阻尼量,或降低掏秩,當(dāng)動(dòng)畫接近它的最終狀態(tài)時(shí)使用到阻尼參數(shù)或舞。此參數(shù)接受0到1之間的值。值接近0蒙幻,創(chuàng)造一個(gè)活躍的動(dòng)畫映凳,而值接近1,將會(huì)展現(xiàn)一種僵硬的動(dòng)畫效果邮破。你可以把這個(gè)值看作彈簧的“剛度”诈豌。

?initialspringvelocity:控制動(dòng)畫的初始速度。將動(dòng)畫的初始速度的值設(shè)置為1抒和,預(yù)示著在一秒鐘內(nèi)(動(dòng)畫運(yùn)動(dòng)的持續(xù)時(shí)間duration:內(nèi))動(dòng)畫運(yùn)動(dòng)的總距離矫渔。所以值的大小會(huì)影響動(dòng)畫的初始速度的快慢(值越大。開(kāi)始時(shí)動(dòng)畫的速度越快摧莽,值越小庙洼,動(dòng)畫開(kāi)始時(shí)的速度越小镊辕;效果可以通過(guò)固定動(dòng)畫持續(xù)時(shí)間油够,改變此值來(lái)觀看)。(注釋:假設(shè)動(dòng)畫持續(xù)時(shí)間為1秒征懈,initialspringvelocity值為2石咬,說(shuō)明動(dòng)畫要在1秒內(nèi)運(yùn)動(dòng)2的距離,如果initialspringvelocity值為10卖哎,說(shuō)明動(dòng)畫在1秒內(nèi)要運(yùn)動(dòng)10的距離鬼悠,速度相較于2的時(shí)候删性,一定是快的)

構(gòu)建和運(yùn)行您的項(xiàng)目;檢查按鈕現(xiàn)在如何移動(dòng):


因?yàn)槟愕膭?dòng)畫初始速度為0焕窝,中性阻尼為0.5蹬挺,動(dòng)畫看起來(lái)不是很搶眼。

你應(yīng)該通過(guò)嘗試一些不同的速度和阻尼值來(lái)修飾這個(gè)動(dòng)畫袜啃。

將持續(xù)時(shí)間改為3汗侵,阻尼降至0.1。這只是為了讓你觀察到動(dòng)畫在慢動(dòng)作中的變化群发,而不是正常的速度晰韵。

再次構(gòu)建和運(yùn)行您的項(xiàng)目;注意按鈕的不透明度如何隨著它的移動(dòng)而變化熟妓。這是因?yàn)镾pring行為影響了所有動(dòng)畫屬性雪猪;在這種情況下,這會(huì)影響按鈕的垂直位置和alpha值起愈。

現(xiàn)在initialspringvelocity值設(shè)為1.0只恨,建立并再次運(yùn)行你的項(xiàng)目:


你會(huì)注意到,按鈕彈起的最高點(diǎn)超過(guò)了密碼控件然后再回落到最終設(shè)置的位置抬虽;這是因?yàn)樗谶\(yùn)動(dòng)的開(kāi)始官觅,施加了更多的動(dòng)力,因而它需要更長(zhǎng)的時(shí)間才能安定下來(lái)阐污,回到它最終位置休涤。

圍繞阻尼和速度參數(shù)使用不同的值,直到您了解這些參數(shù)的變化如何影響動(dòng)畫的外觀和感覺(jué)為止笛辟。

測(cè)試完成后功氨,將速度和阻尼值設(shè)置為原來(lái)的值,像這樣:

[UIView animateWithDuration:0.5 delay:0.5 usingSpringWithDamping:0.5 initialSpringVelocity:0.0 options:nil animations:^{

? ? ? ? self.loginButton.center = CGPointMake(self.loginButton.center.x, self.loginButton.center.y - 30.0);

? ? ? ? self.loginButton.alpha = 1.0;

? ? } completion:nil];

動(dòng)畫的用戶交互

您不必局限在將Spring動(dòng)畫添加到視圖的初始位置手幢。事實(shí)上捷凄,根據(jù)用戶輸入時(shí)再激活動(dòng)畫,可以真正的使界面變得生動(dòng)起來(lái)围来。在本節(jié)中跺涤,您將對(duì)登錄按鈕進(jìn)行激活使其變得更加生動(dòng)。

將下面的代碼添加到login():

[UIView animateWithDuration:0.5 delay:0.5 usingSpringWithDamping:0.5 initialSpringVelocity:0.0 options:nil animations:^{

? ? ? ? self.loginButton.bounds = CGRectMake(self.loginButton.bounds.origin.x, self.loginButton.bounds.origin.y, self.loginButton.bounds.size.width + 80.0, self.loginButton.bounds.size.height);

? ? } completion:nil];

上面的動(dòng)畫將按鈕的寬度增加了80监透,持續(xù)了1.5秒桶错。該按鈕均勻的向周圍擴(kuò)散,因?yàn)樽枘嵩O(shè)置為只有0.2才漆。使其左右兩側(cè)的邊界增長(zhǎng)。

構(gòu)建并運(yùn)行你的項(xiàng)目佛点;點(diǎn)擊按鈕查看你的動(dòng)畫:


當(dāng)你點(diǎn)擊這個(gè)按鈕的時(shí)候醇滥,按鈕有增長(zhǎng)和反彈的動(dòng)作黎比,這是向用戶提供了點(diǎn)擊操作時(shí)的一種反饋效果。

接下來(lái)鸳玩,您將結(jié)合這個(gè)動(dòng)畫與一些更多的Spring動(dòng)作阅虫,真正的讓按鈕生動(dòng)起來(lái)。

將下面的代碼添加到login()方法的結(jié)尾:

[UIView animateWithDuration:0.33 delay:0.0 usingSpringWithDamping:0.7 initialSpringVelocity:0.0 options:nil animations:^{

? ? ? ? self.loginButton.center = CGPointMake(self.loginButton.center.x, self.loginButton.center.y + 60.0);

? ? } completion:nil];上面的動(dòng)畫在點(diǎn)擊時(shí)將按鈕向下移動(dòng)60個(gè)點(diǎn)不跟。注意颓帝,這個(gè)動(dòng)畫持續(xù)時(shí)間比按鈕寬度的動(dòng)畫持續(xù)時(shí)間要短。

這是有意的窝革,因?yàn)樗谕男Ч屈c(diǎn)擊按鈕的時(shí)候就讓它向下移動(dòng)购城,在到達(dá)設(shè)置的垂直位置后彈跳一點(diǎn)。

構(gòu)建并運(yùn)行你的項(xiàng)目虐译;點(diǎn)擊按鈕瘪板,看看它如何響應(yīng)你的觸摸:


看起來(lái)很不錯(cuò),你很快就會(huì)成為一名動(dòng)畫大師漆诽,而且你知道你可以做得更好侮攀!

另一個(gè)提供給用戶反饋的好方法是通過(guò)顏色改變。你將通過(guò)改變按鈕背景色的色值來(lái)改變按鈕的色彩厢拭。

在動(dòng)畫結(jié)束表達(dá)式中兰英,添加以下代碼到您動(dòng)畫結(jié)束的block中(completion:^(BOOL finished) {}):

self.loginButton.backgroundColor = [UIColor colorWithRed:0.85 green:0.83 blue:0.45 alpha:1.0];


這里還有最后一點(diǎn)反饋:活動(dòng)指示器。登錄按鈕應(yīng)該在網(wǎng)絡(luò)上啟動(dòng)一個(gè)用戶身份驗(yàn)證的活動(dòng)供鸠,所以向用戶顯示活動(dòng)指示器畦贸,讓他們知道正在進(jìn)行的操作是在正常運(yùn)行的。

向上滾動(dòng)代碼回季,你可以在viewdidload()中找到有關(guān)進(jìn)度指示的代碼家制。微調(diào)包含 UIActivityIndicatorView的代碼,準(zhǔn)備好你的使用實(shí)例泡一。你還沒(méi)有在屏幕上看到它颤殴,因?yàn)樗腶lpha設(shè)置為0。

回到login()鼻忠,將下面的代碼添加到最后的動(dòng)畫block表達(dá)式:

self.spinner.center = CGPointMake(40, self.loginButton.frame.size.height/2);

self.spinner.alpha = 1.0;

此動(dòng)畫將活動(dòng)指示器向左移動(dòng)涵但,并將其淡入。這應(yīng)該足以吸引用戶的注意帖蔓,讓他們知道他們的請(qǐng)求正在被處理矮瘟。

編譯并運(yùn)行您的項(xiàng)目;看看你漂亮的新動(dòng)畫的最終版本


花點(diǎn)時(shí)間反思一下你在這里所取得的成就塑娇。在按鈕視圖中添加了三個(gè)同步動(dòng)畫澈侠,以使其在寬度、移動(dòng)屏幕和顏色方面進(jìn)行了改變埋酬。

你的活動(dòng)指示器動(dòng)畫和其淡入方式哨啃,這本身就是一個(gè)視圖按鈕的查看動(dòng)效烧栋。

由UIKit創(chuàng)建出的動(dòng)畫自動(dòng)的結(jié)合在一起正常運(yùn)行,創(chuàng)造出一個(gè)流暢的視覺(jué)效果拳球。

感謝UIKit审姓!讓你不需要擔(dān)心你的動(dòng)畫的實(shí)現(xiàn)細(xì)節(jié),而專注于設(shè)計(jì)優(yōu)秀的動(dòng)畫


? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?挑戰(zhàn)

挑戰(zhàn)1:將文本字段動(dòng)畫轉(zhuǎn)換為Spring動(dòng)畫

在UIKit中Spring動(dòng)畫的API和一般動(dòng)畫的使用標(biāo)準(zhǔn)十分相似祝峻。因此魔吐,將您在用戶名和密碼字段上運(yùn)行的動(dòng)畫轉(zhuǎn)換為Spring動(dòng)畫應(yīng)該不會(huì)有什么問(wèn)題。

要完成這一挑戰(zhàn)莱找,您需要執(zhí)行以下操作:

1酬姆。添加usingspringwithdamping和initialspringvelocity參數(shù)動(dòng)畫的用戶領(lǐng)域。彈簧初始速度使用0宋距。嘗試0.2轴踱,0.6和0.9彈簧阻尼,選擇最使你愉快和舒服的Spring的值谚赎。

2淫僻。使用您選擇的阻尼和速度重復(fù)密碼字段動(dòng)畫。


在這本書中壶唤,你已經(jīng)獲得了Spring動(dòng)畫的堅(jiān)實(shí)基礎(chǔ)雳灵。你玩這種類型的動(dòng)畫越多,你對(duì)阻尼和速度的不同組合進(jìn)行的實(shí)驗(yàn)越多闸盔,你就越能為自己的應(yīng)用程序設(shè)計(jì)完美的Spring動(dòng)畫悯辙。

你準(zhǔn)備好進(jìn)入下一章了嗎?在3章中迎吵,你將了解UIKit的下一種類型:轉(zhuǎn)換

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末躲撰,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子击费,更是在濱河造成了極大的恐慌拢蛋,老刑警劉巖,帶你破解...
    沈念sama閱讀 216,470評(píng)論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件蔫巩,死亡現(xiàn)場(chǎng)離奇詭異谆棱,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)圆仔,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,393評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門垃瞧,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人坪郭,你說(shuō)我怎么就攤上這事个从。” “怎么了歪沃?”我有些...
    開(kāi)封第一講書人閱讀 162,577評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵嗦锐,是天一觀的道長(zhǎng)鸵隧。 經(jīng)常有香客問(wèn)我,道長(zhǎng)意推,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書人閱讀 58,176評(píng)論 1 292
  • 正文 為了忘掉前任珊蟀,我火速辦了婚禮菊值,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘育灸。我一直安慰自己腻窒,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,189評(píng)論 6 388
  • 文/花漫 我一把揭開(kāi)白布磅崭。 她就那樣靜靜地躺著儿子,像睡著了一般。 火紅的嫁衣襯著肌膚如雪砸喻。 梳的紋絲不亂的頭發(fā)上柔逼,一...
    開(kāi)封第一講書人閱讀 51,155評(píng)論 1 299
  • 那天,我揣著相機(jī)與錄音割岛,去河邊找鬼愉适。 笑死,一個(gè)胖子當(dāng)著我的面吹牛癣漆,可吹牛的內(nèi)容都是我干的维咸。 我是一名探鬼主播,決...
    沈念sama閱讀 40,041評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼惠爽,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼癌蓖!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起婚肆,我...
    開(kāi)封第一講書人閱讀 38,903評(píng)論 0 274
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤租副,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后旬痹,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體附井,經(jīng)...
    沈念sama閱讀 45,319評(píng)論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,539評(píng)論 2 332
  • 正文 我和宋清朗相戀三年两残,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了永毅。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,703評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡人弓,死狀恐怖沼死,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情崔赌,我是刑警寧澤意蛀,帶...
    沈念sama閱讀 35,417評(píng)論 5 343
  • 正文 年R本政府宣布耸别,位于F島的核電站,受9級(jí)特大地震影響县钥,放射性物質(zhì)發(fā)生泄漏秀姐。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,013評(píng)論 3 325
  • 文/蒙蒙 一若贮、第九天 我趴在偏房一處隱蔽的房頂上張望省有。 院中可真熱鬧,春花似錦谴麦、人聲如沸蠢沿。這莊子的主人今日做“春日...
    開(kāi)封第一講書人閱讀 31,664評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)舷蟀。三九已至,卻和暖如春面哼,著一層夾襖步出監(jiān)牢的瞬間野宜,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書人閱讀 32,818評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工魔策, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留速缨,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 47,711評(píng)論 2 368
  • 正文 我出身青樓代乃,卻偏偏與公主長(zhǎng)得像旬牲,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子搁吓,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,601評(píng)論 2 353

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

  • 在iOS中隨處都可以看到絢麗的動(dòng)畫效果原茅,實(shí)現(xiàn)這些動(dòng)畫的過(guò)程并不復(fù)雜,今天將帶大家一窺iOS動(dòng)畫全貌堕仔。在這里你可以看...
    F麥子閱讀 5,110評(píng)論 5 13
  • 在iOS中隨處都可以看到絢麗的動(dòng)畫效果擂橘,實(shí)現(xiàn)這些動(dòng)畫的過(guò)程并不復(fù)雜,今天將帶大家一窺ios動(dòng)畫全貌摩骨。在這里你可以看...
    每天刷兩次牙閱讀 8,485評(píng)論 6 30
  • “動(dòng)畫”一詞源自拉丁語(yǔ)通贞,意思是“生命的行為”。在您的應(yīng)用程序中恼五,動(dòng)畫可以將界面元素平滑地帶入屏幕或焦點(diǎn)昌罩,可以吸引用...
    titvax閱讀 588評(píng)論 0 0
  • Spring Cloud為開(kāi)發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見(jiàn)模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn)灾馒,斷路器茎用,智...
    卡卡羅2017閱讀 134,651評(píng)論 18 139
  • 在iOS實(shí)際開(kāi)發(fā)中常用的動(dòng)畫無(wú)非是以下四種:UIView動(dòng)畫,核心動(dòng)畫,幀動(dòng)畫轨功,自定義轉(zhuǎn)場(chǎng)動(dòng)畫旭斥。 1.UIView...
    請(qǐng)叫我周小帥閱讀 3,092評(píng)論 1 23