博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
swift 动画
阅读量:6292 次
发布时间:2019-06-22

本文共 4040 字,大约阅读时间需要 13 分钟。

 

// MARK:- 事件监听的函数

extension HomeViewController {

    @objc private func titleBtnClick(titleBtn : TitleButton) {

        // 1.改变按钮的状态

        titleBtn.selected = !titleBtn.selected

        

        // 2.创建弹出的控制器

        let popoverVc = PopoverViewController()

        

        // 3.设置控制器的modal样式

        popoverVc.modalPresentationStyle = .Custom

        

        // 4.设置转场的代理

        popoverVc.transitioningDelegate = self

        

        // 弹出控制器

        presentViewController(popoverVc, animated: true, completion: nil)

    }

}

 

 

// MARK:- 自定义转场代理的方法

extension HomeViewController : UIViewControllerTransitioningDelegate {

    // 目的:改变弹出View的尺寸

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

        return LZJPresentationController(presentedViewController: presented, presentingViewController: presenting)

    }

    

    // 目的:自定义弹出的动画

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

        isPresented = true

        return self

    }

    

    // 目的:自定义消失的动画

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

        isPresented = false

        return self

    }

}

 

 

// MARK:- 弹出和消失动画代理的方法

extension HomeViewController : UIViewControllerAnimatedTransitioning {

    /// 动画执行的时间

    func transitionDuration(transitionContext: UIViewControllerContextTransitioning?) -> NSTimeInterval {

        return 0.5

    }

    

    /// 获取`转场的上下文`:可以通过转场上下文获取弹出的View和消失的View

    // UITransitionContextFromViewKey : 获取消失的View

    // UITransitionContextToViewKey : 获取弹出的View

    func animateTransition(transitionContext: UIViewControllerContextTransitioning) {

        isPresented ? animationForPresentedView(transitionContext) : animationForDismissedView(transitionContext)

    }

    

    /// 自定义弹出动画

    private func animationForPresentedView(transitionContext: UIViewControllerContextTransitioning) {

        // 1.获取弹出的View

        let presentedView = transitionContext.viewForKey(UITransitionContextToViewKey)!

        

        // 2.将弹出的View添加到containerView

        transitionContext.containerView()?.addSubview(presentedView)

        

        // 3.执行动画

        presentedView.transform = CGAffineTransformMakeScale(1.0, 0.0)

        presentedView.layer.anchorPoint = CGPointMake(0.5, 0)

        UIView.animateWithDuration(transitionDuration(transitionContext), animations: { () -> Void in

            presentedView.transform = CGAffineTransformIdentity

            }) { (_) -> Void in

                // 必须告诉转场上下文你已经完成动画

                transitionContext.completeTransition(true)

        }

    }

    

    /// 自定义消失动画

    private func animationForDismissedView(transitionContext: UIViewControllerContextTransitioning) {

        // 1.获取消失的View

        let dismissView = transitionContext.viewForKey(UITransitionContextFromViewKey)

        

        // 2.执行动画

        UIView.animateWithDuration(transitionDuration(transitionContext), animations: { () -> Void in

            dismissView?.transform = CGAffineTransformMakeScale(1.0, 0.00001)

            }) { (_) -> Void in

                dismissView?.removeFromSuperview()

                // 必须告诉转场上下文你已经完成动画

                transitionContext.completeTransition(true)

        }

    }

}

-------------------------------------------------------------------------------------

 

 

import UIKit

 

class LZJPresentationController: UIPresentationController {

    // MARK:- 懒加载属性

    private lazy var coverView : UIView = UIView()

    

    // MARK:- 系统回调函数

    override func containerViewWillLayoutSubviews() {

        super.containerViewWillLayoutSubviews()

        

        // 1.设置弹出View的尺寸

        presentedView()?.frame = CGRect(x: 100, y: 55, width: 180, height: 250)

        

        // 2.添加蒙版

        setupCoverView()

    }

}

 

// MARK:- 设置UI界面相关

extension LZJPresentationController {

    private func setupCoverView() {

        // 1.添加蒙版

        containerView?.insertSubview(coverView, atIndex: 0)

        

        // 2.设置蒙版的属性

        coverView.backgroundColor = UIColor(white: 0.8, alpha: 0.2)

        coverView.frame = containerView!.bounds

        

        // 3.添加手势

        let tapGes = UITapGestureRecognizer(target: self, action: "coverViewClick")

        coverView.addGestureRecognizer(tapGes)

    }

}

 

// MARK:- 事件监听

extension LZJPresentationController {

    @objc private func coverViewClick() {

        presentedViewController.dismissViewControllerAnimated(true, completion: nil)

    }

}

 

 

转载于:https://www.cnblogs.com/liuzhenjie/p/5409345.html

你可能感兴趣的文章
ArcGIS Engine 符号自动化配置工具实现
查看>>
小程序 · 跳转带参数写法,兼容url的出错
查看>>
flutter error
查看>>
Flask框架从入门到精通之模型数据库配置(十一)
查看>>
10年重新出发
查看>>
2019年-年终总结
查看>>
聊聊elasticsearch的RoutingService
查看>>
让人抓头的Java并发(一) 轻松认识多线程
查看>>
从源码剖析useState的执行过程
查看>>
地包天如何矫正?
查看>>
中间件
查看>>
Android SharedPreferences
查看>>
css面试题
查看>>
Vue组建通信
查看>>
用CSS画一个带阴影的三角形
查看>>
前端Vue:函数式组件
查看>>
程鑫峰:1.26特朗.普力挺美元力挽狂澜,伦敦金行情分析
查看>>
safari下video标签无法播放视频的问题
查看>>
01 iOS中UISearchBar 如何更改背景颜色,如何去掉两条黑线
查看>>
对象的继承及对象相关内容探究
查看>>