美文网首页
自定义ViewController出场入场动画

自定义ViewController出场入场动画

作者: 霸霸_7d52 | 来源:发表于2018-05-02 10:50 被阅读0次

最近需要自定义一个viewcontroller 的出场和入场动画,发现官方没有提供多种动画供选择,只能自定义,遂记录如下:

1. 实现UINavigationControllerDelegate代理

extension ViewController: UINavigationControllerDelegate {

    func navigationController(_ navigationController: UINavigationController, animationControllerFor operation: UINavigationControllerOperation, from fromVC: UIViewController, to toVC: UIViewController) -> UIViewControllerAnimatedTransitioning? {

        ifoperation == .push{

            returnPushAnimaton()

        }elseifoperation == .pop{

            returnPopAnimation()

        }

        returnnil

    }

    class PushAnimaton: NSObject, UIViewControllerAnimatedTransitioning {

        funcanimateTransition(using transitionContext:UIViewControllerContextTransitioning) {

            transitionContext.containerView.backgroundColor = UIColor.white // 修改过渡时的背景颜色

            lettoViewController = transitionContext.viewController(forKey:UITransitionContextViewControllerKey.to)

            letfromViewController = transitionContext.viewController(forKey:UITransitionContextViewControllerKey.from)

            transitionContext.containerView.insertSubview((toViewController?.view)!, aboveSubview: (fromViewController?.view)!)

            letheight =UIScreen.main.bounds.height

            toViewController?.view.transform=CGAffineTransform(translationX:0, y: height)

            UIView.animate(withDuration:self.transitionDuration(using: transitionContext), animations: {

                toViewController?.view.transform=CGAffineTransform.identity

                fromViewController?.view.transform=CGAffineTransform(translationX:0, y: -height)

            }) { (completion)in

                fromViewController?.view.transform=CGAffineTransform.identity

                transitionContext.completeTransition(!transitionContext.transitionWasCancelled)

            }

        }

        functransitionDuration(using transitionContext:UIViewControllerContextTransitioning?) ->TimeInterval{

            return0.3

        }

    }

    class PopAnimation: NSObject, UIViewControllerAnimatedTransitioning {

        funcanimateTransition(using transitionContext:UIViewControllerContextTransitioning) {

            transitionContext.containerView.backgroundColor = UIColor.white // 修改过渡时的背景颜色

            lettoViewController = transitionContext.viewController(forKey:UITransitionContextViewControllerKey.to)

            letfromViewController = transitionContext.viewController(forKey:UITransitionContextViewControllerKey.from)

            transitionContext.containerView.insertSubview((toViewController?.view)!, aboveSubview: (fromViewController?.view)!)

            letheight =UIScreen.main.bounds.height

            toViewController?.view.transform=CGAffineTransform(translationX:0, y: -height)

            UIView.animate(withDuration:self.transitionDuration(using: transitionContext), animations: {

                toViewController?.view.transform=CGAffineTransform.identity

                fromViewController?.view.transform=CGAffineTransform(translationX:0, y: height)

            }) { (completion)in

                fromViewController?.view.transform=CGAffineTransform.identity

                transitionContext.completeTransition(!transitionContext.transitionWasCancelled)

            }

        }

        functransitionDuration(using transitionContext:UIViewControllerContextTransitioning?) ->TimeInterval{

            return0.3

        }

    }

}

2.在viewContorller中设置navigationController的代理

class ViewController: UIViewController {

overridefuncviewDidLoad() {

        super.viewDidLoad()

        self.navigationController?.delegate = self

    }

}

大功告成

相关文章

网友评论

      本文标题:自定义ViewController出场入场动画

      本文链接:https://www.haomeiwen.com/subject/vnbqrftx.html