zoukankan      html  css  js  c++  java
  • 【Swift】UIPresentationController的使用方法

    UIPresentationController是ios8.0的新特性哦,使用需要注意

    先上一个效果图

    第一步: 连线选择segue类型为,present Modally

    第二步:需要演示的控制器,自定义为HJCPopViewController

    第三步:新建一个类HJCPopoverPresentationController,继承UIPresentationController

    第四步:在HJCPopoverPresentationController类中实现以下代码

     // 遮罩视图
        lazy var dummyView: UIView = {
          
            let v = UIView()
            v.backgroundColor = UIColor(white: 0.0, alpha: 0.2)
            
            // 添加手势识别,可以隔离所有底层控件
            let tap = UITapGestureRecognizer(target: self, action: "clickDummyView")
            v.addGestureRecognizer(tap)
            
            return v
        }()
        
        func clickDummyView() {
            // 关闭被 Modal 的视图控制器
            self.presentedViewController.dismissViewControllerAnimated(true, completion: nil)
        }
        
        /**
            presentedViewController:    要 modal 显示的视图控制器
            presentingViewController:   文档说,底层的视图控制器,但是实测是nil
        
            containerView                   容器视图,构造函数中,是 nil,符合懒加载的原则
            presentedView()                 被展现的视图
            containerViewWillLayoutSubviews 将要布局子视图,自定义 presentedView 的大小和位置
        */
    override func containerViewWillLayoutSubviews() {
            super.containerViewWillLayoutSubviews()
            
    //        // 设置遮罩视图的大小
    //        dummyView.frame = containerView.bounds
    //        containerView.insertSubview(dummyView, atIndex: 0)
            
            // 设置目标视图的大小
            presentedView().frame = CGRectMake(100, 56, 200, 240)
        }

    第五步:在主控制器中设置目标 跳转控制器相关属性

      override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
            
          
                let popVC = segue.destinationViewController as! HJCPopoverPresentationController
                
                /**
                    要实现自定义Modal转场
                    1. 设置转场代理
                        返回 UIPresentationController,由 该控制器,负责 Modal 界面的处理
                    2. 指定Modal的展现方式是自定义
                */
                // transition 转场,从一个界面跳到另外一个界面
                popVC.transitioningDelegate = self
                // 设置展现方式
                popVC.modalPresentationStyle = UIModalPresentationStyle.Custom
            
        }

    第六步, 主控制器中加一个变量

    //    // 是否正在展现的标记
        var isPresentation = false

    第七步,实现主控制器中实现下面的代码

    /// 视图控制器转场代理
    extension HomeTableViewController: UIViewControllerTransitioningDelegate,UIViewControllerAnimatedTransitioning{
        
        /// 返回控制 Modal 管理的控制器
        func presentationControllerForPresentedViewController(presented: UIViewController, presentingViewController presenting: UIViewController!, sourceViewController source: UIViewController) -> UIPresentationController? {
            
            return HJCPopoverPresentationController(presentedViewController: presented, presentingViewController: presenting)
        }
        
        /// 返回提供 Modal 展现动画对象
        func animationControllerForPresentedController(presented: UIViewController, presentingController presenting: UIViewController, sourceController source: UIViewController) -> UIViewControllerAnimatedTransitioning? {
            
            // Modal
            isPresentation = true
            
            return self
        }
        
        /// 返回提供 Dismiss 动画的对象
        func animationControllerForDismissedController(dismissed: UIViewController) -> UIViewControllerAnimatedTransitioning? {
    
            // Dismiss
            isPresentation = false
            
            return self
        }
        
        // MARK: - UIViewControllerAnimatedTransitioning
        func transitionDuration(transitionContext: UIViewControllerContextTransitioning) -> NSTimeInterval {
            return 0.5
        }
        
        /**
            transitionContext   转场上下文,提供转场动画的相关信息
                从哪里来,到哪里去
        
            主动提供转场的动画,一旦实现了这个方法,原有的转场动画会失效->目标控制器看不到了
        */
        func animateTransition(transitionContext: UIViewControllerContextTransitioning) {
         
            // 将 toVC 的 view 添加到容器视图
            if isPresentation {
                let toView = transitionContext.viewForKey(UITransitionContextToViewKey)!
                
                // 将目标视图添加到容器视图
                transitionContext.containerView().addSubview(toView)
                
                // 动画方法
                // 设置动画初始的形变
                toView.transform = CGAffineTransformMakeScale(1.0, 0)
                // 设置图层的锚点
                toView.layer.anchorPoint = CGPointMake(0.5, 0)
                
                UIView.animateWithDuration(transitionDuration(transitionContext), delay: 0, usingSpringWithDamping: 0.8, initialSpringVelocity: 5.0, options: nil, animations: { () -> Void in
                    
                    toView.transform = CGAffineTransformMakeScale(1.0, 1.0)
                    
                }, completion: { (_) -> Void in
                    transitionContext.completeTransition(true)
                })
            } else {
                let fromView = transitionContext.viewForKey(UITransitionContextFromViewKey)!
                
                // 将 Modal 出来的视图 从容器视图中删除
                fromView.removeFromSuperview()
                
                // 动画完成
                // *** 一定必须要执行的函数,告诉系统转场动画结束了
                transitionContext.completeTransition(true)
            }
        }
  • 相关阅读:
    mysqllog
    清理:db上面的过期的binlog,释放磁盘空间。 (转)
    linux下shell命令trap
    mvc
    uci随笔
    luci 随笔
    shell脚本 整数比较
    lua学习
    OPENWRT make menuconfig错误之一
    openwrt 中make的使用
  • 原文地址:https://www.cnblogs.com/haojuncong/p/4504308.html
Copyright © 2011-2022 走看看