zoukankan      html  css  js  c++  java
  • 【Swift学习笔记-《PRODUCT》读书记录-实现自定义转场动画】

    iOS默认的push动画是把即将展示的控制器从右边推过来。有时我们想实现类似PPT中的一些动画,这时候就需要自定义转场动画了。如下图我们想实现一个淡出并且放大的过场动画,在退出时是一个淡出缩小的动画。

    首先需要自定义一个类DiaryAnimator.swift遵守 UIViewControllerAnimatedTransitioning 协议,然后实现它,代码如下:

    import UIKit
    
    class DiaryAnimator: NSObject, UIViewControllerAnimatedTransitioning {
        // 用于接受外界的operation
        var operation:UINavigationControllerOperation!
        
        // 返回动画时间
        func transitionDuration(using transitionContext: UIViewControllerContextTransitioning?) -> TimeInterval {
            return 0.4
        }
        
        // 要设置的动画
        //UIKit calls this method when presenting or dismissing a view controller. Use this method to configure the animations associated with your custom transition. You can use view-based animations or Core Animation to configure your animations.
        
    
        func animateTransition(using transitionContext: UIViewControllerContextTransitioning) {
            
            let containerview = transitionContext.containerView
            
            let fromVC = transitionContext.viewController(forKey: UITransitionContextViewControllerKey.from)
            let fromView = fromVC!.view
            
            let toVC = transitionContext.viewController(forKey: UITransitionContextViewControllerKey.to)
            let toView = toVC?.view
            
            // 设置新场景透明度
            toView?.alpha = 0.0
            
            // 设置初始值
            if operation == UINavigationControllerOperation.pop {
                fromView?.transform = CGAffineTransform(scaleX: 1.0, y: 1.0)
            }else{
                toView?.transform = CGAffineTransform(scaleX: 0.3, y: 0.3)
            }
            
            containerview.insertSubview(toView!, aboveSubview: fromView!)
            
            UIView.animate(withDuration: transitionDuration(using: transitionContext), delay: 0, options: UIViewAnimationOptions.curveEaseInOut, animations: {
                if self.operation ==  UINavigationControllerOperation.pop {
                    // 放大要转出的场景
                    fromView?.transform = CGAffineTransform(scaleX: 3.3,y: 3.3)
                } else {
                    // 设置新场景为原始大小
                    toView?.transform = CGAffineTransform(scaleX: 1.0,y: 1.0)
                }
                
                toView?.alpha = 1.0
            },completion: { finished in
                transitionContext.completeTransition(true)
            })
        }
        
    }
    

     自定义好动画后,在要使用的控制器中实现 UINavigationControllerDelegate 协议的 optional func navigationController(_ navigationController: UINavigationController, animationControllerFor operation: UINavigationControllerOperation, from fromVC: UIViewController, to toVC: UIViewController) -> UIViewControllerAnimatedTransitioning? 方法,返回自定义的动画即可

    extension HomeYearController : UINavigationControllerDelegate
    {
        func navigationController(_ navigationController: UINavigationController, animationControllerFor operation: UINavigationControllerOperation, from fromVC: UIViewController, to toVC: UIViewController) -> UIViewControllerAnimatedTransitioning? {
            let animate = DiaryAnimator()
            animate.operation = operation
           return animate
        }
    }
    



  • 相关阅读:
    JQuery操作DOM
    JQuery事件和动画
    Jquery选择器
    初学JQuery
    JavaScript对象及面向对象
    JavaScript操作DOM
    JavaScript操作BOM
    JavaScript基础
    网络流之最大流Dinic算法模版
    杭电1532----Drainage Ditches『最大流』
  • 原文地址:https://www.cnblogs.com/heyode/p/6513581.html
Copyright © 2011-2022 走看看