美文网首页
浅谈转场动画(一)

浅谈转场动画(一)

作者: iOS_陈楠 | 来源:发表于2016-10-23 19:11 被阅读22次

    因工作需要,用到了转场动画,在这里呢,就简单的介绍一下转场动画的用法。今天主要讲实用性,如果各位客观照着小弟说的做,肯定能让你看到效果。

    [传送门,demo中代码与本文代码可能有所不同,希望看官有自我学习能力啊。][id]
    [id]: https://github.com/cnvegetablebird/simpleTransformation

    demo.gif

    转场动画分为:push/pop , modal/dismiss
    交互式, 非交互式
    这里呢,因为用到了 非交互式 push/pop,所有就先说说这个,剩下的,我会在之后的文章中讲解。
    可能我们一提到转场动画呢,就感觉好高深的样子,其实本屌丝在一开始的时候也这么认为,查阅各种资料之后,当自己写的时候才发现,切~~ 什么鬼,简单的要死,不就是实现几个协议的事吗? 所以说,转场拼的不是你的技术,关键在于你的创意指数,亲们赶紧撸起吧。。。。

    转场动画三步走:(最简单的例子)

    第一步:

    继承协议: UINavigationControllerDelegate,并实现协议中的关键方法

    // self.homePageTransitions自定义的类,实现了UINavigationControllerDelegate协议
    1. self.navigationController?.delegate = self.homePageTransitions
    
    // 自定义的类,实现UINavigationControllerDelegate代理
    class HomePageTransitions: NSObject, UINavigationControllerDelegate {
    
    let pushAnimator: HomePagePushAnimator
    // 必须实现的方法
    func navigationController(navigationController: UINavigationController, animationControllerForOperation operation: UINavigationControllerOperation, fromViewController fromVC: UIViewController, toViewController toVC: UIViewController) -> UIViewControllerAnimatedTransitioning? {
        
        // operation: Push Pop 我相信大家一看就懂吧
        if operation == .Push { 
            // fromVC: 来源ViewController  toVC: 目标ViewController 这里可以对VC做判断,使它只支持特殊的样式
            if fromVC.isKindOfClass(HomeListViewController) && toVC.isKindOfClass(DetailViewController) {
                return pushAnimator  // 真正执行动画的类(见第二步)
            }
        }else if operation == .Pop {
            return nil    // 如果返回空,则不执行转场动画
        }
        return nil
    }
    }
    

    第二步:

    继承动画协议:UIViewControllerAnimatedTransitioning,并实现协议中的关键方法。

    class HomePagePushAnimator: NSObject, UIViewControllerAnimatedTransitioning {
    
    var fromImageView: UIImageView
    var toImageView: UIImageView
    var animationImageView: UIImageView!
    var containerView: UIView!
    var maskView: UIView!
    
    // 转场动画执行时间
    func transitionDuration(transitionContext: UIViewControllerContextTransitioning?) -> NSTimeInterval {
        return 1.0
    }
    // 所有的动画效果,都要在这个方法里边实现
    func animateTransition(transitionContext: UIViewControllerContextTransitioning) {
    
        // 通过key获取VC
        let toVC = transitionContext.viewControllerForKey(UITransitionContextToViewControllerKey)!
        let toView = toVC.view
        // 动画上下文view
        let containerView = transitionContext.containerView()
        self.containerView = containerView
        // 遮盖层,添加到上下文中
        self.maskView = UIView()
        self.maskView.backgroundColor = UIColor.blackColor()
        self.maskView.frame = containerView.bounds
        containerView.addSubview(self.maskView)
        
        // 坐标转换
        let fromRect: CGRect = fromImageView.convertRect(fromImageView.frame, toView: containerView)
        var toRect: CGRect = toImageView.frame//toImageView.convertRect(toImageView.frame, toView: containerView)
        
        // 实际上做动画的UIImageView
        self.animationImageView = UIImageView(frame: fromRect)
        self.animationImageView.image = fromImageView.image
        containerView.addSubview(self.animationImageView)
        
        // 动画效果
        let duration: NSTimeInterval = self.transitionDuration(transitionContext)
        UIView.animateWithDuration(duration * 0.5, animations: {
            self.animationImageView.frame = toRect
            }, completion: { (finished) in
                containerView.addSubview(toView)
                // 必须实现,如果不实现,你可以试试看,效果,很好玩的。。。。
                transitionContext.completeTransition(true)
        })
    }
    
    func animationEnded(transitionCompleted: Bool) {
        print("动画完成之后,执行的方法")
    }
    }
    

    第三步:

    打完收工,各位赶紧去浪吧。

    ps: 代码中,返回转场动画,估计没写,有兴趣可以自己下载下来玩玩。

    相关文章

      网友评论

          本文标题:浅谈转场动画(一)

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