iOS-OC-自定義轉(zhuǎn)場動畫

最近一段時間學習了不少新的技術,一方面是做做總結(jié)以免自己忘記,另一方面也想分享給有需要的網(wǎng)友。如有不足希望各位網(wǎng)友幫我斧正。


概述

自IOS7只有,蘋果開放了新的UIViewController之間的轉(zhuǎn)場動畫,開發(fā)者可以實現(xiàn)諸多酷炫的跳轉(zhuǎn)動畫以及特殊的運行。本文主要先介紹UINavigation的非交互的自定義轉(zhuǎn)場動畫,其他擴展將在下一篇文章中進行介紹。

先來個簡單的縮放轉(zhuǎn)場效果圖:

zoomTransition.gif

進入正文:

在UINavigation的非交互的自定義轉(zhuǎn)場動畫中,蘋果將此功能做成了一個協(xié)議UIViewControllerAnimatedTransitioning。 ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?

蘋果官方對此協(xié)議的解釋為:該協(xié)議中的方法允許您定義一個動畫對象,該對象創(chuàng)建用于在一段固定的時間內(nèi)將視圖控制器轉(zhuǎn)換為或關閉屏幕的動畫。您使用此協(xié)議創(chuàng)建的動畫不能是交互式的。要創(chuàng)建交互式轉(zhuǎn)換,您必須將您的動畫對象與控制動畫時間的另一個對象相結(jié)合。

廢話了那么多,直接開始代碼第一步,創(chuàng)建NSObject類,來遵循UIViewControllerAnimatedTransitioning協(xié)議。

創(chuàng)建一個遵循UIViewControllerAnimatedTransitioning協(xié)議的NSObject類

方框1:設置枚舉類別,用于區(qū)別跳轉(zhuǎn)的模式 ? 方框2:遵循UIViewControllerAnimatedTransitioning協(xié)議

遵循協(xié)議之后我們需要在.m文件中寫入兩個協(xié)議中的方法。

方框1:這個方法主要是設置轉(zhuǎn)場動畫的時間,以及用于百分比驅(qū)動的交互轉(zhuǎn)換,以及容器控制器(也就是可交互轉(zhuǎn)場動畫)

方框2:我們定義的轉(zhuǎn)場動畫都在此方法中實現(xiàn)。對此我們首先需要的是在transitionContext(轉(zhuǎn)場控制器)中設置起始控制器和目的控制器。之后我們根據(jù)跳轉(zhuǎn)模式將這兩個控制器寫入到transitionContext中。

方框3的方法如下:

方框3方法

方框1中:是將起始和目的控制器添加到轉(zhuǎn)場環(huán)境中,這里有一個視圖的層級關系,insertSubView中的視圖層級要比abvoeSubView中的要高,也就是說insertSubView的顯示是在abvoeSubView上面的。

需要注意的是:當push和pop時,起始和目的控制器是相反的,所以網(wǎng)友在進行自定義動畫的時候務必要搞清楚順序,要不然會出現(xiàn)控制器銷毀錯誤,程序黑屏的情況。建議不熟悉的網(wǎng)友可以NSLog打印出startViewController和endViewController,以便整理思路。

方框2中:[transitionContext transitionWasCancelled]方法用于判斷當前的轉(zhuǎn)場是否完成;[transitionContext completeTransition:]是當轉(zhuǎn)場完成(或被取消)時,必須調(diào)用此方法。通常這是由對象符合UIViewControllerAnimatedTransitioning協(xié)議調(diào)用公開的過渡委托。對于純粹的交互式轉(zhuǎn)換,應該由交互控制器調(diào)用。這個方法有效地更新了內(nèi)部視圖轉(zhuǎn)換結(jié)束時的控制器狀態(tài)。否則程序crash。


將遵循UIViewControllerAnimatedTransitioning的類創(chuàng)建好之后,我們開始第二步:使用這個類。

這里需要注意的是,我們的navigation需要遵循UINavigationControllerDelegate協(xié)議,因為我們等下需要使用UINavigationControllerDelegate中的方法來返回我們的自定義動畫。

在viewDidLoad中申明代理,由于轉(zhuǎn)場動畫沖突,會導致UINavigation自帶的右滑返回上一層控制的手勢失效,所以方框1是重新設置右滑返回的代理。


這個方法是UINavigationControllerDelegate中的代理方法,用于返回實現(xiàn)自定義轉(zhuǎn)場動畫。需要注意的是方框1,operation可以辨識push和pop跳轉(zhuǎn)方式,所以我們需要提前判斷,然后做出相對應的轉(zhuǎn)場動畫。方框2中,是在跳轉(zhuǎn)時對起始和目的控制器做一下判斷,這樣做的好處是,當一個控制器有跳轉(zhuǎn)到多個控制器功能且只對指定目的控制器有自定義轉(zhuǎn)場動畫時,避免其他不相干的控制器實現(xiàn)自定義轉(zhuǎn)場功能。

需要注意的是:operation的push和pop狀態(tài),fromVC和toVC是相反的,希望注意,避免不必要的錯誤,同樣各位也可以NSLog打印出來,以便更好的理解。



最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容