用swift写一个简单的自定义modal转场动画

import UIKit

//点击此页面的按钮 然后modal出一个新页面

class HomeTableViewController: BasicViewController {


    override func viewDidLoad() {

        super.viewDidLoad()

    }


    @IBOutlet weak var button: UIButton!

    //定义一个bool类型来记录是present还是dimiss

    var isPresented = false

    //必须重写下面这个方法

    override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) { 


        if segue.identifier == "123" {

        

            let vc = segue.destinationViewController as! PopViewController

            //设置转场代理

            vc.transitioningDelegate = self

            //设置桩长类型为自定义

            vc.modalPresentationStyle = UIModalPresentationStyle.Custom

        }

    }

}


//试图控制器转场代理                                                         和动画属性相关

extension HomeTableViewController: UIViewControllerTransitioningDelegate, UIViewControllerAnimatedTransitioning {

    

    //返回控制modal管理的控制器

    func presentationControllerForPresentedViewController(presented: UIViewController, presentingViewController presenting: UIViewController!, sourceViewController source: UIViewController) -> UIPresentationController? {

        

        return PopViewPresentationController(presentedViewController: presented, presentingViewController: presenting)

    }


    //返回modal展现的动画对象

    func animationControllerForPresentedController(presented: UIViewController, presentingController presenting: UIViewController, sourceController source: UIViewController) -> UIViewControllerAnimatedTransitioning? {

        //这个方法返回的对象是进行modal转场控制的 所以状态要设置为true

        isPresented = true

        return self

    }

    

    //返回退出的动画对象

    func animationControllerForDismissedController(dismissed: UIViewController) -> UIViewControllerAnimatedTransitioning? {

        

        isPresented = false

        return self

    }

    

    //返回专场动画时间

    func transitionDuration(transitionContext: UIViewControllerContextTransitioning) -> NSTimeInterval {

        

        return 0.5

    }

    

    //主动提供转场的动画,一旦实现了这个方法,原有的专场动画会失效  transitionContext 转场上下文 提供专场动画的相关消息

    func animateTransition(transitionContext: UIViewControllerContextTransitioning) {


        if isPresented {

            //得到toView

            let toView = transitionContext.viewForKey(UITransitionContextToViewKey)

            //toview添加到容器视图

            transitionContext.containerView().addSubview(toView!)

            

            //动画方法

            //设置动画的形变

            toView?.transform = CGAffineTransformMakeScale(1, 0)

            //设置锚点

            toView?.layer.anchorPoint = CGPointMake(0.5, 0)

            //设置动画

            UIView.animateWithDuration(1, delay: 0, usingSpringWithDamping: 0.3, initialSpringVelocity: 10, options: nil, animations: { () -> Void in

                toView?.transform = CGAffineTransformMakeScale(1, 1)

                

                }){ (_) in

                    //动画完成一定要执行的函数,告诉系统动画结束了

                    transitionContext.completeTransition(true)

            }

        } else {

            let fromView = transitionContext.viewForKey(UITransitionContextFromViewKey)


            fromView?.removeFromSuperview()


            transitionContext.completeTransition(true)

        }

    }

    

}





import UIKit

//撞门负责modal的控制器

class PopViewPresentationController: UIPresentationController {

    

    //需要重写这个方法

    override init(presentedViewController: UIViewController!, presentingViewController: UIViewController!) {

  

        super.init(presentedViewController: presentedViewController, presentingViewController: presentingViewController)

    }

   

    //对要对modal出来的view进行布局

    override func containerViewDidLayoutSubviews() {

        super.containerViewDidLayoutSubviews()

        

        //设置遮罩试图的大小

        dummyView.frame = self.containerView.frame

        containerView.insertSubview(dummyView, atIndex: 0)

        

        presentedView().frame = CGRectMake(100, 56, 200, 240)

    }

    

    //添加遮罩试图

    lazy var dummyView: UIView = {

        

        let v = UIView()

        v.backgroundColor = UIColor(white: 0, alpha: 0.3)


        //添加手势识别 

        let tap = UITapGestureRecognizer(target: self, action: "clickDummyView")

        v.addGestureRecognizer(tap)


        return v

    }()


    //点击退出modal

    func clickDummyView() {

        

        self.presentedViewController.dismissViewControllerAnimated(true, completion: nil)

    }

}


import UIKit

//要呗modal出来的控制器

class ViewController: UIViewController {


    override func viewDidLoad() {

        super.viewDidLoad()

    }


    override func didReceiveMemoryWarning() {

        super.didReceiveMemoryWarning()

        

    }

}




  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值