解讀UIViewControllerTransitioning.h,理解轉場動畫


  1.系統會創建一個轉場相關的上下文對象,傳遞到動畫執行器的animateTransition:和transitionDuration:方法,同樣,也會傳遞到交互Controller的startInteractiveTransition:方法。如果交互Controller的startInteractiveTransition:首先被調用了,那么交互Controller對象應該在需要的時候,手動的調用animateTransition:方法。非交互Controller而是執行普通的Controller的過渡轉場動畫時,系統將自動調用動畫執行器的animateTransition:方法。

  系統會查詢視圖控制器的transitioningDelegate或導航控制器的delegate代理來決定動畫執行器或交互Controller是否應該被應用一個過渡轉場效果,transitioningDelegate是UIViewController的新屬性,該屬性是實現了UIViewControllerTransitioningDelegate協議的對象,導航控制器同樣的增加了一些新的委托方法。

  UIViewControllerContextTransitioning協議可以被容器Controller接收采用,它是被設計用來實現比系統目前支持的更多復雜的轉場效果。目前,導航控制器的push/pops行為和視圖控制器的present/dismiss轉場效果可以被自定義。轉場相關的信息與這些方法相關聯綁定着,viewControllerForKey:,initialFrameForViewController:和finalFrameForViewController:方法。系統提供兩個Key用來辨識導航控制器執行push/pop和視圖控制器執行present/dismiss轉場時對應的from視圖控制器和to視圖控制器。

  所有自定義的動畫必須在轉場程序完成時調用上下文對象的completeTransition:方法。此外,動畫應該在上下文中指定的containerView中發生。對於交互轉場動畫,上下文對象的updateInteractiveTransition:,finishInteractiveTransition和cancelInteractiveTransition:方法應該在交互動畫過程中被調用。UIPercentDrivenInteractiveTransition類提供了對UIViewControllerInteractiveTransitioning協議的實現,該類可以被用來交互性驅動任何由動畫執行器創建的UIView屬性動畫。

 

  2.【協議】UIViewControllerContextTransitioning

  2.1 【屬性】containerView: UIView 發生轉場動畫所在的視圖,允許在自定義轉場時往該視圖添加或者移除子視圖。

  2.2 【屬性】animated: Bool 大多數時候這個值是YES/true。對於使用了新的呈現類型UIModalPresentationCustom的自定義轉場過渡,即使轉場過渡沒有以動畫的形式進行,系統也將調用animateTransition:方法。

  2.3 【屬性】interactive: Bool 指示轉場是否處於交互狀態

  2.4 【屬性】transitionWasCancelled: Bool 指示轉場是否被取消

  2.5 【屬性】presentationStyle: UIModalPresentationStyle

  符合UIViewControllerInteractiveTransitioning協議的可交互Controller(由容器型視圖控制器的代理聲明持有,或就present呈現方式來說,由transitioningDelegate聲明持有)應該在轉場交互被忽略(scrubbed),然后要么被取消,要么完成轉場時調用下面這些方法。注意一下,如果動畫執行器是可被中斷的,然后調用finishInteractiveTransition:和cancelInteractiveTransition:來標識此次轉場未被中斷,將自然的完成或者被取消掉。

  2.6 【方法】updateInteractiveTransition(percentComplete: CGFloat)

  2.7 【方法】finishInteractiveTransition

  2.8 【方法】cancelInteractiveTransition

  2.9 【方法】pauseInteractiveTransition 當轉場過程被中斷且需要被暫停時調用此方法

  2.10 【方法】completeTransition(didComplete: Bool) 無論轉場在什么時候完成或是被取消,此方法都必須被調用。通常此方法由符合UIViewControllerAnimatedTransitioning協議的轉場代理對象調用。純交互式轉場過渡此方法應該在交互Controller中調用。此方法在轉場結束時有效地更新內部視圖控制器的狀態。

  2.11 【方法】viewControllerForKey(key: UITransitionContextViewControllerKey) 系統當前只定義了兩個Key - UITransitionContextToViewControllerKey 和 UITransitionContextFromViewControllerKey。動畫執行器不應直接操作一個視圖控制器相關聯的視圖,應該使用viewForKey:來獲取。

  2.12 【方法】viewForKey(key: UITransitionContextViewKey) 系統當前只定義了兩個Key - UITransitionContextFromViewKey 和 UITransitionContextToViewKey。此方法可能返回nil,代表動畫執行器不應操作相關聯的視圖控制器的視圖。

  2.13 【屬性】targetTransform

  2.14 【方法】initialFrameForViewController(vc: UIViewController)、finalFrameForViewController(vc: UIViewController) 當frame無法得知或者未定義時將被設置為CGRectZero。例如,當且僅當fromView在轉場結束時將從窗口中移除時,fromViewController的finalFrame將為CGRectZero。另一方面,如果finalFrame不為CGRectZero,那么它必須在轉場結束時被認真處理。

 

  3.【協議】UIViewControllerAnimatedTransitioning

  3.1 【方法】transitionDuration(transitionContext: UIViewControllerContextTransitioning) 百分比驅動交互式轉場中被使用,此外也應用於包含有需要與主動畫同步的輔助動畫的容器Controllers。?

  3.2 【方法】animateTransition(transitionContext: UIViewControllerContextTransitioning) 如果轉場是交互式但不是百分比驅動式交互轉場時,此方法只能是非公開的。?

  【可選方法】

  3.3 【方法】interruptibleAnimatorForTransition(transitionContext: UIViewControllerContextTransitioning) 由實現了本協議的對象創建的轉場如果是可被中斷的,那么可實現此方法。例如,可返回一個UIViewPropertyAnimator的實例。此方法被期望返回與轉場相同的實例對象。?

  3.4 【方法】ainmationEnded(transitionCompleted: Bool) 當轉場結束時,系統會回調此方法。可將此方法當做是轉場結束的一個監聽方法,處理一些善后事宜。O(∩_∩)O

 

  4.【協議】UIViewControllerInteractiveTransitioning

  4.1 【方法】startInteractiveTransition(transitionContext: UIViewControllerContextTransitioning)

  【可選方法】

  4.2 【屬性】completionSpeed:CGFloat

  4.3 【屬性】completionCurve:UIViewAnimationCurve

  4.4 【屬性】wantsInteractiveStart 在10.0中,如果一個實現了UIViewControllerAnimatedTransitioning協議的對象被知道是可中斷的,可能的去啟動它,就好像它是不可交互的,然后中斷轉場並開始與其交互。這種情況下,實現此方法並返回NO/false。如果未實現則返回默認YES/true。

 

  5.【協議】UIViewControllerTransitioningDelegate

  【可選方法】

  5.1 【方法】animationControllerForPresentedController(presented: UIViewController, presenting: UIViewController, source: UIViewControlelr)

  5.2 【方法】animationControllerForDismissedController(dismissed: UIViewController)

  5.3 【方法】interactionControllerForPresentation(animator: UIViewControllerAnimatedTransitioning)

  5.4 【方法】interactionControlelrForDismissal(animator: UIViewControllerAnimatedTransitioning)

  5.5 【方法】presentationControllerForPresentedViewController(presented: UIViewController, presenting: UIViewController, source: UIViewController)

 

  6.【類】UIPercentDrivenInteractiveTransition 百分比驅動交互式轉場過渡類

  6.1 【屬性】duration: CGFloat 非交互時間,此時間在轉場開始時,執行器的transitionDuration:方法被調用時返回。

  6.2 【屬性】percentComplete: CGFloat 最后的值由updateInteractiveTransition:指定

  6.3 【屬性】completionSpeed: CGFloat 默認為1,與轉場過渡完成時間((1 - percentComplete) * duration)相對應。必須大於0.0。實際完成的時間與completionSpeed成反比。在cancelInteractiveTransition或finishInteractiveTransition調用之前都可以設置該值,以加速或者減慢整個轉場的非交互部分。

  6.4 【屬性】completionCurve: UIViewAnimationCurve 當交互部分的轉場完畢時,此屬性可以被設置來標識一個不同的動畫曲線。默認是UIViewAnimationCurveEaseInOut。注意,在交互期間的動畫時間曲線是Linear直線型。

  6.5 【屬性】timingCurve: UITimingCurveProvider 對於可中斷的動畫執行器,在轉場被中斷后繼續進行時可指定一個不同的時間曲線提供者。如果動畫執行器不可中斷,則此屬性被忽略。

  6.6 【屬性】wantsInteractiveStart: Bool 上面有解釋。

  6.7 【方法】pauseInteractiveTransition 此方法可暫停一個正在進行中可被中斷的動畫執行器。這可以確保當轉場進入或者退出交互模式時,所有由notifyWhenInteractionChangesUsingBlock:方法設置的blocks被執行。

  6.8 【方法】updateInteractiveTransition(percentComplete: CGFloat)、cancelInteractiveTransition、finishInteractiveTransition。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM