解读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。

原文地址:https://www.cnblogs.com/emmet7life/p/6375395.html