281 lines
10 KiB
Swift
281 lines
10 KiB
Swift
//
|
||
// 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 = .white//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
|
||
}
|
||
}
|