Visual_Novel_iOS/crush/Crush/Src/Components/Base/CLBaseViewController.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()
// }
}
}