176 lines
		
	
	
		
			5.2 KiB
		
	
	
	
		
			Swift
		
	
	
	
			
		
		
	
	
			176 lines
		
	
	
		
			5.2 KiB
		
	
	
	
		
			Swift
		
	
	
	
| //
 | |
| //  CLBaseViewController.swift
 | |
| //  Crush
 | |
| //
 | |
| //  Created by Leon on 2025/7/12.
 | |
| //
 | |
| 
 | |
| import SnapKit
 | |
| import UIKit
 | |
| 
 | |
| class CLBaseViewController: UIViewController {
 | |
|     // MARK: - Configs
 | |
| 
 | |
|     class var shouldPresentThisVc: Bool {
 | |
|         return false
 | |
|     }
 | |
| 
 | |
|     lazy var navigationView: NavigationView = {
 | |
|         let view = NavigationView()
 | |
|         view.backButton.isHidden = true
 | |
|         return view
 | |
|     }()
 | |
| 
 | |
|     override var title: String? {
 | |
|         didSet {
 | |
|             navigationView.title = title
 | |
|         }
 | |
|     }
 | |
| 
 | |
|     override var preferredStatusBarStyle: UIStatusBarStyle {
 | |
|         return .lightContent
 | |
|     }
 | |
| 
 | |
|     override var shouldAutorotate: Bool {
 | |
|         return false
 | |
|     }
 | |
| 
 | |
|     override var supportedInterfaceOrientations: UIInterfaceOrientationMask {
 | |
|         return .portrait
 | |
|     }
 | |
|     
 | |
|     var isDisplaying: Bool = false
 | |
| 
 | |
|     override func viewDidLoad() {
 | |
|         super.viewDidLoad()
 | |
|         view.backgroundColor = .c.cbd
 | |
|         modalPresentationStyle = .fullScreen
 | |
|         addNavigationView()
 | |
|     }
 | |
| 
 | |
|     override func viewWillAppear(_ animated: Bool) {
 | |
|         super.viewWillAppear(animated)
 | |
|         if type(of: self).shouldPresentThisVc {
 | |
|             navigationView.setupBackButtonCloseIcon()
 | |
|             navigationView.backButton.isHidden = false
 | |
|             navigationView.backButton.removeTarget(nil, action: nil, for: .touchUpInside)
 | |
|             navigationView.backButton.addTarget(self, action: #selector(tapNaviClose), for: .touchUpInside)
 | |
|         } else if presentingViewController != nil && navigationController?.viewControllers.count == 1{
 | |
|             navigationView.setupBackButtonCloseIcon()
 | |
|         }
 | |
|     }
 | |
|     
 | |
|     override func viewDidAppear(_ animated: Bool) {
 | |
|         super.viewDidAppear(animated)
 | |
|         isDisplaying = true
 | |
|     }
 | |
|     
 | |
|     override func viewWillDisappear(_ animated: Bool) {
 | |
|         super.viewWillDisappear(animated)
 | |
|         isDisplaying = false
 | |
|     }
 | |
| 
 | |
|     override func viewDidLayoutSubviews() {
 | |
|         super.viewDidLayoutSubviews()
 | |
|     }
 | |
| 
 | |
|     func disabledFullScreenPan() {
 | |
|         if let navc: CLNavigationController = navigationController as? CLNavigationController {
 | |
|             navc.disabledFullScreenPan()
 | |
|         }
 | |
|         self.navigationController?.interactivePopGestureRecognizer?.isEnabled = false
 | |
|     }
 | |
| 
 | |
|     /// 开启全屏
 | |
|     func enabledFullScreenPan() {
 | |
|         if let navc: CLNavigationController = navigationController as? CLNavigationController {
 | |
|             navc.enabledFullScreenPan()
 | |
|         }
 | |
|         self.navigationController?.interactivePopGestureRecognizer?.isEnabled = true
 | |
|     }
 | |
| 
 | |
|     @objc func tapNaviClose() {
 | |
|         dismiss(animated: true)
 | |
|     }
 | |
| 
 | |
|     deinit {
 | |
|         print("♻️ \(classForCoder)")
 | |
| 
 | |
|         continueDialogIfHaveWhenDealloc()
 | |
|     }
 | |
| 
 | |
|     private func continueDialogIfHaveWhenDealloc() {
 | |
|         guard let subControllers = navigationController?.viewControllers else { return }
 | |
|         let popControllers = subControllers.filter { $0 is BaseMaskPopDialogController } as! [BaseMaskPopDialogController]
 | |
| 
 | |
|         if !popControllers.isEmpty {
 | |
|             for per in popControllers {
 | |
|                 if !DialogPopUpManager.shared.toBeHandleMaskPopControllers.contains(per) {
 | |
|                     DialogPopUpManager.shared.toBeHandleMaskPopControllers.append(per)
 | |
|                 }
 | |
|             }
 | |
|             DialogPopUpManager.shared.delayToContinueDialog()
 | |
|         }
 | |
|     }
 | |
| }
 | |
| 
 | |
| extension CLBaseViewController {
 | |
|     public func addNavigationView() {
 | |
|         view.addSubview(navigationView)
 | |
|         navigationView.snp.makeConstraints { make in
 | |
|             make.top.equalToSuperview()
 | |
|             make.leading.equalToSuperview()
 | |
|             make.trailing.equalToSuperview()
 | |
|             make.height.equalTo(UIWindow.navBarTotalHeight)
 | |
|         }
 | |
|     }
 | |
| 
 | |
|     public func hiddenBackButton(of isHidden: Bool) {
 | |
|         navigationView.backButton.isHidden = isHidden
 | |
|     }
 | |
| 
 | |
|     public func close(dismissFirst:Bool = false, completion:(()->Void)? = nil) {
 | |
|         if let vcs = navigationController?.viewControllers, vcs.count > 1 {
 | |
|             if presentingViewController != nil && dismissFirst{
 | |
|                 dismiss(animated: true, completion: completion)
 | |
|             }else{
 | |
|                 navigationController?.popViewController(animated: true)
 | |
|             }
 | |
|         } else {
 | |
|             dismiss(animated: true, completion: completion)
 | |
|         }
 | |
|     }
 | |
|     
 | |
|     public func presentNaviRootVc(vc: UIViewController, animated: Bool = true){
 | |
| //        if let clBaseVc = vc as? CLBaseViewController{ // 转移到viewWillAppear中
 | |
| //            clBaseVc.navigationView.setupBackButtonCloseIcon()
 | |
| //        }
 | |
|         
 | |
|         let navc = CLNavigationController(rootViewController: vc)
 | |
|         navc.modalPresentationStyle = .fullScreen
 | |
|         present(navc, animated: animated)
 | |
|     }
 | |
|     
 | |
| }
 | |
| 
 | |
| class CLViewController<Container: UIView>: CLBaseViewController {
 | |
|     var container: Container { view as! Container }
 | |
| 
 | |
|     override func loadView() {
 | |
|         super.loadView()
 | |
|         if view is Container {
 | |
|             return
 | |
|         }
 | |
|         
 | |
|         view = Container()
 | |
|         if let realContainer = view as? CLContainer {
 | |
|             realContainer.navigationView = navigationView
 | |
|         }
 | |
| //        if Container.self is CLContainer.Type{
 | |
| //            view = CLContainer(navigationView: navigationView)
 | |
| //        }else{
 | |
| //            view = Container()
 | |
| //        }
 | |
|     }
 | |
| }
 |