197 lines
7.5 KiB
Swift
197 lines
7.5 KiB
Swift
//
|
||
// MPPositive_BaseViewController.swift
|
||
// MusicPlayer
|
||
//
|
||
// Created by Mr.Zhou on 2024/4/18.
|
||
//
|
||
|
||
import UIKit
|
||
///b面基类控制器
|
||
class MPPositive_BaseViewController: MP_BaseViewController, UIGestureRecognizerDelegate {
|
||
//导航栏标题
|
||
lazy var navTitleLabel:UILabel = createLabel(font: .systemFont(ofSize: 20*width, weight: .regular), textColor: .white, textAlignment: .center)
|
||
//pop按钮
|
||
lazy var popBtn:UIButton = {
|
||
let btn = UIButton()
|
||
btn.setBackgroundImage(UIImage(named: "Pop‘logo"), for: .normal)
|
||
btn.addTarget(self, action: #selector(popActionClick(_ :)), for: .touchUpInside)
|
||
return btn
|
||
}()
|
||
//网络加载失败的View
|
||
private lazy var errorView:UIView = createErrorView()
|
||
///报错回调
|
||
var errorBlock:(() -> Void)?
|
||
///重试回调
|
||
var retryBlock:(() -> Void)?
|
||
//顶部View
|
||
lazy var topSafeAndNavView:UIView = setSafeAndNavView()
|
||
//导航View
|
||
lazy var navView:UIView = setNavTitleView()
|
||
|
||
override func viewDidLoad() {
|
||
super.viewDidLoad()
|
||
self.navigationController?.interactivePopGestureRecognizer?.delegate = self
|
||
view.addSubview(topSafeAndNavView)
|
||
}
|
||
deinit {
|
||
}
|
||
override func viewWillAppear(_ animated: Bool) {
|
||
super.viewWillAppear(animated)
|
||
NotificationCenter.notificationKey.add(observer: self, selector: #selector(errorAction(_ :)), notificationName: .netWork_error_deal)
|
||
NotificationCenter.notificationKey.add(observer: self, selector: #selector(switchCurrentVideoAction(_ :)), notificationName: .positive_player_reload)
|
||
}
|
||
override func viewWillDisappear(_ animated: Bool) {
|
||
super.viewWillDisappear(animated)
|
||
NotificationCenter.default.removeObserver(self)
|
||
}
|
||
//设置一个包含导航栏以及状态栏安全区域的View
|
||
private func setSafeAndNavView() -> UIView {
|
||
let topView = UIView(frame: .init(x: 0, y: 0, width: screen_Width, height: navAndstatusBarHeight))
|
||
topView.backgroundColor = .clear
|
||
topView.addSubview(navView)
|
||
navView.snp.makeConstraints { make in
|
||
make.left.right.bottom.equalToSuperview()
|
||
make.height.equalTo(50*width)
|
||
}
|
||
return topView
|
||
}
|
||
|
||
//设置顶部titleView
|
||
private func setNavTitleView() -> UIView {
|
||
let topView = UIView()
|
||
topView.backgroundColor = .clear
|
||
topView.addSubview(navTitleLabel)
|
||
navTitleLabel.snp.makeConstraints { make in
|
||
make.center.equalToSuperview()
|
||
}
|
||
return topView
|
||
}
|
||
///设置导航栏title
|
||
func setTitle(_ text:String) {
|
||
navTitleLabel.text = text
|
||
}
|
||
///设置导航栏popBtn
|
||
func setPopBtn() {
|
||
navView.addSubview(popBtn)
|
||
popBtn.snp.makeConstraints { make in
|
||
make.width.height.equalTo(42*width)
|
||
make.centerY.equalToSuperview()
|
||
make.left.equalTo(16*width)
|
||
}
|
||
}
|
||
override func viewDidLayoutSubviews() {
|
||
super.viewDidLayoutSubviews()
|
||
//当页面布局完成后,将navView移动至最上层
|
||
view.bringSubviewToFront(topSafeAndNavView)
|
||
}
|
||
//pop上一个页面
|
||
@objc func popActionClick(_ sender:UIButton) {
|
||
view.endEditing(true)
|
||
MPPositive_Debouncer.shared.call(0.1) {
|
||
[weak self] in
|
||
guard let self = self else {return}
|
||
navigationController?.popViewController(animated: true)
|
||
}
|
||
}
|
||
//报错errorView
|
||
private func createErrorView() -> UIView{
|
||
let errorView = UIView()
|
||
errorView.layer.masksToBounds = true
|
||
errorView.layer.borderColor = UIColor(hex: "#80F988").cgColor
|
||
errorView.layer.borderWidth = 1*width
|
||
errorView.layer.cornerRadius = 18*width
|
||
errorView.backgroundColor = .clear
|
||
//使用其他内容
|
||
//一个提示框
|
||
let iconImageView = UIImageView(image: .init(named: "empty"))
|
||
errorView.addSubview(iconImageView)
|
||
iconImageView.snp.makeConstraints { make in
|
||
make.centerX.equalToSuperview()
|
||
make.centerY.equalToSuperview().multipliedBy(0.65)
|
||
make.width.equalTo(211*width)
|
||
make.height.equalTo(172*width)
|
||
}
|
||
let label = createLabel("Weak connection. Please check your network", font: .systemFont(ofSize: 13*width, weight: .regular), textColor: .white, textAlignment: .center)
|
||
errorView.addSubview(label)
|
||
label.snp.makeConstraints { make in
|
||
make.centerX.equalToSuperview()
|
||
make.top.equalTo(iconImageView.snp.bottom).offset(8*width)
|
||
}
|
||
let retryBtn:UIButton = .init()
|
||
retryBtn.setTitle("Retry", for: .normal)
|
||
retryBtn.setTitleColor(.white, for: .normal)
|
||
retryBtn.titleLabel?.font = .systemFont(ofSize: 15*width, weight: .medium)
|
||
retryBtn.backgroundColor = .init(hex: "#80F988")
|
||
retryBtn.layer.masksToBounds = true
|
||
retryBtn.layer.cornerRadius = 16*width
|
||
retryBtn.addTarget(self, action: #selector(retryClick(_ :)), for: .touchUpInside)
|
||
errorView.addSubview(retryBtn)
|
||
retryBtn.snp.makeConstraints { make in
|
||
make.width.equalTo(180*width)
|
||
make.height.equalTo(45*width)
|
||
make.centerX.equalToSuperview()
|
||
make.bottom.equalToSuperview().offset(-15*width)
|
||
}
|
||
return errorView
|
||
}
|
||
//设置报错View
|
||
func setErrorView() {
|
||
view.addSubview(errorView)
|
||
errorView.snp.makeConstraints { make in
|
||
make.center.equalToSuperview()
|
||
make.width.equalTo(300*width)
|
||
make.height.equalTo(280*width)
|
||
}
|
||
}
|
||
//移除报错View
|
||
func removeErrorView() {
|
||
if errorView.superview != nil {
|
||
errorView.removeFromSuperview()
|
||
}
|
||
}
|
||
//处理报错
|
||
@objc private func errorAction(_ sender:Notification){
|
||
DispatchQueue.main.async {
|
||
[weak self] in
|
||
guard let self = self else {return}
|
||
MP_HUD.text("Bad connection~".localizableString(), delay: 1.0){ [weak self] in
|
||
//执行报错回调闭包
|
||
if self?.errorBlock != nil {
|
||
self?.errorBlock!()
|
||
}
|
||
}
|
||
}
|
||
}
|
||
@objc private func retryClick(_ sender:UIButton) {
|
||
if retryBlock != nil {
|
||
retryBlock!()
|
||
}
|
||
}
|
||
//MARK:- UIGestureRecognizerDelegate
|
||
func gestureRecognizerShouldBegin(_ gestureRecognizer: UIGestureRecognizer) -> Bool {
|
||
if gestureRecognizer === self.navigationController?.interactivePopGestureRecognizer {
|
||
// 当是 UINavigationController 的滑动返回手势时,根据需要进行判断
|
||
// 例如需要至少有两个视图控制器在导航堆栈中才允许滑动返回
|
||
return self.navigationController?.viewControllers.count ?? 0 > 1
|
||
}
|
||
return true
|
||
}
|
||
///当用户切换了歌曲后
|
||
@objc private func switchCurrentVideoAction(_ notification:Notification) {
|
||
DispatchQueue.main.async {
|
||
[weak self] in
|
||
guard let self = self else {return}
|
||
//检索当前View内部是否存在tableView
|
||
view.subviews.forEach { item in
|
||
if item is UITableView {
|
||
let tableView = item as? UITableView
|
||
tableView?.reloadData()
|
||
}else if item is UICollectionView {
|
||
let collectionView = item as? UICollectionView
|
||
collectionView?.reloadData()
|
||
}
|
||
}
|
||
}
|
||
}
|
||
}
|