SWIFT3.0自定义转场动画
//1.创建弹出的控制器
let popooverVc = PopoverViewController() //2.设置控制器的modal样式 popooverVc.modalPresentationStyle = .custom //3.设置转场的代理 popooverVc.transitioningDelegate = popoverAnimator popoverAnimator.presentedFrame = CGRect(x: 100, y: 55, width: 180, height: 250) //4.弹出控制器 present(popooverVc, animated: true, completion: nil)
2.设置弹出视图尺寸相关
class ADPresentationController: UIPresentationController { //对外提供属性用以设置弹出控制视图的尺寸 var presentedFrame : CGRect = CGRect.zero //蒙板view fileprivate lazy var coverView : UIView = UIView() //MARK: - 系统回调函数 override func containerViewWillLayoutSubviews() { super.containerViewDidLayoutSubviews() //设置弹出View的尺寸 presentedView?.frame = presentedFrame //添加蒙板 setupCoverView() } } //MARK: - 设置UI界面相关 extension ADPresentationController { fileprivate func setupCoverView() { //添加蒙板 containerView?.insertSubview(coverView, at: 0) coverView.backgroundColor = UIColor(white: 0.2, alpha: 0.5) coverView.frame = containerView!.bounds //添加手势 let tabGes = UITapGestureRecognizer(target: self, action: #selector(ADPresentationController.tapgestureAction)) coverView.addGestureRecognizer(tabGes) } } //MARK: - 监控事件 extension ADPresentationController { @objc fileprivate func tapgestureAction() { presentedViewController.dismiss(animated: true, completion: nil) } }
3.设置动画相关
import UIKit class PopoverAnimator: NSObject { // MARK:- 对外提供的属性 var isPresented : Bool = false var presentedFrame : CGRect = CGRect.zero var callBack : ((_ presented : Bool) -> ())? // MARK:- 自定义构造函数 // 注意:如果自定义了一个构造函数,但是没有对默认构造函数init()进行重写,那么自定义的构造函数会覆盖默认的init()构造函数 init(callBack : @escaping (_ presented : Bool) -> ()) { self.callBack = callBack } override init() { } } //MARK: - 自定义转场代理方法 extension PopoverAnimator : UIViewControllerTransitioningDelegate { // 目的:改变弹出View的尺寸 func presentationController(forPresented presented: UIViewController, presenting: UIViewController?, source: UIViewController) -> UIPresentationController? { let presentation = ADPresentationController(presentedViewController: presented, presenting: presenting) presentation.presentedFrame = presentedFrame return presentation } //目的:自定义弹出动画 func animationController(forPresented presented: UIViewController, presenting: UIViewController, source: UIViewController) -> UIViewControllerAnimatedTransitioning? { isPresented = true callBack!(isPresented) return self } //目的:自定义消失出动画 func animationController(forDismissed dismissed: UIViewController) -> UIViewControllerAnimatedTransitioning? { isPresented = false callBack!(isPresented) return self } } //MARK: - 弹出和消失的动画方法 extension PopoverAnimator : UIViewControllerAnimatedTransitioning { //设置动画执行的时间 func transitionDuration(using transitionContext: UIViewControllerContextTransitioning?) -> TimeInterval { return 0.5 } //获取转场动画的上下文 func animateTransition(using transitionContext: UIViewControllerContextTransitioning) { isPresented ? animationForPresentedView(transitionContext) : animationForDismissedView(transitionContext) } ///自定义弹出动画 fileprivate func animationForPresentedView(_ transitionContext: UIViewControllerContextTransitioning) { //获取弹出的View let presentedView = transitionContext.view(forKey: UITransitionContextViewKey.to)! //将弹出的View加到containerView中 transitionContext.containerView.addSubview(presentedView) //执行动画 presentedView.transform = CGAffineTransform(scaleX: 0.0, y: 0.0) presentedView.layer.anchorPoint = CGPoint(x: 0.5, y: 0) UIView.animate(withDuration: transitionDuration(using: transitionContext), animations: { () -> Void in presentedView.transform = CGAffineTransform.identity }, completion: { (_) -> Void in //必须告诉转场上下文你已经完成动画 transitionContext.completeTransition(true) }) } //消失动画 fileprivate func animationForDismissedView(_ transitionContex: UIViewControllerContextTransitioning) { //获取消失的View let dismissView = transitionContex.view(forKey: UITransitionContextViewKey.from) //执行动画 UIView.animate(withDuration: transitionDuration(using: transitionContex), animations: { () -> Void in dismissView?.transform = CGAffineTransform(scaleX: 0.0001, y: 0.0001) }, completion: { (_) -> Void in dismissView?.removeFromSuperview() //必须告诉转场上下文你已经完成动画 transitionContex.completeTransition(true) }) } }
来源:https://www.cnblogs.com/adwardWang/p/6407777.html