jsdw_ios/QuickLocation/Main/BaseViewController/BaseViewController.swift

274 lines
9.6 KiB
Swift
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

//
// BaseViewController.swift
// SHECommunity
//
// Created by 林 on 2024/11/25.
//
import UIKit
import RxCocoa
import RxSwift
import YBImageBrowser
import UMCommon
#if DEBUG
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 {
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)
MobClick.beginLogPageView(className)
if navigationController?.transitionCoordinator == nil {
(tabBarController as? MainTabBarController)?.updateTabBarVisibility()
}
}
override func viewDidAppear(_ animated: Bool) {
super.viewDidAppear(animated)
(tabBarController as? MainTabBarController)?.updateTabBarVisibility()
}
override func viewWillDisappear(_ animated: Bool) {
super.viewWillDisappear(animated)
let className = String(describing: self.classForCoder)
print(className)
MobClick.endLogPageView(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 leftBackItem = UIBarButtonItem(image: UIImage(named: "Common/back"),
style: .plain,
target: self,
action: #selector(leftBackClicked(_:)))
navigationItem.leftBarButtonItem = leftBackItem
}
}
}
// 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 {
#if DEBUG
private func setupFlex() {
FLEXManager.shared.showExplorer()
}
override func motionEnded(_ motion: UIEvent.EventSubtype, with event: UIEvent?) {
print("摇晃结束")
setupFlex()
}
#endif
}
// 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
}
}