| | |
| | | let ReloadData_Noti = Notification.Name.init("ReloadData_Noti") |
| | | |
| | | struct TitleItem{ |
| | | var id = 0 |
| | | var title = "" |
| | | var subTitle = "" |
| | | var hasMore:Bool = false |
| | | var coverImage:String? |
| | | var id = 0 |
| | | var title = "" |
| | | var subTitle = "" |
| | | var hasMore:Bool = false |
| | | var coverImage:String? |
| | | } |
| | | |
| | | class HomeViewModel{ |
| | | var homeTopMenuItems = [HomeTopMenuItem]() |
| | | var homeBottomMenuItems = [HomeTopMenuItem]() |
| | | var todyModel:ToDayMeditationModel? |
| | | var privateTodyModels = [MeditationModel]() |
| | | var meditationList = [MeditationListModel]() |
| | | var homeTopMenuItems = [HomeTopMenuItem]() |
| | | var homeBottomMenuItems = [HomeTopMenuItem]() |
| | | var todyModel:ToDayMeditationModel? |
| | | var privateTodyModels = [MeditationModel]() |
| | | var meditationList = [MeditationListModel]() |
| | | } |
| | | |
| | | class HomeVC: BaseVC { |
| | | private var tableView:UITableView! |
| | | private let topMenuView = HomeTopMenuView.jq_loadNibView() |
| | | private var titleItems = [TitleItem]() |
| | | private var viewModel = HomeViewModel() |
| | | private var tableView:UITableView! |
| | | private let topMenuView = HomeTopMenuView.jq_loadNibView() |
| | | private var titleItems = [TitleItem]() |
| | | private var viewModel = HomeViewModel() |
| | | private var timer:Timer? |
| | | private var needPopToTree:Bool = false //是否需要跳转到树苗 |
| | | private var needPopToTree:Bool = false //是否需跳转到树苗 |
| | | |
| | | private var cellularData:CTCellularData! |
| | | |
| | |
| | | override func viewDidLoad() { |
| | | super.viewDidLoad() |
| | | |
| | | titleItems.removeAll() |
| | | titleItems.removeAll() |
| | | |
| | | timer = Timer.scheduledTimer(timeInterval: 30, target: self, selector: #selector(autoUpdate), userInfo: nil, repeats: true) |
| | | RunLoop.current.add(timer!, forMode: .default) |
| | | |
| | | titleItems.append(TitleItem(title: "每日疗愈", subTitle: "Daily Meditation")) |
| | | titleItems.append(TitleItem(title: "私人订制", subTitle: "Private Customization",hasMore: true)) |
| | | titleItems.append(TitleItem(title: "新手冥想指南", subTitle: "Meditation guide")) |
| | | titleItems.append(TitleItem(title: "每日疗愈", subTitle: "Daily Meditation")) |
| | | titleItems.append(TitleItem(title: "私人订制", subTitle: "Private Customization",hasMore: true)) |
| | | titleItems.append(TitleItem(title: "新手冥想指南", subTitle: "Meditation guide")) |
| | | |
| | | if let setting = UserDefaultSettingViewModel.getSetting(){ |
| | | if let audioFile = setting.bgm?.audioFile{ |
| | | AudioPlayer.getSharedInstance().playSceneAt(audioFile) |
| | | } |
| | | } |
| | | if let setting = UserDefaultSettingViewModel.getSetting(){ |
| | | if let audioFile = setting.bgm?.audioFile{ |
| | | AudioPlayer.getSharedInstance().playSceneAt(audioFile) |
| | | } |
| | | } |
| | | |
| | | tableView.mj_header = MJRefreshNormalHeader(refreshingBlock: { |
| | | self.getData() |
| | |
| | | topMenuView.image_top.sd_setImage(with: URL(string: m.imageUrl.jq_urlEncoded())) |
| | | } |
| | | |
| | | getData() |
| | | getData() |
| | | |
| | | cellularData = CTCellularData() |
| | | cellularData.cellularDataRestrictionDidUpdateNotifier = {[weak self] state in |
| | |
| | | } |
| | | } |
| | | |
| | | override func setUI() { |
| | | super.setUI() |
| | | override func setUI() { |
| | | super.setUI() |
| | | |
| | | let titleView = UIView() |
| | | titleView.frame = CGRect(x: 0, y: 0, width: 100, height: 40) |
| | | let titleL = UILabel() |
| | | titleL.font = Def_SourceHanSansCN_Regular(fontSize: 21) |
| | | titleL.text = "心 泉 疗 愈" |
| | | titleL.textAlignment = .center |
| | | titleL.textColor = UIColor(hexStr: "#252A23") |
| | | titleL.frame = CGRect(x: 0, y: 0, width: 100, height: 19) |
| | | let titleView = UIView() |
| | | titleView.frame = CGRect(x: 0, y: 0, width: 100, height: 40) |
| | | let titleL = UILabel() |
| | | titleL.font = Def_SourceHanSansCN_Regular(fontSize: 21) |
| | | titleL.text = "心 泉 疗 愈" |
| | | titleL.textAlignment = .center |
| | | titleL.textColor = UIColor(hexStr: "#252A23") |
| | | titleL.frame = CGRect(x: 0, y: 0, width: 100, height: 19) |
| | | |
| | | let subTitleL = UILabel() |
| | | subTitleL.font = Def_Agenda_Light(fontSize: 8) |
| | | subTitleL.text = "XIN QUAN" |
| | | subTitleL.textAlignment = .center |
| | | subTitleL.textColor = UIColor(hexStr: "#252A23") |
| | | subTitleL.frame = CGRect(x: 0, y: 20, width: 100, height: 19) |
| | | let subTitleL = UILabel() |
| | | subTitleL.font = Def_Agenda_Light(fontSize: 8) |
| | | subTitleL.text = "XIN QUAN" |
| | | subTitleL.textAlignment = .center |
| | | subTitleL.textColor = UIColor(hexStr: "#252A23") |
| | | subTitleL.frame = CGRect(x: 0, y: 20, width: 100, height: 19) |
| | | |
| | | |
| | | titleView.addSubview(titleL) |
| | | titleView.addSubview(subTitleL) |
| | | titleView.addSubview(titleL) |
| | | titleView.addSubview(subTitleL) |
| | | |
| | | |
| | | navigationItem.titleView = titleView |
| | | navigationItem.titleView = titleView |
| | | |
| | | let search = UIButton(type: .custom) |
| | | search.setImage(UIImage(named: "btn_search"), for: .normal) |
| | | search.addTarget(self, action: #selector(searchAction), for: .touchUpInside) |
| | | search.bounds = CGRect(origin: .zero, size:CGSize(width: 50, height: 30)) |
| | | navigationItem.leftBarButtonItem = UIBarButtonItem(customView: search) |
| | | let search = UIButton(type: .custom) |
| | | search.setImage(UIImage(named: "btn_search"), for: .normal) |
| | | search.addTarget(self, action: #selector(searchAction), for: .touchUpInside) |
| | | search.bounds = CGRect(origin: .zero, size:CGSize(width: 50, height: 30)) |
| | | navigationItem.leftBarButtonItem = UIBarButtonItem(customView: search) |
| | | |
| | | |
| | | let voices = UIButton(type: .custom) |
| | | voices.setImage(UIImage(named: "btn_voices"), for: .normal) |
| | | voices.addTarget(self, action: #selector(settingvoiceAction), for: .touchUpInside) |
| | | voices.bounds = CGRect(origin: .zero, size:CGSize(width: 50, height: 30)) |
| | | navigationItem.rightBarButtonItem = UIBarButtonItem(customView: voices) |
| | | let voices = UIButton(type: .custom) |
| | | voices.setImage(UIImage(named: "btn_voices"), for: .normal) |
| | | voices.addTarget(self, action: #selector(settingvoiceAction), for: .touchUpInside) |
| | | voices.bounds = CGRect(origin: .zero, size:CGSize(width: 50, height: 30)) |
| | | navigationItem.rightBarButtonItem = UIBarButtonItem(customView: voices) |
| | | |
| | | tableView = UITableView(frame: .zero, style: .plain) |
| | | tableView.contentInset = UIEdgeInsets(top: 0, left: 0, bottom: 40, right: 0) |
| | | tableView.showsVerticalScrollIndicator = false |
| | | DispatchQueue.main.async { |
| | | let h = 119 + 20.5 + JQ_ScreenW * 0.913 |
| | | self.topMenuView.frame = CGRect(x: 0, y: 0, width: JQ_ScreenW, height: h) |
| | | self.tableView.tableHeaderView = self.topMenuView |
| | | } |
| | | tableView = UITableView(frame: .zero, style: .plain) |
| | | tableView.contentInset = UIEdgeInsets(top: 0, left: 0, bottom: 40, right: 0) |
| | | tableView.showsVerticalScrollIndicator = false |
| | | DispatchQueue.main.async { |
| | | let h = 119 + 20.5 + JQ_ScreenW * 0.913 |
| | | self.topMenuView.frame = CGRect(x: 0, y: 0, width: JQ_ScreenW, height: h) |
| | | self.tableView.tableHeaderView = self.topMenuView |
| | | } |
| | | |
| | | tableView.tableHeaderView = topMenuView |
| | | tableView.tableHeaderView = topMenuView |
| | | |
| | | tableView.register(UINib(nibName: "Home_Style_1_TCell", bundle: nil), forCellReuseIdentifier: "_Home_Style_1_TCell") |
| | | tableView.register(UINib(nibName: "Home_Style_2_TCell", bundle: nil), forCellReuseIdentifier: "_Home_Style_2_TCell") |
| | | tableView.register(UINib(nibName: "Home_Style_3_TCell", bundle: nil), forCellReuseIdentifier: "_Home_Style_3_TCell") |
| | | tableView.register(UINib(nibName: "Home_Style_4_TCell", bundle: nil), forCellReuseIdentifier: "_Home_Style_4_TCell") |
| | | tableView.register(UINib(nibName: "Home_Style_1_TCell", bundle: nil), forCellReuseIdentifier: "_Home_Style_1_TCell") |
| | | tableView.register(UINib(nibName: "Home_Style_2_TCell", bundle: nil), forCellReuseIdentifier: "_Home_Style_2_TCell") |
| | | tableView.register(UINib(nibName: "Home_Style_3_TCell", bundle: nil), forCellReuseIdentifier: "_Home_Style_3_TCell") |
| | | tableView.register(UINib(nibName: "Home_Style_4_TCell", bundle: nil), forCellReuseIdentifier: "_Home_Style_4_TCell") |
| | | |
| | | tableView.register(UINib(nibName: "Home_Style_5_TCell", bundle: nil), forCellReuseIdentifier: "_Home_Style_5_TCell") |
| | | tableView.register(UINib(nibName: "Home_Style_5_TCell", bundle: nil), forCellReuseIdentifier: "_Home_Style_5_TCell") |
| | | |
| | | tableView.separatorStyle = .none |
| | | tableView.delegate = self |
| | | tableView.dataSource = self |
| | | if #available(iOS 15.0, *) { |
| | | tableView.sectionHeaderTopPadding = 0 |
| | | } else { |
| | | tableView.separatorStyle = .none |
| | | tableView.delegate = self |
| | | tableView.dataSource = self |
| | | if #available(iOS 15.0, *) { |
| | | tableView.sectionHeaderTopPadding = 0 |
| | | } else { |
| | | |
| | | } |
| | | tableView.register(HomeHeaderView.self, forHeaderFooterViewReuseIdentifier: "_HomeHeaderView") |
| | | view.addSubview(tableView) |
| | | tableView.snp.makeConstraints { make in |
| | | make.edges.equalToSuperview() |
| | | } |
| | | } |
| | | } |
| | | tableView.register(HomeHeaderView.self, forHeaderFooterViewReuseIdentifier: "_HomeHeaderView") |
| | | view.addSubview(tableView) |
| | | tableView.snp.makeConstraints { make in |
| | | make.edges.equalToSuperview() |
| | | } |
| | | } |
| | | |
| | | override func setRx() { |
| | | topMenuView.clickItemAt {[unowned self] item in |
| | | override func setRx() { |
| | | topMenuView.clickItemAt {[unowned self] item in |
| | | let vc = HomeItemListVC(topTitle: item.title, id: item.id, showType:.vertical) |
| | | self.push(vc: vc) |
| | | } |
| | | self.push(vc: vc) |
| | | } |
| | | |
| | | NotificationCenter.default.rx.notification(SetBGMSuccess_Noti).take(until: self.rx.deallocated).subscribe(onNext: {data in |
| | | self.topMenuView.resetTopImage() |
| | | }).disposed(by: disposeBag) |
| | | NotificationCenter.default.rx.notification(SetBGMSuccess_Noti).take(until: self.rx.deallocated).subscribe(onNext: {data in |
| | | self.topMenuView.resetTopImage() |
| | | }).disposed(by: disposeBag) |
| | | |
| | | NotificationCenter.default.rx.notification(PlantGuideQuit_Noti).take(until: self.rx.deallocated).subscribe(onNext: {[weak self]data in |
| | | NotificationCenter.default.rx.notification(PlantGuideQuit_Noti).take(until: self.rx.deallocated).subscribe(onNext: {[weak self]data in |
| | | guard let weakSelf = self else { return } |
| | | |
| | | weakSelf.needPopToTree = data.object as? Bool ?? false |
| | | weakSelf.getData() |
| | | |
| | | }).disposed(by: disposeBag) |
| | | }).disposed(by: disposeBag) |
| | | |
| | | NotificationCenter.default.rx.notification(LoginSuccess_Noti).take(until: self.rx.deallocated).subscribe(onNext: {data in |
| | | self.getData() |
| | |
| | | NotificationCenter.default.rx.notification(ReloadData_Noti).take(until: self.rx.deallocated).subscribe(onNext: {data in |
| | | self.tableView.reloadData() |
| | | }).disposed(by: disposeBag) |
| | | } |
| | | } |
| | | |
| | | private func getData(){ |
| | | private func getData(){ |
| | | tableView.mj_header?.endRefreshing() |
| | | |
| | | Services.getCategoryListByType(type: 1).subscribe(onNext: { data in |
| | | var items = [HomeTopMenuItem]() |
| | | for v in data.data ?? []{ |
| | | Services.getCategoryListByType(type: 1).subscribe(onNext: { data in |
| | | var items = [HomeTopMenuItem]() |
| | | for v in data.data ?? []{ |
| | | let model = HomeTopMenuItem(id: v.id, title: v.categoryName, image: v.firstIconUrl.jq_urlEncoded(), imageFrom: .url) |
| | | items.append(model) |
| | | } |
| | | items.append(model) |
| | | } |
| | | |
| | | self.viewModel.homeTopMenuItems = items |
| | | let h = ceil(Double(items.count) / 4.0) * 119 + 20.5 + JQ_ScreenW * 0.913 |
| | | self.topMenuView.menu_height.constant = ceil(Double(items.count) / 4.0) * 119 |
| | | self.tableView.tableHeaderView?.frame = CGRect(origin: .zero, size: CGSizeMake(JQ_ScreenW, h)) |
| | | self.topMenuView.resetItems(items) |
| | | self.topMenuView.menu_collectionView.reloadData() |
| | | }).disposed(by: disposeBag) |
| | | self.viewModel.homeTopMenuItems = items |
| | | let h = ceil(Double(items.count) / 4.0) * 119 + 20.5 + JQ_ScreenW * 0.913 |
| | | self.topMenuView.menu_height.constant = ceil(Double(items.count) / 4.0) * 119 |
| | | self.tableView.tableHeaderView?.frame = CGRect(origin: .zero, size: CGSizeMake(JQ_ScreenW, h)) |
| | | self.topMenuView.resetItems(items) |
| | | self.topMenuView.menu_collectionView.reloadData() |
| | | }).disposed(by: disposeBag) |
| | | |
| | | Services.getCategoryListByType(type: 2).subscribe(onNext: { data in |
| | | var items = [HomeTopMenuItem]() |
| | | for v in data.data ?? []{ |
| | | Services.getCategoryListByType(type: 2).subscribe(onNext: { data in |
| | | var items = [HomeTopMenuItem]() |
| | | for v in data.data ?? []{ |
| | | let model = HomeTopMenuItem(id: v.id, title: v.categoryName, image: v.secondIconUrl.jq_urlEncoded(), imageFrom: .url) |
| | | items.append(model) |
| | | } |
| | | items.append(model) |
| | | } |
| | | self.viewModel.homeBottomMenuItems = items |
| | | self.tableView.reloadRows(at: [IndexPath(row: 4, section: 0)], with: .none) |
| | | }).disposed(by: disposeBag) |
| | | self.tableView.reloadRows(at: [IndexPath(row: 4, section: 0)], with: .none) |
| | | }).disposed(by: disposeBag) |
| | | |
| | | Services.getTopdayMedita().subscribe(onNext: { data in |
| | | self.viewModel.todyModel = data.data |
| | | self.tableView.reloadRows(at: [IndexPath(row: 0, section: 0)], with: .none) |
| | | }).disposed(by: disposeBag) |
| | | Services.getTopdayMedita().subscribe(onNext: { data in |
| | | self.viewModel.todyModel = data.data |
| | | self.tableView.reloadRows(at: [IndexPath(row: 0, section: 0)], with: .none) |
| | | }).disposed(by: disposeBag) |
| | | |
| | | |
| | | |
| | |
| | | let m = MeditationModel() |
| | | m.id = 0 |
| | | self.viewModel.privateTodyModels = [m] |
| | | // if !(UserViewModel.getLoginInfo()?.accessToken.isEmpty ?? true){ |
| | | Services.getPersonalityPlan().subscribe(onNext: { data in |
| | | if let m = data.data{ |
| | | if m.count > 0{ |
| | | self.viewModel.privateTodyModels = m |
| | | } |
| | | self.tableView.reloadRows(at: [IndexPath(row: 1, section: 0)], with: .none) |
| | | // if !(UserViewModel.getLoginInfo()?.accessToken.isEmpty ?? true){ |
| | | Services.getPersonalityPlan().subscribe(onNext: { data in |
| | | if let m = data.data{ |
| | | if m.count > 0{ |
| | | self.viewModel.privateTodyModels = m |
| | | } |
| | | }).disposed(by: disposeBag) |
| | | // }else{ |
| | | // self.tableView.reloadData() |
| | | // } |
| | | self.tableView.reloadRows(at: [IndexPath(row: 1, section: 0)], with: .none) |
| | | } |
| | | }).disposed(by: disposeBag) |
| | | // }else{ |
| | | // self.tableView.reloadData() |
| | | // } |
| | | |
| | | Services.getMeditationAndCateList().subscribe(onNext: { data in |
| | | if let m = data.data{ |
| | | self.viewModel.meditationList.removeAll() |
| | | Services.getMeditationAndCateList().subscribe(onNext: { data in |
| | | if let m = data.data{ |
| | | self.viewModel.meditationList.removeAll() |
| | | self.titleItems.removeAll() |
| | | self.titleItems.append(TitleItem(title: "每日疗愈", subTitle: "Daily Meditation")) |
| | | self.titleItems.append(TitleItem(title: "私人订制", subTitle: "Private Customization",hasMore: true)) |
| | | self.titleItems.append(TitleItem(title: "新手冥想指南", subTitle: "Meditation guide")) |
| | | |
| | | |
| | | self.viewModel.meditationList = m |
| | | self.viewModel.meditationList = m |
| | | for v in self.viewModel.meditationList{ |
| | | if v.clientMeditationCategoryVO?.categoryName.isEmpty ?? true{continue} |
| | | self.titleItems.append(TitleItem(title: v.clientMeditationCategoryVO?.categoryName ?? "", subTitle: v.clientMeditationCategoryVO?.description ?? "",hasMore:true)) |
| | | } |
| | | self.tableView.reloadData() |
| | | } |
| | | }).disposed(by: disposeBag) |
| | | self.titleItems.append(TitleItem(title: v.clientMeditationCategoryVO?.categoryName ?? "", subTitle: v.clientMeditationCategoryVO?.description ?? "",hasMore:true)) |
| | | } |
| | | self.tableView.reloadData() |
| | | } |
| | | }).disposed(by: disposeBag) |
| | | |
| | | Services.getLunchPage().subscribe(onNext: {data in |
| | | |
| | |
| | | } |
| | | |
| | | }).disposed(by: disposeBag) |
| | | } |
| | | } |
| | | |
| | | |
| | | @objc func autoUpdate(){ |
| | | guard !(viewModel.todyModel?.endPlayTime.isEmpty ?? true) else {return} |
| | | @objc func autoUpdate() { |
| | | guard let endPlayTime = viewModel.todyModel?.endPlayTime, !endPlayTime.isEmpty else { return } |
| | | |
| | | let todayEndDay = Date().jq_format("yyyy-MM-dd") + " \(viewModel.todyModel!.endPlayTime)" |
| | | let endDayInterval = Date.jq_StringToTimeInterval(todayEndDay,"yyyy-MM-dd HH:mm:ss") |
| | | let todayEndDay = Date().jq_format("yyyy-MM-dd") + " \(endPlayTime)" |
| | | let endDayInterval = Date.jq_StringToTimeInterval(todayEndDay, "yyyy-MM-dd HH:mm:ss") |
| | | |
| | | if Date().timeIntervalSince1970 > endDayInterval{ |
| | | Services.getTopdayMedita().subscribe(onNext: { data in |
| | | if Date().timeIntervalSince1970 > endDayInterval { |
| | | Services.getTopdayMedita().subscribe(onNext: { [weak self] data in |
| | | guard let self = self else { return } |
| | | self.viewModel.todyModel = data.data |
| | | self.tableView.reloadRows(at: [IndexPath(row: 0, section: 0)], with: .none) |
| | | }).disposed(by: disposeBag) |
| | | } |
| | | } |
| | | |
| | | @objc func searchAction(){ |
| | | @objc func searchAction(){ |
| | | let vc = SearchVC(serchType: .muse) |
| | | push(vc: vc) |
| | | } |
| | | push(vc: vc) |
| | | } |
| | | |
| | | @objc func settingvoiceAction(){ |
| | | @objc func settingvoiceAction(){ |
| | | let vc = BackgroundVoiceVC(isFromFist: false) |
| | | push(vc: vc) |
| | | } |
| | | push(vc: vc) |
| | | } |
| | | |
| | | @objc func jumpMoreAction(_ sender:UIButton){ |
| | | switch sender.tag { |
| | | case 201: |
| | | //跳转计划引导 |
| | | @objc func jumpMoreAction(_ sender:UIButton){ |
| | | switch sender.tag { |
| | | case 201: |
| | | //跳转计划引导 |
| | | let nav = BaseNav(rootViewController: PlanGuideVC(isFromFist: false)) |
| | | nav.modalPresentationStyle = .fullScreen |
| | | present(nav, animated: true) |
| | | break |
| | | default: |
| | | let topTitle = titleItems[sender.tag - 200].title |
| | | let m = viewModel.meditationList[sender.tag - 200 - 3] |
| | | if let id = m.clientMeditationCategoryVO?.id{ |
| | | nav.modalPresentationStyle = .fullScreen |
| | | present(nav, animated: true) |
| | | break |
| | | default: |
| | | let topTitle = titleItems[sender.tag - 200].title |
| | | let m = viewModel.meditationList[sender.tag - 200 - 3] |
| | | if let id = m.clientMeditationCategoryVO?.id{ |
| | | let vc = HomeItemListVC(topTitle: topTitle, id: id,showType: .vertical) |
| | | push(vc: vc) |
| | | } |
| | | } |
| | | } |
| | | push(vc: vc) |
| | | } |
| | | } |
| | | } |
| | | |
| | | deinit { |
| | | // 使定时器失效 |
| | | timer?.invalidate() |
| | | |
| | | // 移除通知中心观察者 |
| | | NotificationCenter.default.removeObserver(self) |
| | | } |
| | | |
| | | } |
| | | |
| | | extension HomeVC:UITableViewDelegate & UITableViewDataSource{ |
| | | |
| | | func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) { |
| | | func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) { |
| | | |
| | | if indexPath.section == 0{ |
| | | if let m = viewModel.todyModel,let detailId = m.clientMeditationVO?.id{ |
| | | if AudioPlayer.getSharedInstance().meditationModel?.id == m.meditationId{ |
| | | if AudioPlayer.getSharedInstance().bgmPlayer?.timeControlStatus == .paused{ |
| | | AudioPlayer.getSharedInstance().bgmPlayer?.play() |
| | | AudioPlayer.getSharedInstance().masterPlayer?.play() |
| | | PayMusicVC.updateStatus(.playing) |
| | | self.viewModel.todyModel?.playAtMe = true |
| | | }else{ |
| | | AudioPlayer.getSharedInstance().bgmPlayer?.pause() |
| | | AudioPlayer.getSharedInstance().masterPlayer?.pause() |
| | | PayMusicVC.updateStatus(.pause) |
| | | self.viewModel.todyModel?.playAtMe = false |
| | | guard let m = viewModel.todyModel, let detailId = m.clientMeditationVO?.id else { |
| | | alert(msg: "平台暂未设置今日疗愈") |
| | | return |
| | | } |
| | | |
| | | let audioPlayer = AudioPlayer.getSharedInstance() |
| | | let isSameMeditation = audioPlayer.meditationModel?.id == m.meditationId |
| | | let isPaused = audioPlayer.bgmPlayer?.timeControlStatus == .paused |
| | | |
| | | if isSameMeditation { |
| | | if isPaused { |
| | | audioPlayer.bgmPlayer?.play() |
| | | audioPlayer.masterPlayer?.play() |
| | | PayMusicVC.updateStatus(.playing) |
| | | viewModel.todyModel?.playAtMe = true |
| | | } else { |
| | | audioPlayer.bgmPlayer?.pause() |
| | | audioPlayer.masterPlayer?.pause() |
| | | PayMusicVC.updateStatus(.pause) |
| | | viewModel.todyModel?.playAtMe = false |
| | | } |
| | | DispatchQueue.main.asyncAfter(deadline: .now() + 0.4) { |
| | | self.tableView.reloadData() |
| | | } |
| | | } else { |
| | | // 游客模式都能播放 |
| | | Services.getMeditationDetail(id: detailId).subscribe(onNext: { [weak self] data in |
| | | guard let self = self, let m = data.data else { return } |
| | | |
| | | if audioPlayer.meditationModel?.id == m.id && audioPlayer.bgmPlayer?.timeControlStatus == .playing { |
| | | return |
| | | } |
| | | DispatchQueue.main.asyncAfter(delay: 0.4) { |
| | | audioPlayer.playBGMAt(firstPlayIndex: 0, model: m, delegate: self) |
| | | PayMusicVC.show(model: m, isHidden: false) |
| | | self.viewModel.todyModel?.playAtMe = true |
| | | DispatchQueue.main.asyncAfter(deadline: .now() + 1.0) { |
| | | self.tableView.reloadData() |
| | | } |
| | | }else{ |
| | | //游客模式都能播放 |
| | | Services.getMeditationDetail(id: detailId).subscribe(onNext: {[weak self]data in |
| | | if let m = data.data{ |
| | | |
| | | if AudioPlayer.getSharedInstance().meditationModel?.id == m.id && AudioPlayer.getSharedInstance().bgmPlayer?.timeControlStatus == .playing{ |
| | | return |
| | | } |
| | | AudioPlayer.getSharedInstance().playBGMAt(firstPlayIndex: 0, model: m, delegate: self) |
| | | PayMusicVC.show(model: m,isHidden: false) |
| | | self?.viewModel.todyModel?.playAtMe = true |
| | | DispatchQueue.main.asyncAfter(delay: 1.0) { |
| | | self?.tableView.reloadData() |
| | | } |
| | | } |
| | | }).disposed(by: disposeBag) |
| | | } |
| | | }else{ |
| | | alert(msg: "平台暂未设置今日疗愈") |
| | | }).disposed(by: disposeBag) |
| | | } |
| | | } |
| | | |
| | | if indexPath.section == 2{ |
| | | let vc = WebVC(type: .guide) |
| | | vc.title = "泉疗愈" |
| | | push(vc: vc) |
| | | } |
| | | } |
| | | if indexPath.section == 2{ |
| | | let vc = WebVC(type: .guide) |
| | | vc.title = "泉疗愈" |
| | | push(vc: vc) |
| | | } |
| | | } |
| | | |
| | | func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { |
| | | func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { |
| | | if indexPath.section == 0 && indexPath.row == 0{ |
| | | //每日疗愈 |
| | | let cell = tableView.dequeueReusableCell(withIdentifier: "_Home_Style_1_TCell") as! Home_Style_1_TCell |
| | | let cell = tableView.dequeueReusableCell(withIdentifier: "_Home_Style_1_TCell") as! Home_Style_1_TCell |
| | | if viewModel.todyModel?.id != 0{ |
| | | cell.model = viewModel.todyModel |
| | | cell.view_data.isHidden = false |
| | |
| | | } |
| | | |
| | | cell.setplaying() |
| | | return cell |
| | | }else if indexPath.section == 1 && indexPath.row == 0{ |
| | | return cell |
| | | }else if indexPath.section == 1 && indexPath.row == 0{ |
| | | //私人定制 |
| | | let cell = tableView.dequeueReusableCell(withIdentifier: "_Home_Style_4_TCell") as! Home_Style_4_TCell |
| | | cell.style = .style1 |
| | | let cell = tableView.dequeueReusableCell(withIdentifier: "_Home_Style_4_TCell") as! Home_Style_4_TCell |
| | | cell.style = .style1 |
| | | cell.setModels(viewModel.privateTodyModels,showType: .horizontal) |
| | | return cell |
| | | }else if indexPath.section == 2 && indexPath.row == 0{ |
| | | return cell |
| | | }else if indexPath.section == 2 && indexPath.row == 0{ |
| | | // 新手冥想指南 |
| | | let cell = tableView.dequeueReusableCell(withIdentifier: "_Home_Style_2_TCell") as! Home_Style_2_TCell |
| | | let cell = tableView.dequeueReusableCell(withIdentifier: "_Home_Style_2_TCell") as! Home_Style_2_TCell |
| | | cell.imgView.image = UIImage(named: "bg_guide_home") |
| | | cell.view_shadow.isHidden = true |
| | | return cell |
| | | }else { |
| | | cell.view_shadow.isHidden = true |
| | | return cell |
| | | }else { |
| | | |
| | | let index = indexPath.section - 3 |
| | | if index == 0 && indexPath.row != 0{ |
| | | let cell = tableView.dequeueReusableCell(withIdentifier: "_Home_Style_5_TCell") as! Home_Style_5_TCell |
| | | let index = indexPath.section - 3 |
| | | if index == 0 && indexPath.row != 0{ |
| | | let cell = tableView.dequeueReusableCell(withIdentifier: "_Home_Style_5_TCell") as! Home_Style_5_TCell |
| | | cell.setHomeTopMenuItem(viewModel.homeBottomMenuItems) |
| | | return cell |
| | | }else{ |
| | | let m = viewModel.meditationList[index] |
| | | if m.clientMeditationCategoryVO!.showType == .horizontal{ |
| | | let cell = tableView.dequeueReusableCell(withIdentifier: "_Home_Style_4_TCell") as! Home_Style_4_TCell |
| | | cell.style = .style2 |
| | | return cell |
| | | }else{ |
| | | let m = viewModel.meditationList[index] |
| | | if m.clientMeditationCategoryVO!.showType == .horizontal{ |
| | | let cell = tableView.dequeueReusableCell(withIdentifier: "_Home_Style_4_TCell") as! Home_Style_4_TCell |
| | | cell.style = .style2 |
| | | cell.setModels(m.clientMeditationVOList,showType: .horizontal) |
| | | return cell |
| | | }else if m.clientMeditationCategoryVO!.showType == .vertical{ |
| | | let cell = tableView.dequeueReusableCell(withIdentifier: "_Home_Style_3_TCell") as! Home_Style_3_TCell |
| | | return cell |
| | | }else if m.clientMeditationCategoryVO!.showType == .vertical{ |
| | | let cell = tableView.dequeueReusableCell(withIdentifier: "_Home_Style_3_TCell") as! Home_Style_3_TCell |
| | | cell.setModels(m.clientMeditationVOList,showType: .vertical) |
| | | return cell |
| | | } |
| | | } |
| | | return UITableViewCell() |
| | | } |
| | | } |
| | | return cell |
| | | } |
| | | } |
| | | return UITableViewCell() |
| | | } |
| | | } |
| | | |
| | | func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { |
| | | func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { |
| | | |
| | | if section - 3 == 0{ |
| | | return 2 |
| | | } |
| | | return 1 |
| | | } |
| | | if section - 3 == 0{ |
| | | return 2 |
| | | } |
| | | return 1 |
| | | } |
| | | |
| | | func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat { |
| | | if indexPath.section == 0 || indexPath.section == 1 || indexPath.section == 2{ |
| | | return JQ_ScreenW * 0.551 |
| | | }else{ |
| | | let index = indexPath.section - 3 |
| | | let m = viewModel.meditationList[index] |
| | | func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat { |
| | | if indexPath.section == 0 || indexPath.section == 1 || indexPath.section == 2{ |
| | | return JQ_ScreenW * 0.551 |
| | | }else{ |
| | | let index = indexPath.section - 3 |
| | | let m = viewModel.meditationList[index] |
| | | |
| | | if index == 0 && indexPath.row != 0 { |
| | | return 236 |
| | | } |
| | | if index == 0 && indexPath.row != 0 { |
| | | return 236 |
| | | } |
| | | |
| | | if m.clientMeditationCategoryVO?.showType == .horizontal{ |
| | | return 328 |
| | | }else{ |
| | | return 213 |
| | | } |
| | | } |
| | | } |
| | | if m.clientMeditationCategoryVO?.showType == .horizontal{ |
| | | return 328 |
| | | }else{ |
| | | return 213 |
| | | } |
| | | } |
| | | } |
| | | |
| | | func numberOfSections(in tableView: UITableView) -> Int { |
| | | return titleItems.count |
| | | } |
| | | func numberOfSections(in tableView: UITableView) -> Int { |
| | | return titleItems.count |
| | | } |
| | | |
| | | func tableView(_ tableView: UITableView, heightForHeaderInSection section: Int) -> CGFloat { |
| | | return 80.5 |
| | | } |
| | | func tableView(_ tableView: UITableView, heightForHeaderInSection section: Int) -> CGFloat { |
| | | return 80.5 |
| | | } |
| | | |
| | | func tableView(_ tableView: UITableView, viewForHeaderInSection section: Int) -> UIView? { |
| | | let headerView = tableView.dequeueReusableHeaderFooterView(withIdentifier: "_HomeHeaderView") as! HomeHeaderView |
| | | headerView.setTitle(titleItems[section].title, subTitle: titleItems[section].subTitle) |
| | | headerView.btn_more.isHidden = !titleItems[section].hasMore |
| | | headerView.btn_more.tag = section + 200 |
| | | headerView.btn_more.addTarget(self, action: #selector(jumpMoreAction(_:)), for: .touchUpInside) |
| | | func tableView(_ tableView: UITableView, viewForHeaderInSection section: Int) -> UIView? { |
| | | let headerView = tableView.dequeueReusableHeaderFooterView(withIdentifier: "_HomeHeaderView") as! HomeHeaderView |
| | | headerView.setTitle(titleItems[section].title, subTitle: titleItems[section].subTitle) |
| | | headerView.btn_more.isHidden = !titleItems[section].hasMore |
| | | headerView.btn_more.tag = section + 200 |
| | | headerView.btn_more.addTarget(self, action: #selector(jumpMoreAction(_:)), for: .touchUpInside) |
| | | |
| | | if section == 1{ |
| | | headerView.btn_more.setImage(UIImage(named: "btn_more"), for: .normal) |
| | | }else{ |
| | | headerView.btn_more.setImage(UIImage(named: "icon_exchange"), for: .normal) |
| | | } |
| | | return headerView |
| | | } |
| | | |
| | | if section == 1{ |
| | | headerView.btn_more.setImage(UIImage(named: "btn_more"), for: .normal) |
| | | }else{ |
| | | headerView.btn_more.setImage(UIImage(named: "icon_exchange"), for: .normal) |
| | | } |
| | | return headerView |
| | | } |
| | | |
| | | } |
| | | |
| | | extension HomeVC:UIScrollViewDelegate{ |
| | | func scrollViewDidScroll(_ scrollView: UIScrollView) { |
| | | // let v = min(scrollView.contentOffset.y / JQ_NavBarHeight, 1) |
| | | // navigationController?.navigationBar.standardAppearance.backgroundColor = .white.withAlphaComponent(v) |
| | | func scrollViewDidScroll(_ scrollView: UIScrollView) { |
| | | // let v = min(scrollView.contentOffset.y / JQ_NavBarHeight, 1) |
| | | // navigationController?.navigationBar.standardAppearance.backgroundColor = .white.withAlphaComponent(v) |
| | | navigationController?.navigationBar.standardAppearance.backgroundColor = .white |
| | | navigationController?.navigationBar.scrollEdgeAppearance?.backgroundColor = .white |
| | | } |
| | | } |
| | | } |
| | | |
| | | extension HomeVC:PayMusicDelegate{ |
| | | func playState(_ state: PlayMusicState) { |
| | | |
| | | } |
| | | |
| | | |
| | | |
| | | } |