ios swift 转场动画 UIPresentationController(有demo)

328 阅读1分钟
  • 弹框淡入淡出的效果 如 自定义alert弹框

设置modalPresentationStyle,modalTransitionStyle

let detailController = LZCenterDetailViewController()

        detailController.modalPresentationStyle = .custom

        detailController.modalTransitionStyle = .crossDissolve

        self.present(detailController, animated: true)
  • 用 UIPresentationController 实现pop 转场动画 (有demo)

效果

  • 主要实现代码

//

//  MOPresentationController.swift

//  MOCustomTransitionAnimation

//

//  Created by LiZhi on 2023/11/26.

//  Copyright © 2023 LiZhi. All rights reserved.

//

  


import UIKit

  


class MOPresentationController: UIPresentationController {

    

    // presentVC 在动画容器上的 frame

    override var frameOfPresentedViewInContainerView: CGRect {

        get {

            print(self, #line, "frameOfPresentedViewInContainerView")

                        

            let containerBounds: CGRect = self.containerView?.bounds ?? .zero

            let width = CGFloat(floorf(Float(containerBounds.size.width) / 2.0))

            let height = containerBounds.size.height

            let originX = containerBounds.size.width - width

                               

            return CGRect(x: originX, y: 0.0, width: width, height: height)

        }

    }

    

    

    // MARK: - 将要开始 present,设置初始值 和 动画回调

    override func presentationTransitionWillBegin() {

        super.presentationTransitionWillBegin()

        print(self, #line, "presentationTransitionWillBegin")

        

        // 1. get animation container view (获取动画容器视图)

        guard let containerView = containerView else { return }

        

        // 2. set initial value for animation views and add to container view (设置动画视图的初始值, 并添加到都到容器上)

        self.moDimmingView.frame = containerView.bounds

        self.moDimmingView.alpha = 0.0

        containerView.insertSubview(self.moDimmingView, at: 0)

        

        // 3. execute animation (执行动画)

        // 这里尝试去拿一个时间点的回调,能拿到就在回调里执行显示动画;拿不到就直接设置显示

        guard let transitionCoordinator = self.presentedViewController.transitionCoordinator else {

            self.moDimmingView.alpha = 1.0

            return

        }

        transitionCoordinator.animateAlongsideTransition(in: self.presentedView) { context in

            self.moDimmingView.alpha = 1.0

        }

    }

    

    // MARK: - present 动画结束

    override func presentationTransitionDidEnd(_ completed: Bool) {

        super.presentationTransitionDidEnd(completed)

        print(self, #line, "presentationTransitionDidEnd")

        

        // remove dark background view when transition fail

        if !completed {

            self.moDimmingView.removeFromSuperview()

        }

    }

    

    

    // MARK: - 将要开始 dismiss,设置初始值 和 动画回调

    override func dismissalTransitionWillBegin() {

        super.dismissalTransitionWillBegin()

        print(self, #line, "dismissalTransitionWillBegin")

        

        guard let transitionCoordinator = self.presentedViewController.transitionCoordinator else {

            self.moDimmingView.alpha = 0.0

            return

        }

        transitionCoordinator.animateAlongsideTransition(in: self.presentedView) { context in

            self.moDimmingView.alpha = 0.0

        }

    }

  


    // MARK: - dismiss 动画结束

    override func dismissalTransitionDidEnd(_ completed: Bool) {

        super.dismissalTransitionDidEnd(completed)

        print(self, #line, "dismissalTransitionDidEnd")

        

        if completed {

            self.moDimmingView.removeFromSuperview()

        }

    }

   

    

    // 暗色背景

    lazy var moDimmingView: UIView = {

        let view = UIView(frame: .zero)

        view.backgroundColor = UIColor(white: 0.0, alpha: 0.4)

        view.alpha = 0.0

        return view

    }()

}

参考地址 :blog.csdn.net/Margaret_MO…

demo地址:github.com/lizhi0123/L…