在iOS系統中,優美的轉場動畫是構建一個優秀的app必不可少的因素。
轉場動畫,顧名思義,就是兩個控制器在切換時產生的動畫。
想要制作屬于自己的轉場動畫最為簡單的方式就是使用系統系統的轉場方法:- (void)presentViewController:(UIViewController*)viewControllerToPresent animated: (BOOL)flag completion:(void(^)(void))completion;并將flag置為NO,然后實現自己的轉場動畫,在動畫結束時,調用這個方法。
可以發現,使用這種方式是較為簡潔,然而就代碼來說,無疑是糟糕透頂,而且對復用來說也存在不小的問題。在這種情況下,我們可以使用另一種轉場方式。
如果細心的同學會發現,在UIViewController中,有一個屬性:transitioningDelegate,這個屬性就是我們完成轉場動畫的關鍵所在。
在繼承了UIViewControllerTransitioningDelegate 協議后,可以看到協議中有幾個方法:
- (id)animationControllerForDismissedController:(UIViewController*)dismissed;和 ?- (id)animationControllerForPresentedController:(UIViewController*)presented presentingController:(UIViewController*)presenting sourceController:(UIViewController*)source;
從名字就可以看出,一個方法用于當控制器消失時返回轉場對象,另一個用于當控制器跳轉時返回轉場對象。
接下來,我們需要構造自己的轉場對象,并在這兩個方法中返回,即可實現可重用且耦合性低的轉場動畫。
在建立我們自己的轉場對象時,首先建立一個繼承于NSObject對象的類,并實現UIViewControllerAnimatedTransitioning協議。重寫其中的幾個關鍵方法。
- (NSTimeInterval)transitionDuration:(id)transitionContext;和 ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? - (void)animateTransition:(id)transitionContext;
第一個方法是返回動畫的時間,第二個方法中定義我們所想要的轉場效果。需要注意的是transitionContext參數,該屬性實現了UIViewControllerContextTransitioning協議,通過這個參數,我們可以得到很多有用的信息,比如轉場動畫時的來源控制器和目標控制器,還有用于動畫的對象。通過這些信息就可以根據我們自己的需求來定制轉場動畫。
最終實現的效果如下:
你可以在這里得到該項目。