iOS swift present viewController 转场 渐隐渐现 动画

81 阅读1分钟

问题: ios presentViewcontroller 时 ,默认的动画 是 从下向上 推出的, 但是 很多 弹框 需要是渐隐渐现 弹出的。那怎么实现渐隐渐现的弹框呢?

方法1 通过系统定制好的动画效果

self.modalPresentationStyle = .custom

 //crossDissolve 交叉化;交叉溶解;淡入淡出,弹窗提示信息

  self.modalTransitionStyle = .crossDissolve

方法2 自定义动画效果

  1. 设置AlertViewController 的弹出效果
/// 绑定手机号 提示弹框

class LZAlertViewController: UIViewController {


     override init(nibName nibNameOrNil: String?, bundle nibBundleOrNil: Bundle?) {

        super.init(nibName: nibNameOrNil, bundle: nibBundleOrNil)

         self.modalPresentationStyle = .custom

         self.transitioningDelegate = self

    }
  }

2.设置代理动画

extension LZAlertViewController: UIViewControllerTransitioningDelegate {

    //present 渐隐渐现

    func animationController(forPresented presented: UIViewController, presenting: UIViewController, source: UIViewController) -> (any UIViewControllerAnimatedTransitioning)? {

        return LZFadeControllerAnimation(.present)

    }

    //present 渐隐渐现

    func animationController(forDismissed dismissed: UIViewController) -> (any UIViewControllerAnimatedTransitioning)? {

        return LZFadeControllerAnimation(.dismiss)

    }


}

3.实现动画效果

import UIKit

  


/**

 present 渐隐渐现

 用法:UIViewControllerTransitioningDelegate 实现

      animationController(forPresented

      animationController(forDismissed

*/

class LZFadeControllerAnimation: NSObject, UIViewControllerAnimatedTransitioning {

    enum LZFadeControllerTransitionType: Int {

        case present = 0

        case dismiss

    }

  


    var transiontionType: LZFadeControllerTransitionType? = .present

    

    init(_ transitType: LZFadeControllerTransitionType) {

        super.init()

        self.transiontionType = transitType

    }

  


    func transitionDuration(using transitionContext: UIViewControllerContextTransitioning?) -> TimeInterval {

        return 0.3

    }

  


    func animateTransition(using transitionContext: UIViewControllerContextTransitioning) {

        let containerView = transitionContext.containerView

  


        guard let fromVC = transitionContext.viewController(forKey: UITransitionContextViewControllerKey.from), let toVC = transitionContext.viewController(forKey: UITransitionContextViewControllerKey.to) else {

            return

        }

        let fromView = fromVC.view

        let toView = toVC.view

        let duration = self.transitionDuration(using: transitionContext)

        guard let transiontionType  else {

            return

        }

        if transiontionType == .present {//toVC.isBeingPresented

            containerView.addSubview(toView!)

            toView?.alpha = 0

            UIView.animate(withDuration: duration, delay: 0, options: .curveEaseInOut, animations: {

                toView?.alpha = 1

            }, completion: { _ in

                transitionContext.completeTransition(!transitionContext.transitionWasCancelled)

            })

        }

  


        // Dismissal 转场中不要将 toView 添加到 containerView

        if transiontionType == .dismiss {//fromVC.isBeingDismissed

            let fromViewHeight = fromView?.frame.height

            UIView.animate(withDuration: duration, animations: {

                fromView?.alpha = 0

            }, completion: { _ in

                transitionContext.completeTransition(!transitionContext.transitionWasCancelled)

            })

        }

    }

}