欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

iOS - 控制器自定义动画跳转 [模态跳转]

程序员文章站 2024-03-26 11:38:05
...

参考资料:

Apple 开发文档 Customizing the Transition Animations

WWDC 2013 Custom Transitions Using View Controllers


图例:

跳转的动画有很多,全部可以自定义

iOS - 控制器自定义动画跳转 [模态跳转]


创建自定义跳转必须遵循的三个步骤:

  • 1、创建一个类,并实现了 UIViewControllerAnimatedTransitioning 协议
  • 2、创建一个类作为 UIViewControllerTransitioningDelegate 过渡代理
  • 3、在模态跳转前修改控制器的 transitioningDelegate 代理为自定义的代理(步骤2的代理类)

核心代码示例

一、创建一个类,并实现了 UIViewControllerAnimatedTransitioning 协议

这个协议主要控制控制器视图的显示的,通过 transitionContext 可以获取到每个视图和控制器,并进行动画的设置

class AnimatedTransitioning: NSObject {
    var isPresenting: Bool = false
}

extension AnimatedTransitioning: UIViewControllerAnimatedTransitioning {

    func transitionDuration(using transitionContext: UIViewControllerContextTransitioning?) -> TimeInterval {
        return 0.5
    }

    func animateTransition(using transitionContext: UIViewControllerContextTransitioning) {

        let fromView = transitionContext.view(forKey: .from)!
        let toView = transitionContext.view(forKey: .to)!
        let containerView = transitionContext.containerView

        if isPresenting {
            toView.transform = CGAffineTransform(scaleX: 0, y: 0)
            containerView.addSubview(toView)
        } else {
            containerView.insertSubview(toView, belowSubview: fromView)
        }

        UIView.animate(withDuration: 0.5, animations: {
            if self.isPresenting {
                toView.transform = CGAffineTransform.identity
            } else {
                fromView.transform = CGAffineTransform(scaleX: 0.001, y: 0.001)
            }
        }) { (finished) in
            transitionContext.completeTransition(finished)
        }
    }
}

二、创建一个类作为 UIViewControllerTransitioningDelegate 过渡代理

这里设置 presenteddismissed 时各自的动画转换类,可以设置为不同的类


class CustomTransitioningDelegate: NSObject, UIViewControllerTransitioningDelegate {

    func animationController(forPresented presented: UIViewController, presenting: UIViewController, source: UIViewController) -> UIViewControllerAnimatedTransitioning? {
        let at = AnimatedTransitioning()
        at.isPresenting = true
        return at
    }

    func animationController(forDismissed dismissed: UIViewController) -> UIViewControllerAnimatedTransitioning? {
        let at = AnimatedTransitioning()
        at.isPresenting = false
        return at
    }
}

三、在模态跳转前修改控制器的 transitioningDelegate 代理为自定义的代理

注意:代理不能为局部变量

class ViewController: UIViewController {

    // 必须保存为实例变量
    var ctDelegate = CustomTransitioningDelegate()

    override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
        let vc = TempViewController()
        vc.transitioningDelegate = ctDelegate
        self.present(vc, animated: true, completion: nil)
    }

}