// // MPTabBarController.swift // MusicPlayer // // Created by Mr.Zhou on 2024/3/27. // import UIKit ///A面通用标签栏 class MPSideA_TabBarController: UITabBarController, GADFullScreenContentDelegate { //自定义tabBar private lazy var customTabBar:MPSideA_CustomTabBar = .init(frame: .init(x: 0, y: 0, width: screen_Width, height: 72*width)) //底部音乐展示View(默认隐藏) private lazy var bottomView:MPSideA_BottomShowView = .instanceFromNib() var pushPlayerBlock:(() -> Void)? //底部bottomShowView的展示状态 private var isbottomShow:Bool = false{ willSet{ if isbottomShow != newValue { switch_bottomShow(newValue) } //填充音乐数据 if newValue == true { guard let music = MPSideA_MediaCenterManager.shared.getMusic() else { print("No Data Music") return } bottomView.coverImageView.image = UIImage(data: music.cover) bottomView.titleLabel.text = music.title bottomView.subtitleLabel.text = setTimesToMinSeconds(music.duration) } } } override func viewDidLoad() { super.viewDidLoad() tabBar.isHidden = true self.setValue(customTabBar, forKey: "tabBar") //创建标签子控制器 let homeVC = MPSideA_NavigationController(rootViewController: MPSideA_HomeViewController()) let centerVC = MPSideA_NavigationController(rootViewController: MPSideA_CenterViewController()) //添加子控制器 viewControllers = [homeVC,centerVC] //禁止系统tabBaritem触发 tabBar.items?.forEach({ item in item.isEnabled = false }) tabBar.barTintColor = .clear UITabBar.appearance().backgroundColor = .clear tabBar.shadowImage = UIImage() // tabBar.shadowImage = image(UIColor.red) // 修改线条颜色 tabBar.backgroundImage = UIImage() view.addSubview(bottomView) //将展示View设置在主窗口下方之外,避免用户察觉 bottomView.snp.makeConstraints { make in make.centerX.equalToSuperview() make.bottom.equalToSuperview().offset(82*width) make.width.equalTo(351*width) make.height.equalTo(82*width) } //实现展示View的事件闭包 //倒计时 bottomView.modalTimerBlock = { [weak self] in self?.modalTimer() } //切换播放器状态 bottomView.switchPlayerBlock = { [weak self] in self?.switchState() } //前往播放器 bottomView.pushPlayerBlock = { [weak self] in self?.pushPlayer() } //在页面展示前,获取播放器是否存在历史播放(最后一次播放),并视情况展示View isbottomShow = MPSideA_MediaCenterManager.shared.getMusic() != nil //监听通知 NotificationCenter.notificationKey.add(observer: self, selector: #selector(switchAction(_:)), notificationName: .switch_tabBarItem) NotificationCenter.notificationKey.add(observer: self, selector: #selector(timesAction(_ :)), notificationName: .sideA_time_times) NotificationCenter.notificationKey.add(observer: self, selector: #selector(playMusicAction(_ :)), notificationName: .sideA_play_music) NotificationCenter.notificationKey.add(observer: self, selector: #selector(pauseMusicAction(_ :)), notificationName: .sideA_pause_music) NotificationCenter.notificationKey.add(observer: self, selector: #selector(resumeMusicAction(_ :)), notificationName: .sideA_resume_music) NotificationCenter.notificationKey.add(observer: self, selector: #selector(stopMusicAction(_ :)), notificationName: .sideA_stop_music) NotificationCenter.notificationKey.add(observer: self, selector: #selector(closeBottonViewAction(_ :)), notificationName: .sideA_close_show) NotificationCenter.notificationKey.add(observer: self, selector: #selector(displayBottomViewAction(_ :)), notificationName: .sideA_display_show) NotificationCenter.notificationKey.add(observer: self, selector: #selector(hiddenBottomViewAction(_ :)), notificationName: .sideA_hidden_show) NotificationCenter.notificationKey.add(observer: self, selector: #selector(renameMusicAction(_ :)), notificationName: .sideA_rename_music) } override func viewWillAppear(_ animated: Bool) { super.viewWillAppear(animated) } override func viewWillDisappear(_ animated: Bool) { super.viewWillDisappear(animated) } deinit { //移除所有监听 NotificationCenter.default.removeObserver(self) } override func viewWillLayoutSubviews() { super.viewWillLayoutSubviews() //将展示View设置到最上层 view.bringSubviewToFront(bottomView) } //底部BottomView的切换动画 private func switch_bottomShow(_ state:Bool) { UIView.animate(withDuration: 0.3) { [weak self] in guard let self = self else { return } if state { //向上展示 bottomView.transform = .init(translationX: 0, y: -139*width) }else { //向下隐藏 bottomView.transform = .identity } } } } //MARK: - 事件处理 extension MPSideA_TabBarController: UIViewControllerTransitioningDelegate { //切换事件 @objc private func switchAction(_ sender:Notification) { let tag = sender.object as! Int selectedIndex = tag } //弹出计时器 private func modalTimer() { MPSideA_ModalType = .Timer let timerVC = MPSideA_CountTimerViewController() timerVC.transitioningDelegate = self timerVC.modalPresentationStyle = .custom present(timerVC, animated: true) } //切换播放器状态 private func switchState() { guard let music = MPSideA_MediaCenterManager.shared.getMusic() else { //播放器未能持有音乐实体 print("No Data Music") return } switch MPSideA_MediaCenterManager.shared.getPlayerState() { case .Null://启动播放 MPSideA_MediaCenterManager.shared.playerStart(music, actionType: .Normal) case .Playing://暂停播放 MPSideA_MediaCenterManager.shared.playerPause() case .Pause://继续播放 MPSideA_MediaCenterManager.shared.playerResume() } } //前往播放器 private func pushPlayer() { print("Go to player") MP_AdMobManager.shared.showPlayInterstitialAdIfAvailable { [weak self] ad in guard let self = self else {return} if let ad = ad { //判断音乐播放器是否已经播放 MP_AdMobManager.shared.isShowingPlayInterstitialAd = true //播放器还未播放,可以弹出广告 MP_AdMobManager.shared.setInterstitialSwitch(true) ad.fullScreenContentDelegate = self ad.present(fromRootViewController: self) }else { if let block = self.pushPlayerBlock { block() } } } self.pushPlayerBlock = { [weak self] in //执行加载播放器页面 DispatchQueue.main.async { [weak self] in //模态弹出 let playerVC = MPSideA_PlayerViewController() self?.present(playerVC, animated: true) } } } func presentationController(forPresented presented: UIViewController, presenting: UIViewController?, source: UIViewController) -> UIPresentationController? { return MPSideA_PresentationController(presentedViewController: presented, presenting: presenting) } } //MARK: - 监听触发 extension MPSideA_TabBarController { //计时值变化事件 @objc private func timesAction(_ sender:Notification) { DispatchQueue.main.async { [weak self] in guard let self = self else { return } //隐藏按钮,展示View bottomView.timerBtn.isHidden = true bottomView.timerView.isHidden = false let time = sender.object as! TimeInterval bottomView.timerLabel.text = setTimesToMinSeconds(time) } } //启动音乐播放器 @objc private func playMusicAction(_ sender:Notification) { DispatchQueue.main.async { [weak self] in guard let self = self else { return } isbottomShow = true bottomView.stateBtn.isSelected = true } } //暂停音乐播放器 @objc private func pauseMusicAction(_ sender:Notification) { DispatchQueue.main.async { [weak self] in guard let self = self else { return } bottomView.stateBtn.isSelected = false } } //继续音乐播放器 @objc private func resumeMusicAction(_ sender:Notification) { DispatchQueue.main.async { [weak self] in guard let self = self else { return } bottomView.stateBtn.isSelected = true } } //终止音乐播放器 @objc private func stopMusicAction(_ sender:Notification) { DispatchQueue.main.async { [weak self] in guard let self = self else { return } bottomView.stateBtn.isSelected = false bottomView.timerLabel.text = "Time" //展示按钮,隐藏View bottomView.timerBtn.isHidden = false bottomView.timerView.isHidden = true } } //播放音乐被删除 @objc private func closeBottonViewAction(_ sender:Notification) { DispatchQueue.main.async { [weak self] in guard let self = self else { return } isbottomShow = false } } //展示音乐播放框(ishidden调整) @objc private func displayBottomViewAction(_ sender:Notification) { DispatchQueue.main.async { [weak self] in guard let self = self else { return } bottomView.isHidden = false } } //隐藏音乐播放框(ishidden调整) @objc private func hiddenBottomViewAction(_ sender:Notification) { DispatchQueue.main.async { [weak self] in guard let self = self else { return } bottomView.isHidden = true } } @objc private func renameMusicAction(_ sender:Notification) { DispatchQueue.main.async { [weak self] in guard let self = self else { return } isbottomShow = isbottomShow } } //MARK: - 覆盖型广告代理 GADFullScreenContentDelegate //覆盖型广告将要将要展示 func adWillPresentFullScreenContent(_ ad: GADFullScreenPresentingAd) { if ad === MP_AdMobManager.shared.playInterstitialAd {//播放插页广告 print("当前展示的广告是播放插页广告,广告ID--\(MP_AdMobManager.shared.playInterstitialAd?.adUnitID ?? "")") if MP_AnalyticsManager.shared.infoFromAdMobSource(MP_AdMobManager.shared.playInterstitialAd?.responseInfo) { MP_AdMobManager.shared.playInterstitialAd?.paidEventHandler = { adValue in if let response = MP_AdMobManager.shared.playInterstitialAd?.responseInfo { MP_AnalyticsManager.shared.play_ads_showSuccessAction(response, adValue: adValue) } } }else { if let response = MP_AdMobManager.shared.playInterstitialAd?.responseInfo { MP_AnalyticsManager.shared.play_ads_showSuccessAction(response, adValue: .init()) } } } } //覆盖型广告已经消失 func adDidDismissFullScreenContent(_ ad: GADFullScreenPresentingAd) { MP_AdMobManager.shared.interstitialDate = Date() if ad === MP_AdMobManager.shared.playInterstitialAd {//播放插页广告 let UUID = MP_AdMobManager.shared.playInterstitialAd?.adUnitID ?? "" print("当前消失的广告是播放插页广告,广告ID--\(UUID)") //执行播放插页广告完成事件包 if MP_AdMobManager.shared.completePlayInterstitialAdBlock != nil { MP_AdMobManager.shared.completePlayInterstitialAdBlock!() } //执行加载播放器页面 if let block = self.pushPlayerBlock { block() } } } //覆盖型广告加载出错 func ad(_ ad: GADFullScreenPresentingAd, didFailToPresentFullScreenContentWithError error: Error) { MP_AdMobManager.shared.interstitialDate = Date() if ad === MP_AdMobManager.shared.playInterstitialAd {//播放插页广告 let UUID = MP_AdMobManager.shared.playInterstitialAd?.adUnitID ?? "" print("播放插页广告展示时出错,广告ID--\(UUID),具体错误原因:\(error.localizedDescription)") MP_AnalyticsManager.shared.play_ads_showFailureAction(error.localizedDescription) //执行播放插页广告完成事件包 //执行播放插页广告完成事件包 if MP_AdMobManager.shared.completePlayInterstitialAdBlock != nil { MP_AdMobManager.shared.completePlayInterstitialAdBlock!() } //执行加载播放器页面 // DispatchQueue.main.async { // [weak self] in // //模态弹出 // let playerVC = MPSideA_PlayerViewController() // self?.present(playerVC, animated: true) // } } } }