最近一段時(shí)間學(xué)習(xí)了不少新的技術(shù)传睹,一方面是做做總結(jié)以免自己忘記,另一方面也想分享給有需要的網(wǎng)友忠荞。如有不足希望各位網(wǎng)友幫我斧正蒋歌。
概述
自IOS7只有,蘋果開放了新的UIViewController之間的轉(zhuǎn)場(chǎng)動(dòng)畫委煤,開發(fā)者可以實(shí)現(xiàn)諸多酷炫的跳轉(zhuǎn)動(dòng)畫以及特殊的運(yùn)行堂油。本文主要先介紹UINavigation的非交互的自定義轉(zhuǎn)場(chǎng)動(dòng)畫,其他擴(kuò)展將在下一篇文章中進(jìn)行介紹碧绞。
先來個(gè)簡單的縮放轉(zhuǎn)場(chǎng)效果圖:
進(jìn)入正文:
在UINavigation的非交互的自定義轉(zhuǎn)場(chǎng)動(dòng)畫中府框,蘋果將此功能做成了一個(gè)協(xié)議UIViewControllerAnimatedTransitioning。 ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
蘋果官方對(duì)此協(xié)議的解釋為:該協(xié)議中的方法允許您定義一個(gè)動(dòng)畫對(duì)象讥邻,該對(duì)象創(chuàng)建用于在一段固定的時(shí)間內(nèi)將視圖控制器轉(zhuǎn)換為或關(guān)閉屏幕的動(dòng)畫迫靖。您使用此協(xié)議創(chuàng)建的動(dòng)畫不能是交互式的。要?jiǎng)?chuàng)建交互式轉(zhuǎn)換兴使,您必須將您的動(dòng)畫對(duì)象與控制動(dòng)畫時(shí)間的另一個(gè)對(duì)象相結(jié)合系宜。
廢話了那么多,直接開始代碼第一步发魄,創(chuàng)建NSObject類盹牧,來遵循UIViewControllerAnimatedTransitioning協(xié)議。
方框1:設(shè)置枚舉類別励幼,用于區(qū)別跳轉(zhuǎn)的模式 ? 方框2:遵循UIViewControllerAnimatedTransitioning協(xié)議
遵循協(xié)議之后我們需要在.m文件中寫入兩個(gè)協(xié)議中的方法汰寓。
方框1:這個(gè)方法主要是設(shè)置轉(zhuǎn)場(chǎng)動(dòng)畫的時(shí)間,以及用于百分比驅(qū)動(dòng)的交互轉(zhuǎn)換苹粟,以及容器控制器(也就是可交互轉(zhuǎn)場(chǎng)動(dòng)畫)
方框2:我們定義的轉(zhuǎn)場(chǎng)動(dòng)畫都在此方法中實(shí)現(xiàn)有滑。對(duì)此我們首先需要的是在transitionContext(轉(zhuǎn)場(chǎng)控制器)中設(shè)置起始控制器和目的控制器。之后我們根據(jù)跳轉(zhuǎn)模式將這兩個(gè)控制器寫入到transitionContext中嵌削。
方框3的方法如下:
方框1中:是將起始和目的控制器添加到轉(zhuǎn)場(chǎng)環(huán)境中毛好,這里有一個(gè)視圖的層級(jí)關(guān)系望艺,insertSubView中的視圖層級(jí)要比abvoeSubView中的要高,也就是說insertSubView的顯示是在abvoeSubView上面的睛榄。
需要注意的是:當(dāng)push和pop時(shí)荣茫,起始和目的控制器是相反的,所以網(wǎng)友在進(jìn)行自定義動(dòng)畫的時(shí)候務(wù)必要搞清楚順序场靴,要不然會(huì)出現(xiàn)控制器銷毀錯(cuò)誤,程序黑屏的情況港准。建議不熟悉的網(wǎng)友可以NSLog打印出startViewController和endViewController旨剥,以便整理思路。
方框2中:[transitionContext transitionWasCancelled]方法用于判斷當(dāng)前的轉(zhuǎn)場(chǎng)是否完成浅缸;[transitionContext completeTransition:]是當(dāng)轉(zhuǎn)場(chǎng)完成(或被取消)時(shí)轨帜,必須調(diào)用此方法。通常這是由對(duì)象符合UIViewControllerAnimatedTransitioning協(xié)議調(diào)用公開的過渡委托衩椒。對(duì)于純粹的交互式轉(zhuǎn)換蚌父,應(yīng)該由交互控制器調(diào)用。這個(gè)方法有效地更新了內(nèi)部視圖轉(zhuǎn)換結(jié)束時(shí)的控制器狀態(tài)毛萌。否則程序crash苟弛。
將遵循UIViewControllerAnimatedTransitioning的類創(chuàng)建好之后,我們開始第二步:使用這個(gè)類阁将。
這里需要注意的是膏秫,我們的navigation需要遵循UINavigationControllerDelegate協(xié)議,因?yàn)槲覀兊认滦枰褂肬INavigationControllerDelegate中的方法來返回我們的自定義動(dòng)畫做盅。
在viewDidLoad中申明代理缤削,由于轉(zhuǎn)場(chǎng)動(dòng)畫沖突,會(huì)導(dǎo)致UINavigation自帶的右滑返回上一層控制的手勢(shì)失效吹榴,所以方框1是重新設(shè)置右滑返回的代理亭敢。
這個(gè)方法是UINavigationControllerDelegate中的代理方法,用于返回實(shí)現(xiàn)自定義轉(zhuǎn)場(chǎng)動(dòng)畫图筹。需要注意的是方框1帅刀,operation可以辨識(shí)push和pop跳轉(zhuǎn)方式,所以我們需要提前判斷婿斥,然后做出相對(duì)應(yīng)的轉(zhuǎn)場(chǎng)動(dòng)畫劝篷。方框2中,是在跳轉(zhuǎn)時(shí)對(duì)起始和目的控制器做一下判斷民宿,這樣做的好處是娇妓,當(dāng)一個(gè)控制器有跳轉(zhuǎn)到多個(gè)控制器功能且只對(duì)指定目的控制器有自定義轉(zhuǎn)場(chǎng)動(dòng)畫時(shí),避免其他不相干的控制器實(shí)現(xiàn)自定義轉(zhuǎn)場(chǎng)功能活鹰。
需要注意的是:operation的push和pop狀態(tài)哈恰,fromVC和toVC是相反的只估,希望注意,避免不必要的錯(cuò)誤着绷,同樣各位也可以NSLog打印出來蛔钙,以便更好的理解。