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() | ||
|  | //        } | ||
|  |     } | ||
|  | } |