自定義ViewController動(dòng)畫切換

自定義動(dòng)畫切換的相關(guān)主要API

在學(xué)習(xí)自定義轉(zhuǎn)場(chǎng)動(dòng)畫之前魂毁,我們一起來(lái)看看相關(guān)SDK以及它們的關(guān)系和典型用法玛迄。這幾個(gè)接口和類的名字都比較類似婚苹,但是還是能比較好的描述出各自的職能中符,一開(kāi)始可能比較容易迷惑配阵,但是當(dāng)我們自己手動(dòng)實(shí)現(xiàn)一兩個(gè)例子過(guò)后冗澈,它們之間的關(guān)系就比較明了钦勘。

@protocol UIViewControllerContextTransitioning

這個(gè)接口用來(lái)提供切換上下文給開(kāi)發(fā)者使用,包含了從哪個(gè)VC到哪個(gè)VC等各類信息亚亲,一般不需要開(kāi)發(fā)中自己實(shí)現(xiàn)彻采。具體來(lái)說(shuō),iOS7的自定義切換目的之一就是切換相關(guān)代碼解藕捌归,在進(jìn)行VC切換時(shí)肛响,做切換效果實(shí)現(xiàn)的時(shí)候需要切換前后VC的一些信息,系統(tǒng)在新加入的API的比較的地方都會(huì)提供一個(gè)實(shí)現(xiàn)了該接口的對(duì)象以供我們使用惜索。

對(duì)于切換的動(dòng)畫實(shí)現(xiàn)來(lái)說(shuō)特笋,這個(gè)接口種最重要的方法有:

1. -(UIView *)containerView; VC切換所發(fā)生的view容器,開(kāi)發(fā)者應(yīng)該將切出的view移除巾兆,將切入的view加入到該view容器中猎物。

2. -(UIViewController *)viewControllerForKey:(NSString *)key; 提供一個(gè)key,返回對(duì)應(yīng)的VC〗撬埽現(xiàn)在的SDK中key的選擇只有UITransitionContextFromViewControllerKey和UITransitionContextToViewControllerKey兩種蔫磨,分別表示將要切出和切入的VC。

3. -(CGRect)initialFrameForViewController:(UIViewController *)vc; 某個(gè)VC的初始位置圃伶,可以用來(lái)做動(dòng)畫的計(jì)算堤如。

4. -(CGRect)finalFrameForViewController:(UIViewController *)vc; 與上面的方法對(duì)應(yīng)蒲列,得到切換結(jié)束時(shí)某個(gè)VC應(yīng)在的frame。

5. -(void)completeTransition:(BOOL)didComplete; 向這個(gè)context報(bào)告切換已經(jīng)完成搀罢。

@protocol?UIViewControllerAnimatedTransitioning

這個(gè)接口負(fù)責(zé)切換的具體內(nèi)容蝗岖,也即“切換中應(yīng)該發(fā)生什么”。開(kāi)發(fā)者在做自定義切換效果時(shí)大部分代碼會(huì)是用來(lái)實(shí)現(xiàn)這個(gè)接口榔至。它只有兩個(gè)方法需要我們實(shí)現(xiàn):

1. -(NSTimeInterval)transitionDuration:(id < UIViewControllerContextTransitioning >)transitionContext; 系統(tǒng)給出一個(gè)切換上下文剪侮,我們根據(jù)上下文環(huán)境返回這個(gè)切換所需要的花費(fèi)時(shí)間(一般就返回動(dòng)畫的時(shí)間就好了,SDK會(huì)用這個(gè)時(shí)間來(lái)在百分比驅(qū)動(dòng)的切換中進(jìn)行幀的計(jì)算洛退,后面再詳細(xì)展開(kāi))。

2. -(void)animateTransition:(id < UIViewControllerContextTransitioning >)transitionContext; 在進(jìn)行切換的時(shí)候?qū)⒄{(diào)用該方法杰标,我們對(duì)于切換時(shí)的UIView的設(shè)置和動(dòng)畫都在這個(gè)方法中完成兵怯。

@protocol?UIViewControllerTransitioningDelegate

這個(gè)接口的作用比較簡(jiǎn)單單一,在需要VC切換的時(shí)候系統(tǒng)會(huì)像實(shí)現(xiàn)了這個(gè)接口的對(duì)象詢問(wèn)是否需要使用自定義的切換效果腔剂。這個(gè)接口共有四個(gè)類似的方法:

1. -(id< UIViewControllerAnimatedTransitioning >)animationControllerForPresentedController:(UIViewController *)presented presentingController:(UIViewController *)presenting sourceController:(UIViewController *)source;

2. -(id< UIViewControllerAnimatedTransitioning >)animationControllerForDismissedController:(UIViewController *)dismissed;

3. -(id< UIViewControllerInteractiveTransitioning >)interactionControllerForPresentation:(id < UIViewControllerAnimatedTransitioning >)animator;

4. -(id< UIViewControllerInteractiveTransitioning >)interactionControllerForDismissal:(id < UIViewControllerAnimatedTransitioning >)animator;

前兩個(gè)方法是針對(duì)動(dòng)畫切換的媒区,我們需要分別在呈現(xiàn)VC和解散VC時(shí),給出一個(gè)實(shí)現(xiàn)了UIViewControllerAnimatedTransitioning接口的對(duì)象(其中包含切換時(shí)長(zhǎng)和如何切換)掸犬。后兩個(gè)方法涉及交互式切換袜漩,之后再說(shuō)。

介紹了理論上的東西湾碎,我們來(lái)實(shí)現(xiàn)一下宙攻,Demo來(lái)了~~

首先我們需要新建一個(gè)實(shí)現(xiàn)了UIViewControllerAnimatedTransitioning協(xié)議的類。


解釋一下這個(gè)實(shí)現(xiàn):

我們首先需要得到參與切換的兩個(gè)ViewController的信息介褥,使用context的方法拿到它們的參照座掘;

對(duì)于要呈現(xiàn)的VC,我們希望它從屏幕下方出現(xiàn)柔滔,因此將初始位置設(shè)置到屏幕下邊緣溢陪;

將view添加到containerView中;

開(kāi)始動(dòng)畫睛廊。這里的動(dòng)畫時(shí)間長(zhǎng)度和切換時(shí)間長(zhǎng)度一致形真,都為0.8s。usingSpringWithDamping的UIView動(dòng)畫API是iOS7新加入的超全,描述了一個(gè)模擬彈簧動(dòng)作的動(dòng)畫曲線咆霜,我們?cè)谶@里只做使用,更多信息可以參看相關(guān)文檔卵迂;(順便多說(shuō)一句裕便,iOS7中對(duì)UIView動(dòng)畫添加了一個(gè)很方便的Category,UIViewKeyframeAnimations见咒。使用其中方法可以為UIView動(dòng)畫添加關(guān)鍵幀動(dòng)畫)

在動(dòng)畫結(jié)束后我們必須向context報(bào)告VC切換完成偿衰,是否成功(在這里的動(dòng)畫切換中,沒(méi)有失敗的可能性,因此直接pass一個(gè)YES過(guò)去)下翎。系統(tǒng)在接收到這個(gè)消息后缤言,將對(duì)VC狀態(tài)進(jìn)行維護(hù)。

接下來(lái)我們實(shí)現(xiàn)一個(gè)UIViewControllerTransitioningDelegate视事,應(yīng)該就能讓它工作了胆萧。我們現(xiàn)在在ViewController當(dāng)中來(lái)直接實(shí)現(xiàn)這個(gè)接口。如下


ViewController

參考https://onevcat.com/2013/10/vc-transition-in-ios7/

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末俐东,一起剝皮案震驚了整個(gè)濱河市跌穗,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌虏辫,老刑警劉巖蚌吸,帶你破解...
    沈念sama閱讀 221,406評(píng)論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異砌庄,居然都是意外死亡羹唠,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,395評(píng)論 3 398
  • 文/潘曉璐 我一進(jìn)店門娄昆,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)佩微,“玉大人,你說(shuō)我怎么就攤上這事萌焰〔该校” “怎么了?”我有些...
    開(kāi)封第一講書人閱讀 167,815評(píng)論 0 360
  • 文/不壞的土叔 我叫張陵杆怕,是天一觀的道長(zhǎng)族购。 經(jīng)常有香客問(wèn)我,道長(zhǎng)陵珍,這世上最難降的妖魔是什么寝杖? 我笑而不...
    開(kāi)封第一講書人閱讀 59,537評(píng)論 1 296
  • 正文 為了忘掉前任,我火速辦了婚禮互纯,結(jié)果婚禮上瑟幕,老公的妹妹穿的比我還像新娘。我一直安慰自己留潦,他們只是感情好只盹,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,536評(píng)論 6 397
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著兔院,像睡著了一般殖卑。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上坊萝,一...
    開(kāi)封第一講書人閱讀 52,184評(píng)論 1 308
  • 那天孵稽,我揣著相機(jī)與錄音许起,去河邊找鬼。 笑死菩鲜,一個(gè)胖子當(dāng)著我的面吹牛园细,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播接校,決...
    沈念sama閱讀 40,776評(píng)論 3 421
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼猛频,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了蛛勉?” 一聲冷哼從身側(cè)響起鹿寻,我...
    開(kāi)封第一講書人閱讀 39,668評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎诽凌,沒(méi)想到半個(gè)月后烈和,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,212評(píng)論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡皿淋,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,299評(píng)論 3 340
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了恬试。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片窝趣。...
    茶點(diǎn)故事閱讀 40,438評(píng)論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖训柴,靈堂內(nèi)的尸體忽然破棺而出哑舒,到底是詐尸還是另有隱情,我是刑警寧澤幻馁,帶...
    沈念sama閱讀 36,128評(píng)論 5 349
  • 正文 年R本政府宣布洗鸵,位于F島的核電站,受9級(jí)特大地震影響仗嗦,放射性物質(zhì)發(fā)生泄漏膘滨。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,807評(píng)論 3 333
  • 文/蒙蒙 一稀拐、第九天 我趴在偏房一處隱蔽的房頂上張望火邓。 院中可真熱鬧,春花似錦德撬、人聲如沸铲咨。這莊子的主人今日做“春日...
    開(kāi)封第一講書人閱讀 32,279評(píng)論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)纤勒。三九已至,卻和暖如春隆檀,著一層夾襖步出監(jiān)牢的瞬間摇天,已是汗流浹背粹湃。 一陣腳步聲響...
    開(kāi)封第一講書人閱讀 33,395評(píng)論 1 272
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留闸翅,地道東北人再芋。 一個(gè)月前我還...
    沈念sama閱讀 48,827評(píng)論 3 376
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像坚冀,于是被迫代替她去往敵國(guó)和親济赎。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,446評(píng)論 2 359

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