// // BaseViewController.swift // SHECommunity // // Created by 林 on 2024/11/25. // import UIKit import RxCocoa import RxSwift #if DEBUG || AdHoc //import FLEX #endif class BaseViewController: UIViewController { var disposeBag = DisposeBag() /// 是否隐藏导航栏,默认false var isNavigationBarHidden: Bool { true } /// 目前配色: false主题色/true白色, 默认是false var isChangeNavigationBarStyle: Bool { true } /// 是否显示导航底部阴影, 默认是导航栏颜色,白色显示,主题色不显示 var isShowNavigationBarShadow: Bool { isChangeNavigationBarStyle } /// 状态栏样式,默认是default override var preferredStatusBarStyle: UIStatusBarStyle { .default } var isPresented: Bool { return navigationController?.viewControllers.count == 1 && navigationController?.presentingViewController != nil } /// 导航栏标题 var navTitle: String = "" { didSet { backButton.setTitle(" \(navTitle)", for: .normal) // navigationItem.title = navTitle } } override func viewDidLoad() { super.viewDidLoad() // Do any additional setup after loading the view. fd_prefersNavigationBarHidden = isNavigationBarHidden view.backgroundColor = ThemeManager.shared.color.backgroundColor // setupNavigationBar() setupLeftItem() } override func viewWillAppear(_ animated: Bool) { super.viewWillAppear(animated) let className = String(describing: self.classForCoder) print(className) } override func viewWillDisappear(_ animated: Bool) { super.viewWillDisappear(animated) let className = String(describing: self.classForCoder) print(className) } @objc func dismissClicked(_ item: UIBarButtonItem) { self.navigationController?.dismiss(animated: true, completion: nil) } @objc func leftBackClicked(_ item: UIBarButtonItem) { self.navigationController?.popViewController(animated: true) } private func setupNavigationBar() { let appearance = UINavigationBarAppearance() appearance.configureWithOpaqueBackground() appearance.backgroundImage = UIImage() appearance.shadowImage = UIImage() appearance.shadowColor = .clear appearance.backgroundColor = ThemeManager.shared.color.backgroundColor navigationController?.navigationBar.standardAppearance = appearance navigationController?.navigationBar.scrollEdgeAppearance = appearance } // MARK: - Left Item func setupLeftItem() { guard !isNavigationBarHidden else { return } if isPresented { let dismissItem = UIBarButtonItem(image: UIImage(named: "Common/close")?.adaptiveImage, style: .plain, target: self, action: #selector(dismissClicked(_:))) dismissItem.tintColor = .white navigationItem.leftBarButtonItem = dismissItem } else if let count = navigationController?.viewControllers.count, count > 1 { let leftBarBtn = UIBarButtonItem (customView: backButton) //用于消除左边空隙,要不然按钮顶不到最前面 let spacer = UIBarButtonItem (barButtonSystemItem: .fixedSpace, target: nil, action: nil) spacer.width = -10 navigationItem.leftBarButtonItem = leftBarBtn // navigationItem.leftBarButtonItems = [spacer, leftBarBtn] // let leftBackItem = UIBarButtonItem(image: UIImage(named: "Common/back"), // style: .plain, // target: self, action: #selector(leftBackClicked(_:))) // leftBackItem.tintColor = .white // navigationItem.leftBarButtonItem = leftBackItem } } lazy var backButton: UIButton = { let button = UIButton (type: .custom) button.frame = CGRectMake (0, 0, 200, 30) button.setImage(UIImage(named: "Common/back"), for: .normal) button.titleLabel?.font = .systemFont(ofSize: 18, weight: .medium) button.contentHorizontalAlignment = .left button.setTitleColor(ThemeManager.shared.color.titleColor, for: .normal) button.addTarget(self, action: #selector(leftBackClicked(_:)), for: .touchUpInside) return button }() } // MARK: - 验证码 extension BaseViewController { func requestSmsCode(phone: String, sendBtn: UIButton, countDownService: CountDownService) { DLToast.showLoading() SystemService.sendSmsCode(phone: phone).subscribe(onNext: { [weak self] response in DLToast.showSuccess(text: response.message ?? "发送成功") guard let self = self else { return } self.startCountDown(sendBtn, countDownService) }, onError: { _ in }).disposed(by: disposeBag) } func startCountDown(_ sendBtn: UIButton, _ countDownService: CountDownService) { countDownService.startTimer() countDownService.currentTime.subscribe(onNext: { time in DispatchQueue.main.async { var timeStr = "" if time == 0 { sendBtn.isEnabled = true sendBtn.isUserInteractionEnabled = true timeStr = "获取验证码" NSObject.cancelPreviousPerformRequests(withTarget: self) } else { sendBtn.isEnabled = false sendBtn.isUserInteractionEnabled = false timeStr = "\(time.string)s" } sendBtn.setTitle(timeStr, for: .normal) } }).disposed(by: disposeBag) } } // MARK: - 查看大图 extension BaseViewController { func showBigImage(imgUrlList: [String], currentPage: Int, projectiveView: UIView?=nil) { // var tempProjectiveView = projectiveView // if tempProjectiveView == nil { // tempProjectiveView = UIView(frame: CGRect(origin: CGPoint(x: kScreenWidth * 0.5, y: kScreenHeight), size: CGSize(width: 1, height: 1))) // } // var datas: [YBIBDataProtocol] = [] // GlobalAsync { // for mediaUrl in imgUrlList { // // 网络视频 // if mediaUrl.hasSuffix(".mp4") { // let videoData = YBIBVideoData() // videoData.videoURL = URL(string: mediaUrl) // videoData.projectiveView = tempProjectiveView // datas.append(videoData) // } // // 网络图片 // else if mediaUrl.hasPrefix("http") { // let imageData = YBIBImageData() // imageData.imageURL = URL(string: mediaUrl) // imageData.projectiveView = tempProjectiveView // datas.append(imageData) // } // } // MainAsync { // // 预览图片/视频 // let browser = YBImageBrowser() // browser.dataSourceArray = datas // browser.currentPage = currentPage // browser.show() // } // } } } // MARK: - FLEX extension BaseViewController { private func setupFlex() { #if DEBUG || AdHoc // FLEXManager.shared.showExplorer() #endif } override func motionEnded(_ motion: UIEvent.EventSubtype, with event: UIEvent?) { print("摇晃结束") setupFlex() } } // MAKR: - UIView查看大图 extension UIView { func showBigImage(imgUrlList: [String], currentPage: Int, projectiveView: UIView?=nil) { // var tempProjectiveView = projectiveView // if tempProjectiveView == nil { // tempProjectiveView = UIView(frame: CGRect(origin: CGPoint(x: kScreenWidth * 0.5, y: kScreenHeight), size: CGSize(width: 1, height: 1))) // } // var datas: [YBIBDataProtocol] = [] // GlobalAsync { // for mediaUrl in imgUrlList { // // 网络视频 // if mediaUrl.hasSuffix(".mp4") { // let videoData = YBIBVideoData() // videoData.videoURL = URL(string: mediaUrl) // videoData.projectiveView = tempProjectiveView // datas.append(videoData) // } // // 网络图片 // else if mediaUrl.hasPrefix("http") { // let imageData = YBIBImageData() // imageData.imageURL = URL(string: mediaUrl) // imageData.projectiveView = tempProjectiveView // datas.append(imageData) // } // } // MainAsync { // // 预览图片/视频 // let browser = YBImageBrowser() // browser.dataSourceArray = datas // browser.currentPage = currentPage // browser.show() // } // } } } // MARK: - PagerView enum ScrollState { case scrolling case pending case ended } enum LastDirection { case up case down } class PagerScrollView: UIScrollView { weak var panDelegate: UIGestureRecognizerDelegate? func gestureRecognizer(_ gestureRecognizer: UIGestureRecognizer, shouldRecognizeSimultaneouslyWith otherGestureRecognizer: UIGestureRecognizer) -> Bool { if let delegate = panDelegate { if let result = delegate.gestureRecognizer?(gestureRecognizer, shouldRecognizeSimultaneouslyWith: otherGestureRecognizer) { return result } } return false } } class PagerTableView: UITableView { weak var panDelegate: UIGestureRecognizerDelegate? func gestureRecognizer(_ gestureRecognizer: UIGestureRecognizer, shouldRecognizeSimultaneouslyWith otherGestureRecognizer: UIGestureRecognizer) -> Bool { if let delegate = panDelegate { if let result = delegate.gestureRecognizer?(gestureRecognizer, shouldRecognizeSimultaneouslyWith: otherGestureRecognizer) { return result } } return false } }