概述
约定:
底层控制器:在层级较低的控制器,由它创建新控制器
转场控制器:就是底层控制器创建的新控制器
转场控制器被创建出来,若要自定义转场的动画,比如从中心逐渐放大知道占据满屏,这样系统没有提供的动画,就需要底层控制器来创建新的转场动画。
首先需要底层控制器创建新控制器的时候,给新控制器约定管理转场与动画的代理。如:
accountVC.transitioningDelegate = self
当然这里也可以不使用当前控制器作为转场动画的代理,而是重新创建一个对象作为转场动画的代理。这个部分放在文末解释。
然后底层控制器需要实现相关的协议,即实现控制器转场协议:
UIViewControllerTransitioningDelegate
指定管理转场动画的对象,这里制定管理动画的对象为底层控制器。
如:
extension BasicController:UIViewControllerTransitioningDelegate{
//返回控制自定义转场动画 的 控制器
func animationController(forPresented presented: UIViewController, presenting: UIViewController, source: UIViewController) -> UIViewControllerAnimatedTransitioning? {
return self
}
}
然后便是底层控制器实现相关的协议:
extension BasicController : UIViewControllerAnimatedTransitioning{
func transitionDuration(using transitionContext: UIViewControllerContextTransitioning?) -> TimeInterval {
return 0.5
}
func animateTransition(using transitionContext: UIViewControllerContextTransitioning) {
}
}
transitionContext是转场动画的上下文,和绘图上下文一个意思。
由于自定义动画转场了,所以原本系统会做的动作,现在都需要在方法里面自己实现。
extension BasicController : UIViewControllerAnimatedTransitioning{
func transitionDuration(using transitionContext: UIViewControllerContextTransitioning?) -> TimeInterval {
return 0.5
}
func animateTransition(using transitionContext: UIViewControllerContextTransitioning) {
//获取弹出的View .from 消失的View .to 弹出的View
let presentView = (transitionContext.view(forKey: .to))!
//将弹出的View添加到ContainerView中
transitionContext.containerView.addSubview(presentView)
presentView.transform = CGAffineTransform.init(translationX:

本文介绍了如何在iOS应用中自定义转场控制器上的动画,包括使用UIPresentationController创建退出动画,封装转场动画工具类,以及在转场前后进行个性化设置的方法。通过设置UIViewControllerTransitioningDelegate协议,实现转场动画的完整流程,并探讨了使用闭包进行控制器间通信的可能性。
最低0.47元/天 解锁文章

被折叠的 条评论
为什么被折叠?



