杨锴
2024-09-10 1554b451f66120d81693eb722875e49a7e9a4186
fix API
22个文件已修改
6个文件已添加
870 ■■■■■ 已修改文件
XQMuse.xcodeproj/project.pbxproj 32 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
XQMuse/Config/Enums/Enums.swift 18 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
XQMuse/Root/.DS_Store 补丁 | 查看 | 原始文档 | blame | 历史
XQMuse/Root/Home/CCell/HomeRelaxBanner_2_CCell.xib 3 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
XQMuse/Root/Home/TCell/Home_Style_3_TCell.swift 12 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
XQMuse/Root/Home/TCell/SearchHotTCell.swift 4 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
XQMuse/Root/Home/TCell/SearchHotTCell.xib 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
XQMuse/Root/Home/VC/CommentListVC.swift 53 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
XQMuse/Root/Home/VC/HomeItemDetailVC.swift 91 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
XQMuse/Root/Home/VC/HomeItemDetailVC.xib 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
XQMuse/Root/Home/VC/SearchContentVC.swift 143 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
XQMuse/Root/Home/VC/SearchContentVC.xib 99 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
XQMuse/Root/Home/VC/SearchVC.swift 34 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
XQMuse/Root/Home/VC/SearchVC.xib 6 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
XQMuse/Root/Home/View/CommentCommentHeaderView.swift 7 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
XQMuse/Root/Network/Models.swift 18 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
XQMuse/Root/Network/Services.swift 50 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
XQMuse/Root/Other/TCell/ChooseOptTitleTCell.swift 18 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
XQMuse/Root/Other/TCell/ChooseOptTitleTCell.xib 48 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
XQMuse/Root/Other/View/ChooseOptTitleView.swift 109 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
XQMuse/Root/Other/View/ChooseOptTitleView.xib 99 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
XQMuse/Root/Other/View/ChooseOptView.swift 14 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
XQMuse/Root/PayMusicView/PayMusicVC.swift 5 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
XQMuse/Root/TreeGroup/Pngs/apngb-animated-level-1.png 补丁 | 查看 | 原始文档 | blame | 历史
XQMuse/Root/TreeGroup/Pngs/apngb-animated-level-2.png 补丁 | 查看 | 原始文档 | blame | 历史
XQMuse/Root/TreeGroup/Pngs/apngb-animated-level-3.png 补丁 | 查看 | 原始文档 | blame | 历史
XQMuse/Root/TreeGroup/Pngs/apngb-animated-level-4.png 补丁 | 查看 | 原始文档 | blame | 历史
XQMuse/Root/TreeGroup/Pngs/apngb-animated-level-5.png 补丁 | 查看 | 原始文档 | blame | 历史
XQMuse.xcodeproj/project.pbxproj
@@ -50,6 +50,10 @@
        1327C6822C81D107005DA44B /* PlanGuide_3_VC.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1327C6802C81D107005DA44B /* PlanGuide_3_VC.swift */; };
        1327C6832C81D107005DA44B /* PlanGuide_3_VC.xib in Resources */ = {isa = PBXBuildFile; fileRef = 1327C6812C81D107005DA44B /* PlanGuide_3_VC.xib */; };
        132C40292C816003002E3270 /* SourceHanSerifCN-Medium.otf in Resources */ = {isa = PBXBuildFile; fileRef = 132C40282C816002002E3270 /* SourceHanSerifCN-Medium.otf */; };
        132C7EF12C8FE3B900A4CA18 /* ChooseOptTitleView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 132C7EF02C8FE3B900A4CA18 /* ChooseOptTitleView.swift */; };
        132C7EF32C8FE3BF00A4CA18 /* ChooseOptTitleView.xib in Resources */ = {isa = PBXBuildFile; fileRef = 132C7EF22C8FE3BF00A4CA18 /* ChooseOptTitleView.xib */; };
        132C7EF72C8FE9BB00A4CA18 /* ChooseOptTitleTCell.xib in Resources */ = {isa = PBXBuildFile; fileRef = 132C7EF62C8FE9BB00A4CA18 /* ChooseOptTitleTCell.xib */; };
        132C7EF82C8FE9BB00A4CA18 /* ChooseOptTitleTCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 132C7EF52C8FE9BB00A4CA18 /* ChooseOptTitleTCell.swift */; };
        132DB8FE2C74826D00EF33A7 /* SettingVC.swift in Sources */ = {isa = PBXBuildFile; fileRef = 132DB8FC2C74826D00EF33A7 /* SettingVC.swift */; };
        132DB8FF2C74826D00EF33A7 /* SettingVC.xib in Resources */ = {isa = PBXBuildFile; fileRef = 132DB8FD2C74826D00EF33A7 /* SettingVC.xib */; };
        132EB01C2C6B32B200990429 /* RegisterVC.swift in Sources */ = {isa = PBXBuildFile; fileRef = 132EB01A2C6B32B200990429 /* RegisterVC.swift */; };
@@ -250,6 +254,8 @@
        13F24E422C758DF100D2BA90 /* LogoutAccountVC.swift in Sources */ = {isa = PBXBuildFile; fileRef = 13F24E3F2C758DF100D2BA90 /* LogoutAccountVC.swift */; };
        13F24E452C75901600D2BA90 /* CommonAlertView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 13F24E432C75901500D2BA90 /* CommonAlertView.swift */; };
        13F24E462C75901600D2BA90 /* CommonAlertView.xib in Resources */ = {isa = PBXBuildFile; fileRef = 13F24E442C75901600D2BA90 /* CommonAlertView.xib */; };
        13FAD54E2C901D6300566998 /* SearchContentVC.xib in Resources */ = {isa = PBXBuildFile; fileRef = 13FAD54D2C901D6300566998 /* SearchContentVC.xib */; };
        13FAD54F2C901D6300566998 /* SearchContentVC.swift in Sources */ = {isa = PBXBuildFile; fileRef = 13FAD54C2C901D6300566998 /* SearchContentVC.swift */; };
        13FB6D7D2C6EE27100A0685D /* CourseOfficialItemCCell.xib in Resources */ = {isa = PBXBuildFile; fileRef = 13FB6D7C2C6EE27100A0685D /* CourseOfficialItemCCell.xib */; };
        13FB6D7E2C6EE27100A0685D /* CourseOfficialItemCCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 13FB6D7B2C6EE27100A0685D /* CourseOfficialItemCCell.swift */; };
        13FB6D802C6EED6000A0685D /* CourseMenuVC.swift in Sources */ = {isa = PBXBuildFile; fileRef = 13FB6D7F2C6EED6000A0685D /* CourseMenuVC.swift */; };
@@ -309,6 +315,10 @@
        1327C6802C81D107005DA44B /* PlanGuide_3_VC.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PlanGuide_3_VC.swift; sourceTree = "<group>"; };
        1327C6812C81D107005DA44B /* PlanGuide_3_VC.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = PlanGuide_3_VC.xib; sourceTree = "<group>"; };
        132C40282C816002002E3270 /* SourceHanSerifCN-Medium.otf */ = {isa = PBXFileReference; lastKnownFileType = file; path = "SourceHanSerifCN-Medium.otf"; sourceTree = "<group>"; };
        132C7EF02C8FE3B900A4CA18 /* ChooseOptTitleView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ChooseOptTitleView.swift; sourceTree = "<group>"; };
        132C7EF22C8FE3BF00A4CA18 /* ChooseOptTitleView.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = ChooseOptTitleView.xib; sourceTree = "<group>"; };
        132C7EF52C8FE9BB00A4CA18 /* ChooseOptTitleTCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ChooseOptTitleTCell.swift; sourceTree = "<group>"; };
        132C7EF62C8FE9BB00A4CA18 /* ChooseOptTitleTCell.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = ChooseOptTitleTCell.xib; sourceTree = "<group>"; };
        132DB8FC2C74826D00EF33A7 /* SettingVC.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SettingVC.swift; sourceTree = "<group>"; };
        132DB8FD2C74826D00EF33A7 /* SettingVC.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = SettingVC.xib; sourceTree = "<group>"; };
        132EB01A2C6B32B200990429 /* RegisterVC.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RegisterVC.swift; sourceTree = "<group>"; };
@@ -511,6 +521,8 @@
        13F24E402C758DF100D2BA90 /* LogoutAccountVC.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = LogoutAccountVC.xib; sourceTree = "<group>"; };
        13F24E432C75901500D2BA90 /* CommonAlertView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = CommonAlertView.swift; sourceTree = "<group>"; };
        13F24E442C75901600D2BA90 /* CommonAlertView.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = CommonAlertView.xib; sourceTree = "<group>"; };
        13FAD54C2C901D6300566998 /* SearchContentVC.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SearchContentVC.swift; sourceTree = "<group>"; };
        13FAD54D2C901D6300566998 /* SearchContentVC.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = SearchContentVC.xib; sourceTree = "<group>"; };
        13FB6D7B2C6EE27100A0685D /* CourseOfficialItemCCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CourseOfficialItemCCell.swift; sourceTree = "<group>"; };
        13FB6D7C2C6EE27100A0685D /* CourseOfficialItemCCell.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = CourseOfficialItemCCell.xib; sourceTree = "<group>"; };
        13FB6D7F2C6EED6000A0685D /* CourseMenuVC.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CourseMenuVC.swift; sourceTree = "<group>"; };
@@ -615,6 +627,15 @@
                137ECACE2C78268B00C338BE /* LoginTreatyVC.xib */,
            );
            path = VC;
            sourceTree = "<group>";
        };
        132C7EF42C8FE9A800A4CA18 /* TCell */ = {
            isa = PBXGroup;
            children = (
                132C7EF52C8FE9BB00A4CA18 /* ChooseOptTitleTCell.swift */,
                132C7EF62C8FE9BB00A4CA18 /* ChooseOptTitleTCell.xib */,
            );
            path = TCell;
            sourceTree = "<group>";
        };
        13334FD82C73219A00914086 /* CCell */ = {
@@ -760,6 +781,8 @@
                13EFCDC02C6DD27A00B51AE6 /* PaymentOrderVC.xib */,
                130913E82C6DE33200418201 /* PaymentOrderResultVC.swift */,
                130913E92C6DE33200418201 /* PaymentOrderResultVC.xib */,
                13FAD54C2C901D6300566998 /* SearchContentVC.swift */,
                13FAD54D2C901D6300566998 /* SearchContentVC.xib */,
            );
            path = VC;
            sourceTree = "<group>";
@@ -767,6 +790,7 @@
        137ABE362C6B6636003A91C5 /* Other */ = {
            isa = PBXGroup;
            children = (
                132C7EF42C8FE9A800A4CA18 /* TCell */,
                13D256B52C6C68EB006FC2D7 /* View */,
                137ABE372C6B6641003A91C5 /* WebVC.swift */,
            );
@@ -1092,6 +1116,8 @@
                1377B4122C6DAA2000CF7CA5 /* ChooseOptView.xib */,
                13334FD42C731C1B00914086 /* VideoView.swift */,
                13EA70002C75F880005DF280 /* IdCardView.swift */,
                132C7EF02C8FE3B900A4CA18 /* ChooseOptTitleView.swift */,
                132C7EF22C8FE3BF00A4CA18 /* ChooseOptTitleView.xib */,
            );
            path = View;
            sourceTree = "<group>";
@@ -1247,6 +1273,7 @@
                13C5838C2C86A4770071BCBE /* apngb-animated-level-4.png in Resources */,
                130913EE2C6DE67E00418201 /* HomeRelaxBanner_2_1_CCell.xib in Resources */,
                13CBCCE02C74793D00C67701 /* NoticeCenterSysDetailVC.xib in Resources */,
                132C7EF32C8FE3BF00A4CA18 /* ChooseOptTitleView.xib in Resources */,
                130ED7E82C6AEF5900D0736E /* Home_Style_4_TCell.xib in Resources */,
                13649F9A2C7709CD00F4E0EE /* ContactCustomerTCell.xib in Resources */,
                13391E022C73334000B9513F /* PavilionDetailVC.xib in Resources */,
@@ -1283,11 +1310,13 @@
                139466482C6B8E0200F6FB15 /* UpdatePhoneVC.xib in Resources */,
                134A453A2C6E167D00538D78 /* CourseOfficalCommendTopCCell.xib in Resources */,
                13BA27132C81B6DD006D4CD1 /* SourceHanSerifCN-Light.otf in Resources */,
                132C7EF72C8FE9BB00A4CA18 /* ChooseOptTitleTCell.xib in Resources */,
                13C9DDD82C8EE8EB0008946B /* apngb-animated-level-10.png in Resources */,
                13271D852C75EF8200DE1328 /* AddBankInfoVC.xib in Resources */,
                1377B40D2C6D936A00CF7CA5 /* CommentUserInputContentTCell.xib in Resources */,
                137175CC2C6C412A00B38EF1 /* BackgroundVoiceVC.xib in Resources */,
                13BF65EB2C804BE100E20F0E /* apngb-animated-flow.png in Resources */,
                13FAD54E2C901D6300566998 /* SearchContentVC.xib in Resources */,
                137776932C6AFE69004FF994 /* SearchVC.xib in Resources */,
                132DB8FF2C74826D00EF33A7 /* SettingVC.xib in Resources */,
                13985DBF2C69DDF90046B6DC /* HomeTopMenuView.xib in Resources */,
@@ -1426,6 +1455,7 @@
                13A379FD2C75B7280038D5C8 /* BindAccountVC.swift in Sources */,
                135C2A6A2C7F033300CC2A67 /* CLPlayerContentPanelHeadView.swift in Sources */,
                130C07132C76DA0500ADB098 /* SpendingDetailContentTCell.swift in Sources */,
                132C7EF12C8FE3B900A4CA18 /* ChooseOptTitleView.swift in Sources */,
                13BF65DC2C80407600E20F0E /* PlanGuideVC.swift in Sources */,
                1385E0022C6C4F1200AADB1F /* Services.swift in Sources */,
                13FB6D8A2C6EFB4D00A0685D /* CourseDetailHeaderView.swift in Sources */,
@@ -1434,6 +1464,7 @@
                130AA4A92C72F71700F20944 /* CourseDetialVideoVC.swift in Sources */,
                1336EFA52C6DEB550075E070 /* HoverHeaderFlowLayout.swift in Sources */,
                13985DB52C69B7DF0046B6DC /* Def.swift in Sources */,
                132C7EF82C8FE9BB00A4CA18 /* ChooseOptTitleTCell.swift in Sources */,
                135C2A732C7F033300CC2A67 /* CLPlayerConfigure.swift in Sources */,
                136C7C812C771CF3004540CD /* PayMusicVC.swift in Sources */,
                130F94662C7DAB27003A348B /* SearchHistoryCCell.swift in Sources */,
@@ -1450,6 +1481,7 @@
                13985DCE2C69EA160046B6DC /* MeVC.swift in Sources */,
                13A0A8AA2C74740800DF08B6 /* NoticeCenterVC.swift in Sources */,
                13985DCC2C69E9FA0046B6DC /* PavilionVC.swift in Sources */,
                13FAD54F2C901D6300566998 /* SearchContentVC.swift in Sources */,
                138F0C322C7594BB0072A16C /* TreatyVC.swift in Sources */,
                139F1F602C81AE840055CE8F /* PlanGuidePromptView.swift in Sources */,
                13985DC42C69E0BF0046B6DC /* HomeTopMenuCCell.swift in Sources */,
XQMuse/Config/Enums/Enums.swift
@@ -8,6 +8,11 @@
import Foundation
import HandyJSON
enum PlayMode:Int,Decodable,Encodable{
                case singleLoop = 0 //单曲
                case line = 1 //顺序播放
}
enum GenderType:Int,HandyJSONEnum{
                case none = 0
                case  man = 1
@@ -24,3 +29,16 @@
                case vipFree = 2 //会员免费
                case payment = 3 // 需支付
}
enum ConditionType:Int,HandyJSONEnum{
                case yes = 1
                case no = 2
                mutating func troggle(){
                                if self == .no{
                                                self = .yes
                                }else{
                                                self = .no
                                }
                }
}
XQMuse/Root/.DS_Store
Binary files differ
XQMuse/Root/Home/CCell/HomeRelaxBanner_2_CCell.xib
@@ -23,7 +23,7 @@
                        <rect key="frame" x="0.0" y="236" width="178" height="65"/>
                        <subviews>
                            <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="--" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="byc-Ar-sJL">
                                <rect key="frame" x="20" y="17" width="10" height="10.666666666666664"/>
                                <rect key="frame" x="20" y="17" width="148" height="10.666666666666664"/>
                                <constraints>
                                    <constraint firstAttribute="height" constant="10.57" id="ZW4-0S-dSX"/>
                                </constraints>
@@ -56,6 +56,7 @@
                            </label>
                        </subviews>
                        <constraints>
                            <constraint firstAttribute="trailing" secondItem="byc-Ar-sJL" secondAttribute="trailing" constant="10" id="EH6-Eg-tdl"/>
                            <constraint firstItem="JaY-19-IAL" firstAttribute="centerY" secondItem="z5u-My-91l" secondAttribute="centerY" id="GM9-nN-Cds"/>
                            <constraint firstItem="byc-Ar-sJL" firstAttribute="top" secondItem="Fb9-IV-vVk" secondAttribute="top" constant="17" id="LaZ-g6-4n6"/>
                            <constraint firstAttribute="trailing" secondItem="JaY-19-IAL" secondAttribute="trailing" constant="23" id="NHd-om-jRN"/>
XQMuse/Root/Home/TCell/Home_Style_3_TCell.swift
@@ -49,7 +49,14 @@
                func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) {
                                let m = meditationModels[indexPath.row]
                                if m.chargeType == .payment{
                                if m.chargeType == .free{
                                                let vc = HomeItemDetailVC(id: m.id)
                                                JQ_currentViewController().jq_push(vc: vc)
                                                return
                                }
                                if m.chargeType == .payment && m.paidStatus == .no{
                                                let vc = PaymentOrderVC()
                                                JQ_currentViewController().jq_push(vc: vc)
                                                return
@@ -60,9 +67,6 @@
                                                JQ_currentViewController().jq_push(vc: vc)
                                                return
                                }
                                let vc = HomeItemDetailVC(id: m.id)
                                JQ_currentViewController().jq_push(vc: vc)
                }
}
XQMuse/Root/Home/TCell/SearchHotTCell.swift
@@ -9,7 +9,9 @@
class SearchHotTCell: UITableViewCell {
    override func awakeFromNib() {
                @IBOutlet weak var label_num: UILabel!
                @IBOutlet weak var label_content: UILabel!
                override func awakeFromNib() {
        super.awakeFromNib()
        
    }
XQMuse/Root/Home/TCell/SearchHotTCell.xib
@@ -67,6 +67,10 @@
                </constraints>
            </tableViewCellContentView>
            <viewLayoutGuide key="safeArea" id="njF-e1-oar"/>
            <connections>
                <outlet property="label_content" destination="UpH-Iv-KQc" id="Jpf-wQ-gPH"/>
                <outlet property="label_num" destination="7ay-L2-VLv" id="MRu-ud-S9V"/>
            </connections>
            <point key="canvasLocation" x="138.93129770992365" y="20.422535211267608"/>
        </tableViewCell>
    </objects>
XQMuse/Root/Home/VC/CommentListVC.swift
@@ -8,6 +8,17 @@
import UIKit
import QMUIKit
import JQTools
import RxSwift
import RxRelay
class CommentListViewModel:RefreshInnerModel<CommentModel>{
                let id = BehaviorRelay<Int>(value: 0)
                override func api() -> (Observable<BaseResponse<BaseResponseList<CommentModel>>>)? {
                                return Services.getMeditationQuestion(id: id.value, page: page, pageSize: 20)
                }
}
class CommentListVC: BaseVC {
@@ -16,7 +27,9 @@
                @IBOutlet weak var label_questionNum: UILabel!
                @IBOutlet weak var tableView: UITableView!
                @IBOutlet weak var cons_height: NSLayoutConstraint!
                private var viewModel = CommentListViewModel()
    override func viewDidLoad() {
        super.viewDidLoad()
                                view.backgroundColor = .clear
@@ -31,6 +44,13 @@
                                cons_height.constant = JQ_ScreenH - 151 - JQ_NavBarHeight - UIDevice.jq_safeEdges.top - UIDevice.jq_safeEdges.bottom
                                tableView.register(CommentCommentHeaderView.self, forHeaderFooterViewReuseIdentifier: "_header")
                                tableView.register(CommentReplyTCell.self, forCellReuseIdentifier: "_CommentReplyTCell")
                                viewModel.configure(tableView)
                                viewModel.beginRefresh()
                                viewModel.dataSource.subscribe(onNext: {[unowned self]data in
                                                self.label_questionNum.text = "\(data?.total ?? 0)条提问"
                                }).disposed(by: disposeBag)
    }
                override func viewDidLayoutSubviews() {
@@ -51,8 +71,18 @@
                                                // 当长按开始时,你可以获取到 cell 的信息
                                                if let headerView = gesture.view as? CommentCommentHeaderView {
                                                                let index = headerView.tag - 1000
                                                                ChooseOptView.show(titles: ["举报提问","拉入黑名单"]) { _ in
                                                                let model = viewModel.dataSource.value!.list[index]
                                                                ChooseOptView.show(titles: ["举报提问","拉入黑名单"]) { v in
                                                                                if v == 0{
                                                                                                ChooseOptTitleView.show(title: "举报提问", contents: ["举报提问","违法违规","色情低俗","低差广告","不友善、引战","诱导关注点赞","网络暴力","其他"]) { text in
                                                                                                                Services.meditationReport(id: model.id, reason: text).subscribe(onNext: {_ in
                                                                                                                                alertSuccess(msg: "举报成功")
                                                                                                                }).disposed(by: self.disposeBag)
                                                                                                }
                                                                                }else{
                                                                                                //todo
                                                                                }
                                                                }
                                                }
                                }
@@ -70,6 +100,8 @@
                                                longPress.minimumPressDuration = 0.5
                                                headerView.addGestureRecognizer(longPress)
                                }
                                let v = viewModel.dataSource.value!.list[section]
                                headerView.setCommentModel(v)
                                return headerView
                }
@@ -87,18 +119,23 @@
                }
                func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
                                var cell = tableView.dequeueReusableCell(withIdentifier: "_CommentReplyTCell", for: indexPath) as? CommentReplyTCell
                                cell?.setText(text: "助力13亿女性及其家庭生命蜕变,幸福重生的伟大愿景。助力13亿女性及其家庭生命蜕变,幸福重生的伟大愿景。助力13亿女性及其家庭生命蜕变,幸福重生的伟大愿景。助力13亿女性及其家庭生命蜕变,幸福重生的伟大愿景。助力13亿女性及其家庭生命蜕变,幸福重生的伟大愿景。助力13亿女性及其家庭生命蜕变,幸福重生的伟大愿景。助力13亿女性及其家庭生命蜕变,幸福重生的伟大愿景。助力13亿女性及其家庭生命蜕变,幸福重生的伟大愿景。助力13亿女性及其家庭生命蜕变,幸福重生的伟大愿景。助力13亿女性及其家庭生命蜕变,幸福重生的伟大愿景。")
                                let cell = tableView.dequeueReusableCell(withIdentifier: "_CommentReplyTCell", for: indexPath) as? CommentReplyTCell
                                let v = viewModel.dataSource.value?.list[indexPath.row]
                                cell?.setText(text: v?.replyContent ?? "")
                                return cell!
                }
                func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
                                return 1
                                let v = viewModel.dataSource.value?.list[section]
                                if v!.replyContent.isEmpty{
                                                return 0
                                }else{
                                                return 1
                                }
                }
                func numberOfSections(in tableView: UITableView) -> Int {
                                return 2
                                return viewModel.dataSource.value?.list.count ?? 0
                }
}
XQMuse/Root/Home/VC/HomeItemDetailVC.swift
@@ -21,15 +21,18 @@
                @IBOutlet weak var label_countdown: UILabel!
                @IBOutlet weak var view_playState: UIView!
                @IBOutlet weak var label_playState: UILabel!
                @IBOutlet weak var btn_playMode: UIButton!
                
                private var collect_bitem:UIBarButtonItem!
                private var id:Int!
                private var settingViewModel = UserDefaultSettingViewModel.getSetting()
                private var model:MeditationModel?{
                                didSet{
                                                if let m = model{
                                                                label_title.text = m.meditationTitle
                                                                label_subtitle.text = m.detailDescription
                                                                label_commentNum.text = "\(m.questionCount)"
                                                }
                                }
                }
@@ -38,14 +41,16 @@
                                super.init(nibName: nil, bundle: nil)
                                self.id = id
                }
                required init?(coder: NSCoder) {
                                fatalError("init(coder:) has not been implemented")
                }
    override func viewDidLoad() {
        super.viewDidLoad()
                override func viewDidLoad() {
                                super.viewDidLoad()
                                title = "心泉·疗愈"
                                btn_playMode.isSelected = settingViewModel?.playModel == .singleLoop
                                if AudioPlayer.getSharedInstance().times.value != nil{
                                                startMiniRunloop()
@@ -55,9 +60,10 @@
                                Services.getMeditationDetail(id: id).subscribe(onNext: {data in
                                                self.model = data.data
                                                self.collect_bitem.image = data.data?.favorite == 1 ? UIImage(named: "btn_collect"):UIImage(named: "btn_collect_1_s")
                                                self.collect_bitem.image = data.data?.favorite == .yes ? UIImage(named: "btn_collect_s"):UIImage(named: "btn_collect_1")
                                                self.collect_bitem.tintColor = data.data?.favorite == .yes ? UIColor(hexString: "fe5b60"):.white
                                }).disposed(by: disposeBag)
    }
                }
                override func viewDidAppear(_ animated: Bool) {
                                super.viewDidAppear(animated)
@@ -73,7 +79,7 @@
                override func setUI() {
                                view_playState.isHidden = true
                                view_playState.alpha = 0
                                collect_bitem = UIBarButtonItem(image: UIImage(named: "btn_collect"), style: .plain, target: self, action: #selector(collectionAction))
                                collect_bitem.tintColor = .white
                                let share_bitem = UIBarButtonItem(image: UIImage(named: "btn_share"), style: .plain, target: self, action: #selector(shareAction))
@@ -143,27 +149,27 @@
                                                guard let weakSelf = self else { return }
                                                AudioPlayer.getSharedInstance().setTimer(times: times * 60)
//                                                if times <= 0{
//                                                                weakSelf.timer = nil
//                                                                weakSelf.times = -1
//                                                                weakSelf.endMiniRunloop()
//                                                                return
//                                                }
//
//                                                weakSelf.times = times * 60
//                                                if weakSelf.timer == nil{
//                                                                weakSelf.timer = Timer(timeInterval: 1, repeats: true, block: { timer in
//
//                                                                                weakSelf.times -= 1
//
//                                                                                if weakSelf.times <= 0{
//                                                                                                //todo
//                                                                                }
//                                                                })
//                                                                weakSelf.timer?.fire()
//                                                                RunLoop.current.add(weakSelf.timer!, forMode: .default)
//                                                                weakSelf.startMiniRunloop()
//                                                }
                                                //                                                if times <= 0{
                                                //                                                                weakSelf.timer = nil
                                                //                                                                weakSelf.times = -1
                                                //                                                                weakSelf.endMiniRunloop()
                                                //                                                                return
                                                //                                                }
                                                //
                                                //                                                weakSelf.times = times * 60
                                                //                                                if weakSelf.timer == nil{
                                                //                                                                weakSelf.timer = Timer(timeInterval: 1, repeats: true, block: { timer in
                                                //
                                                //                                                                                weakSelf.times -= 1
                                                //
                                                //                                                                                if weakSelf.times <= 0{
                                                //                                                                                                //todo
                                                //                                                                                }
                                                //                                                                })
                                                //                                                                weakSelf.timer?.fire()
                                                //                                                                RunLoop.current.add(weakSelf.timer!, forMode: .default)
                                                //                                                                weakSelf.startMiniRunloop()
                                                //                                                }
                                }
                }
@@ -177,9 +183,21 @@
                }
                @IBAction func playWayAction(_ sender: UIButton) {
                @IBAction func playWayAction(_ sender: UIButton) {
                                UIView.animate(withDuration: 0.5) {
                                                self.view_playState.alpha = 1
                                }
                                UIView.animate(withDuration: 0.5, delay: 1.0) {
                                                self.view_playState.alpha = 0
                                }
                                sender.isSelected = !sender.isSelected
                                label_playState.text = sender.isSelected ? "当前播放模式已设置为单曲循环":"当前播放模式已设置为顺序播放"
                                settingViewModel?.playModel = sender.isSelected ? .singleLoop:.line
                                UserDefaultSettingViewModel.saveSetting(settingViewModel!)
                }
                @IBAction func settingAction(_ sender: UIButton) {
@@ -187,7 +205,18 @@
                }
                @objc func collectionAction(){
                                Services.meditationFavorite(id: id).subscribe(onNext: {data in
                                                self.model?.favorite.troggle()
                                                if self.model?.favorite == .yes{
                                                                alertSuccess(msg: "收藏成功")
                                                                self.collect_bitem.image = UIImage(named: "btn_collect_1_s")
                                                                self.collect_bitem.tintColor = UIColor(hexString: "fe5b60")
                                                }else{
                                                                alertSuccess(msg: "已取消收藏")
                                                                self.collect_bitem.image = UIImage(named: "btn_collect")
                                                                self.collect_bitem.tintColor = .white
                                                }
                                }).disposed(by: disposeBag)
                }
                @objc func shareAction(){
XQMuse/Root/Home/VC/HomeItemDetailVC.xib
@@ -11,6 +11,7 @@
        <placeholder placeholderIdentifier="IBFilesOwner" id="-1" userLabel="File's Owner" customClass="HomeItemDetailVC" customModule="XQMuse" customModuleProvider="target">
            <connections>
                <outlet property="btn_play" destination="Qgc-UW-rO1" id="MUw-JK-1pS"/>
                <outlet property="btn_playMode" destination="9t3-fS-clT" id="0me-mK-vhP"/>
                <outlet property="img_countdonw" destination="gxd-0O-eUD" id="rzB-8i-qOk"/>
                <outlet property="label_commentNum" destination="IkS-qR-riK" id="9zO-Xt-6XC"/>
                <outlet property="label_countdown" destination="akf-L4-aPE" id="goO-Gd-TLu"/>
@@ -84,6 +85,7 @@
                            <rect key="frame" x="62.666666666666664" y="121.33333333333337" width="22.666666666666664" height="22"/>
                            <inset key="imageEdgeInsets" minX="0.0" minY="0.0" maxX="2.2250738585072014e-308" maxY="0.0"/>
                            <state key="normal" image="btn_roll"/>
                            <state key="selected" image="btn_roll_loop"/>
                            <connections>
                                <action selector="playWayAction:" destination="-1" eventType="touchUpInside" id="3As-uo-vT5"/>
                            </connections>
@@ -248,6 +250,7 @@
        <image name="btn_comment" width="18.666666030883789" height="19"/>
        <image name="btn_list" width="17" height="13.666666984558105"/>
        <image name="btn_roll" width="22.666666030883789" height="19.666666030883789"/>
        <image name="btn_roll_loop" width="22.666666030883789" height="19.666666030883789"/>
        <image name="btn_time" width="20.666666030883789" height="20.666666030883789"/>
        <image name="demo_bg" width="621" height="1064"/>
        <image name="icon_play" width="46" height="46"/>
XQMuse/Root/Home/VC/SearchContentVC.swift
New file
@@ -0,0 +1,143 @@
//
//  SearchContentVC.swift
//  XQMuse
//
//  Created by 无故事王国 on 2024/9/10.
//
import UIKit
import JQTools
import RxDataSources
import RxRelay
import RxSwift
class SearchContentViewModel:RefreshInnerModel<MeditationModel>{
                var search = BehaviorRelay<String>(value: "")
                override func api() -> (Observable<BaseResponse<BaseResponseList<MeditationModel>>>)? {
                                return Services.search(text: search.value, page: page)
                }
}
class SearchContentVC: BaseVC {
                @IBOutlet weak var tf_search: UITextField!
                @IBOutlet weak var collectionView: UICollectionView!
                private var viewModel = SearchContentViewModel()
                init(content:String) {
                                super.init(nibName: nil, bundle: nil)
                                self.viewModel.search.accept(content)
                }
                required init?(coder: NSCoder) {
                                fatalError("init(coder:) has not been implemented")
                }
    override func viewDidLoad() {
        super.viewDidLoad()
                                title = "心泉·疗愈"
                                tf_search.text = viewModel.search.value
    }
                override func setUI() {
                                view.backgroundColor = UIColor(hexString: "f6f6f6")
                                tf_search.delegate = self
                                tf_search.returnKeyType = .search
                                collectionView.delegate = self
                                collectionView.dataSource = self
                                collectionView.backgroundColor = .clear
                                collectionView.contentInset = UIEdgeInsets(top: 0, left: 21, bottom: 0, right: 21)
                                collectionView.register(UINib(nibName: "HomeRelaxBanner_2_CCell", bundle: nil), forCellWithReuseIdentifier: "_HomeRelaxBanner_2_CCell")
                                collectionView.emptyDataSetView {[unowned self] v in
                                                let emptyImageView = UIImageView(image: UIImage(named: "bg_empty"))
                                                v.addSubview(emptyImageView)
                                                emptyImageView.snp.makeConstraints { make in
                                                                make.top.equalTo(56.5)
                                                                make.centerX.equalToSuperview().offset(-self.collectionView.contentInset.left)
                                                }
                                                let label = UILabel(text: "暂未找到相关内容哦~")
                                                label.font = .systemFont(ofSize: 12.74, weight: .medium)
                                                label.textColor = UIColor(hexString: "#5B5B5B")
                                                v.addSubview(label)
                                                label.snp.makeConstraints { make in
                                                                make.top.equalTo(emptyImageView.snp.bottom).offset(26.5)
                                                                make.centerX.equalTo(emptyImageView)
                                                }
                                }
                                viewModel.configure(collectionView)
                                viewModel.beginRefresh()
                }
                @IBAction func searchAction(_ sender: UIButton) {
                                tf_search.resignFirstResponder()
                                guard !(tf_search.text!.isEmpty) else {
                                                alert(msg: "请输入搜索内容");return
                                }
                                viewModel.search.accept(tf_search.text!)
                                viewModel.beginRefresh()
                }
}
extension SearchContentVC:UICollectionViewDelegate & UICollectionViewDataSource{
                func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) {
                                let vc = CourseDetialVC(courseSytle: .style1)
                                JQ_currentViewController().jq_push(vc: vc)
                }
                func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
                                let m = viewModel.dataSource.value!.list[indexPath.row]
                                let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "_HomeRelaxBanner_2_CCell", for: indexPath) as! HomeRelaxBanner_2_CCell
                                cell.backgroundColor = .jq_randomColor
                                cell.setMeditationModel(m)
                                return cell
                }
                func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
                                return viewModel.dataSource.value?.list.count ?? 0
                }
}
extension SearchContentVC:UICollectionViewDelegateFlowLayout{
                func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAt indexPath: IndexPath) -> CGSize {
                                let w = (JQ_ScreenW - 21 * 2 - 14) / 2
                                return CGSize(width: w, height: w * 1.314)
                }
                func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, minimumLineSpacingForSectionAt section: Int) -> CGFloat {
                                return 14
                }
                func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, minimumInteritemSpacingForSectionAt section: Int) -> CGFloat {
                                return 14
                }
}
extension SearchContentVC:UITextFieldDelegate{
                func textFieldShouldReturn(_ textField: UITextField) -> Bool {
                                textField.resignFirstResponder()
                                guard !(textField.text!.isEmpty) else {
                                                alert(msg: "请输入搜索内容")
                                                return true
                                }
                                viewModel.search.accept(textField.text!)
                                viewModel.beginRefresh()
                                return true
                }
}
XQMuse/Root/Home/VC/SearchContentVC.xib
New file
@@ -0,0 +1,99 @@
<?xml version="1.0" encoding="UTF-8"?>
<document type="com.apple.InterfaceBuilder3.CocoaTouch.XIB" version="3.0" toolsVersion="32700.99.1234" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" useTraitCollections="YES" useSafeAreas="YES" colorMatched="YES">
    <device id="retina6_12" orientation="portrait" appearance="light"/>
    <dependencies>
        <deployment identifier="iOS"/>
        <plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="22685"/>
        <capability name="Safe area layout guides" minToolsVersion="9.0"/>
        <capability name="System colors in document resources" minToolsVersion="11.0"/>
        <capability name="documents saved in the Xcode 8 format" minToolsVersion="8.0"/>
    </dependencies>
    <objects>
        <placeholder placeholderIdentifier="IBFilesOwner" id="-1" userLabel="File's Owner" customClass="SearchContentVC" customModule="XQMuse" customModuleProvider="target">
            <connections>
                <outlet property="collectionView" destination="7oq-G1-yRS" id="eDt-Jx-qae"/>
                <outlet property="tf_search" destination="1vI-K4-L0H" id="ZEF-UV-nDX"/>
                <outlet property="view" destination="i5M-Pr-FkT" id="sfx-zR-JGt"/>
            </connections>
        </placeholder>
        <placeholder placeholderIdentifier="IBFirstResponder" id="-2" customClass="UIResponder"/>
        <view clearsContextBeforeDrawing="NO" contentMode="scaleToFill" id="i5M-Pr-FkT">
            <rect key="frame" x="0.0" y="0.0" width="393" height="852"/>
            <autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
            <subviews>
                <view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="TC7-aj-qYG">
                    <rect key="frame" x="20" y="80.666666666666671" width="307.66666666666669" height="42.333333333333329"/>
                    <subviews>
                        <imageView clipsSubviews="YES" userInteractionEnabled="NO" contentMode="scaleAspectFit" horizontalHuggingPriority="251" verticalHuggingPriority="251" image="icon_search" translatesAutoresizingMaskIntoConstraints="NO" id="65c-rl-Iy6">
                            <rect key="frame" x="15.666666666666666" y="10" width="22.666666666666679" height="22"/>
                        </imageView>
                        <textField opaque="NO" contentMode="scaleToFill" horizontalHuggingPriority="248" contentHorizontalAlignment="left" contentVerticalAlignment="center" placeholder="请输入冥想搜索内容" minimumFontSize="17" translatesAutoresizingMaskIntoConstraints="NO" id="1vI-K4-L0H">
                            <rect key="frame" x="47.666666666666671" y="0.0" width="250.33333333333331" height="42.333333333333336"/>
                            <fontDescription key="fontDescription" type="system" pointSize="14"/>
                            <textInputTraits key="textInputTraits"/>
                        </textField>
                    </subviews>
                    <color key="backgroundColor" systemColor="systemBackgroundColor"/>
                    <constraints>
                        <constraint firstItem="65c-rl-Iy6" firstAttribute="centerY" secondItem="TC7-aj-qYG" secondAttribute="centerY" id="5Tb-l8-ZVe"/>
                        <constraint firstAttribute="bottom" secondItem="1vI-K4-L0H" secondAttribute="bottom" id="Cqp-qj-nis"/>
                        <constraint firstAttribute="trailing" secondItem="1vI-K4-L0H" secondAttribute="trailing" constant="9.5" id="b5o-wZ-ra4"/>
                        <constraint firstItem="1vI-K4-L0H" firstAttribute="leading" secondItem="65c-rl-Iy6" secondAttribute="trailing" constant="9.5" id="kkN-Dz-xQ4"/>
                        <constraint firstAttribute="height" constant="42.5" id="lOf-Xu-RML"/>
                        <constraint firstItem="1vI-K4-L0H" firstAttribute="top" secondItem="TC7-aj-qYG" secondAttribute="top" id="utl-dL-au5"/>
                        <constraint firstItem="65c-rl-Iy6" firstAttribute="leading" secondItem="TC7-aj-qYG" secondAttribute="leading" constant="15.5" id="wMx-8U-5Ns"/>
                    </constraints>
                    <userDefinedRuntimeAttributes>
                        <userDefinedRuntimeAttribute type="boolean" keyPath="ld_maskToBoundsXIB" value="YES"/>
                        <userDefinedRuntimeAttribute type="number" keyPath="ld_cornerRadiusXIB">
                            <real key="value" value="20.25"/>
                        </userDefinedRuntimeAttribute>
                    </userDefinedRuntimeAttributes>
                </view>
                <button opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="xCq-k6-78m">
                    <rect key="frame" x="327.66666666666669" y="80.666666666666671" width="65.333333333333314" height="42.333333333333329"/>
                    <fontDescription key="fontDescription" type="system" weight="medium" pointSize="17"/>
                    <inset key="imageEdgeInsets" minX="0.0" minY="0.0" maxX="2.2250738585072014e-308" maxY="0.0"/>
                    <state key="normal" title="搜索">
                        <color key="titleColor" red="0.15686274510000001" green="0.15686274510000001" blue="0.15686274510000001" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
                    </state>
                    <connections>
                        <action selector="searchAction:" destination="-1" eventType="touchUpInside" id="EBw-eF-G14"/>
                    </connections>
                </button>
                <collectionView clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="scaleToFill" dataMode="none" translatesAutoresizingMaskIntoConstraints="NO" id="7oq-G1-yRS">
                    <rect key="frame" x="0.0" y="149.66666666666669" width="393" height="668.33333333333326"/>
                    <color key="backgroundColor" systemColor="systemBackgroundColor"/>
                    <collectionViewFlowLayout key="collectionViewLayout" minimumLineSpacing="10" minimumInteritemSpacing="10" id="bHg-Zv-rHB">
                        <size key="itemSize" width="128" height="128"/>
                        <size key="headerReferenceSize" width="0.0" height="0.0"/>
                        <size key="footerReferenceSize" width="0.0" height="0.0"/>
                        <inset key="sectionInset" minX="0.0" minY="0.0" maxX="0.0" maxY="0.0"/>
                    </collectionViewFlowLayout>
                </collectionView>
            </subviews>
            <viewLayoutGuide key="safeArea" id="fnl-2z-Ty3"/>
            <color key="backgroundColor" systemColor="systemBackgroundColor"/>
            <constraints>
                <constraint firstItem="xCq-k6-78m" firstAttribute="top" secondItem="TC7-aj-qYG" secondAttribute="top" id="Fr5-xK-V5r"/>
                <constraint firstItem="TC7-aj-qYG" firstAttribute="leading" secondItem="fnl-2z-Ty3" secondAttribute="leading" constant="20" id="Kav-Pb-FgF"/>
                <constraint firstItem="7oq-G1-yRS" firstAttribute="top" secondItem="TC7-aj-qYG" secondAttribute="bottom" constant="26.5" id="Qrb-Jz-caW"/>
                <constraint firstItem="fnl-2z-Ty3" firstAttribute="trailing" secondItem="7oq-G1-yRS" secondAttribute="trailing" id="V9I-i9-ngR"/>
                <constraint firstItem="xCq-k6-78m" firstAttribute="leading" secondItem="TC7-aj-qYG" secondAttribute="trailing" id="g8q-KA-3nz"/>
                <constraint firstItem="xCq-k6-78m" firstAttribute="bottom" secondItem="TC7-aj-qYG" secondAttribute="bottom" id="hHi-iT-q8s"/>
                <constraint firstItem="TC7-aj-qYG" firstAttribute="top" secondItem="fnl-2z-Ty3" secondAttribute="top" constant="21.5" id="ky8-UL-y0F"/>
                <constraint firstItem="fnl-2z-Ty3" firstAttribute="trailing" secondItem="TC7-aj-qYG" secondAttribute="trailing" constant="65.5" id="p0x-hg-JiQ"/>
                <constraint firstItem="fnl-2z-Ty3" firstAttribute="bottom" secondItem="7oq-G1-yRS" secondAttribute="bottom" id="p44-5d-Mfu"/>
                <constraint firstItem="7oq-G1-yRS" firstAttribute="leading" secondItem="fnl-2z-Ty3" secondAttribute="leading" id="sf3-H6-QVJ"/>
                <constraint firstItem="fnl-2z-Ty3" firstAttribute="trailing" secondItem="xCq-k6-78m" secondAttribute="trailing" id="zZy-U5-6Uh"/>
            </constraints>
            <point key="canvasLocation" x="64.885496183206101" y="20.422535211267608"/>
        </view>
    </objects>
    <resources>
        <image name="icon_search" width="22.666666030883789" height="22"/>
        <systemColor name="systemBackgroundColor">
            <color white="1" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
        </systemColor>
    </resources>
</document>
XQMuse/Root/Home/VC/SearchVC.swift
@@ -58,13 +58,22 @@
                @IBOutlet weak var cacheSearchHei: NSLayoutConstraint!
                @IBOutlet weak var tf_search: UITextField!
                @IBOutlet weak var tableView: UITableView!
                private var hotWords = [String]()
                override func viewDidLoad() {
                                super.viewDidLoad()
                                title = "心泉·疗愈"
                                _ = SearchCache.readList()
                                cacheSearchCollectionView.reloadData()
                                Services.getHotWordList().subscribe(onNext: {data in
                                                if let m = data.data{
                                                                self.hotWords = m
                                                                self.tableView.reloadData()
                                                }
                                }).disposed(by: disposeBag)
                }
                override func viewDidDisappear(_ animated: Bool) {
@@ -90,6 +99,7 @@
                                tableView.delegate = self
                                tableView.dataSource = self
                                tableView.separatorStyle = .none
                                tableView.isScrollEnabled = false
                                tableView.backgroundColor = .clear
                                tableView.register(UINib(nibName: "SearchHotTCell", bundle: nil), forCellReuseIdentifier: "_SearchHotTCell")
@@ -128,19 +138,38 @@
                                tf_search.resignFirstResponder()
                                SearchCache.writeToList(tf_search.text!)
                                let vc = SearchContentVC(content: tf_search.text!)
                                jq_push(vc: vc)
                }
}
extension SearchVC:UITableViewDelegate & UITableViewDataSource{
                func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
                                tf_search.text = hotWords[indexPath.row]
                                searchDone()
                }
                func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
                                let cell = tableView.dequeueReusableCell(withIdentifier: "_SearchHotTCell", for: indexPath) as! SearchHotTCell
                                cell.selectionStyle = .none
                                cell.backgroundColor = .clear
                                cell.label_num.text = "\(indexPath.row + 1)"
                                cell.label_content.text = hotWords[indexPath.row]
                                if indexPath.row >= 3{
                                                cell.label_num.backgroundColor = UIColor(hexString: "#555555")
                                                cell.label_content.textColor = UIColor(hexString: "#555555")
                                }else{
                                                cell.label_num.backgroundColor = UIColor(hexString: "#0A4213")
                                                cell.label_content.textColor = UIColor(hexString: "#0A4213")
                                }
                                return cell
                }
                func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
                                return 10
                                return hotWords.count
                }
                func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat {
@@ -151,6 +180,7 @@
extension SearchVC:UICollectionViewDelegate & UICollectionViewDataSource{
                func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) {
                                tf_search.text = (SearchCache.array[indexPath.row] as! String)
                                searchDone()
                }
XQMuse/Root/Home/VC/SearchVC.xib
@@ -95,13 +95,13 @@
                    <nil key="highlightedColor"/>
                </label>
                <view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="U44-7x-wSJ">
                    <rect key="frame" x="19.666666666666657" y="283" width="354" height="385.66666666666674"/>
                    <rect key="frame" x="19.666666666666657" y="283" width="354" height="515"/>
                    <subviews>
                        <imageView clipsSubviews="YES" userInteractionEnabled="NO" contentMode="scaleAspectFit" horizontalHuggingPriority="251" verticalHuggingPriority="251" image="bg_search" translatesAutoresizingMaskIntoConstraints="NO" id="Qns-9x-Owv">
                            <rect key="frame" x="0.0" y="0.0" width="354" height="385.66666666666669"/>
                        </imageView>
                        <tableView clipsSubviews="YES" contentMode="scaleToFill" alwaysBounceVertical="YES" showsHorizontalScrollIndicator="NO" showsVerticalScrollIndicator="NO" style="plain" separatorStyle="default" rowHeight="-1" estimatedRowHeight="-1" sectionHeaderHeight="-1" estimatedSectionHeaderHeight="-1" sectionFooterHeight="-1" estimatedSectionFooterHeight="-1" translatesAutoresizingMaskIntoConstraints="NO" id="RTG-Tg-r7D">
                            <rect key="frame" x="0.0" y="6" width="354" height="379.66666666666669"/>
                            <rect key="frame" x="0.0" y="6" width="354" height="509"/>
                            <color key="backgroundColor" systemColor="systemBackgroundColor"/>
                        </tableView>
                    </subviews>
@@ -113,7 +113,6 @@
                        <constraint firstAttribute="trailing" secondItem="RTG-Tg-r7D" secondAttribute="trailing" id="bN1-d1-Ues"/>
                        <constraint firstItem="Qns-9x-Owv" firstAttribute="top" secondItem="U44-7x-wSJ" secondAttribute="top" id="erJ-wl-gvb"/>
                        <constraint firstAttribute="bottom" secondItem="RTG-Tg-r7D" secondAttribute="bottom" id="l5R-fz-JNz"/>
                        <constraint firstAttribute="bottom" secondItem="Qns-9x-Owv" secondAttribute="bottom" id="wy9-5e-vVw"/>
                    </constraints>
                </view>
            </subviews>
@@ -128,6 +127,7 @@
                <constraint firstItem="fnl-2z-Ty3" firstAttribute="trailing" secondItem="hyl-1O-IfF" secondAttribute="trailing" id="Ptl-ei-hEY"/>
                <constraint firstItem="gQh-cp-6ml" firstAttribute="leading" secondItem="fnl-2z-Ty3" secondAttribute="leading" constant="24" id="QZd-rd-DXq"/>
                <constraint firstItem="Mda-xm-ljU" firstAttribute="top" secondItem="hyl-1O-IfF" secondAttribute="bottom" constant="48.5" id="SCy-cH-7uy"/>
                <constraint firstItem="fnl-2z-Ty3" firstAttribute="bottom" secondItem="U44-7x-wSJ" secondAttribute="bottom" constant="20" id="Yrj-XQ-ekH"/>
                <constraint firstItem="Ccy-Na-ksY" firstAttribute="centerY" secondItem="FTy-4y-V0e" secondAttribute="centerY" id="a2C-eb-aBN"/>
                <constraint firstItem="FTy-4y-V0e" firstAttribute="leading" secondItem="fnl-2z-Ty3" secondAttribute="leading" constant="20" id="aTZ-aJ-hIR"/>
                <constraint firstItem="fnl-2z-Ty3" firstAttribute="trailing" secondItem="U44-7x-wSJ" secondAttribute="trailing" constant="19.5" id="cDo-xR-8Sc"/>
XQMuse/Root/Home/View/CommentCommentHeaderView.swift
@@ -82,6 +82,13 @@
                }
                func setCommentModel(_ model:CommentModel){
                                label_content.text = model.content
                                label_userName.text = model.nickname
                                btn_belike.isSelected = model.like == .yes
                                label_datetime.text = model.publishTime
                }
                required init?(coder: NSCoder) {
                                fatalError("init(coder:) has not been implemented")
                }
XQMuse/Root/Network/Models.swift
@@ -13,6 +13,7 @@
                var id = 0
                var volume:Double = 0.5
                var bgm:BGMModel?
                var playModel:PlayMode = .line
}
@@ -91,6 +92,7 @@
                var backgroundUrl: String = ""
                var cateId: Int = 0
                var chargeType:ChargeType = .free
                var paidStatus:ConditionType = .no
                var coverDescription: String = ""
                var coverUrl: String = ""
                var detailDescription: String = ""
@@ -98,6 +100,7 @@
                var generalPrice: Int = 0
                var iconUrl: String = ""
                var id: Int = 0
                var questionCount:Int = 0
                var iosPrice: Int = 0
                var listingStatus: Int = 0
                var meditationTitle: String = ""
@@ -106,7 +109,20 @@
                var sortNum: Int = 0
                var tutorAudioUrl: String = ""
                var virtualLearnedNum: Int = 0
                var favorite:Int = 0 // 是否收藏:1:是 2:否
                var favorite:ConditionType = .no // 是否收藏:1:是 2:否
}
struct CommentModel:HandyJSON{
                var appUserId: Int = 0
                var avatar: String = ""
                var content: String = ""
                var id: Int = 0
                var like: ConditionType = .no //是否点赞 1=是 2=否
                var likeCount: Int = 0
                var nickname: String = ""
                var publishTime: String = ""
                var replyContent: String = ""
                var replyTime: String = ""
}
XQMuse/Root/Network/Services.swift
@@ -148,6 +148,56 @@
                                                .append(key: "apipost_id", value: "25c3e3d0b0e158")
                                return NetworkRequest.request(params: params, method: .get, progress: true)
                }
                /// 获取冥想音频提问列表-分页
                class func getMeditationQuestion(id:Int,page:Int,pageSize:Int = 20)->Observable<BaseResponse<BaseResponseList<CommentModel>>>{
                                let params = ParamsAppender.build(url: All_Url)
                                params.interface(url: "/meditation/client/meditation/home/getMeditationQuestionPage")
                                                .append(key: "id", value: id)
                                                .append(key: "pageCurr", value: page)
                                                .append(key: "pageSize", value: pageSize)
                                                .append(key: "apipost_id", value: "25c3e3d0b0e15b")
                                return NetworkRequest.request(params: params, method: .get, progress: false)
                }
                /// 举报提问
                class func meditationReport(id:Int,reason:String)->Observable<BaseResponse<SimpleModel>>{
                                let params = ParamsAppender.build(url: All_Url)
                                params.interface(url: "/meditation/client/meditation/home/report")
                                                .append(key: "id", value: id)
                                                .append(key: "reason", value: reason)
                                                .append(key: "apipost_id", value: "25c3e3d0b0e15e")
                                return NetworkRequest.request(params: params, method: .get, progress: true)
                }
                /// 收藏/取消收藏
                class func meditationFavorite(id:Int)->Observable<BaseResponse<SimpleModel>>{
                                let params = ParamsAppender.build(url: All_Url)
                                params.interface(url: "/meditation/client/meditation/home/favorite")
                                                .append(key: "id", value: id)
                                                .append(key: "apipost_id", value: "2aa4e14ab0e159")
                                return NetworkRequest.request(params: params, method: .get, progress: true)
                }
                /// 获取热词
                class func getHotWordList()->Observable<BaseResponse<[String]>>{
                                let params = ParamsAppender.build(url: All_Url)
                                params.interface(url: "/meditation/client/meditation/home/getHotWordList")
                                                .append(key: "apipost_id", value: "25c3e3d0b0e156")
                                return NetworkRequest.request(params: params, method: .get, progress: false)
                }
                ///
                class func search(text:String,page:Int,pageSize:Int = 20)->Observable<BaseResponse<BaseResponseList<MeditationModel>>>{
                                let params = ParamsAppender.build(url: All_Url)
                                params.interface(url: "/meditation/client/meditation/home/getHotWordList")
                                                .append(key: "condition", value: text)
                                                .append(key: "pageCurr", value: page)
                                                .append(key: "pageSize", value: pageSize)
                                                .append(key: "apipost_id", value: "25c3e3d0b0e160")
                                return NetworkRequest.request(params: params, method: .get, progress: false)
                }
}
extension Services{
XQMuse/Root/Other/TCell/ChooseOptTitleTCell.swift
New file
@@ -0,0 +1,18 @@
//
//  ChooseOptTitleTCell.swift
//  XQMuse
//
//  Created by 无故事王国 on 2024/9/10.
//
import UIKit
class ChooseOptTitleTCell: UITableViewCell {
                @IBOutlet weak var label_title: UILabel!
                @IBOutlet weak var img_choose: UIImageView!
                override func awakeFromNib() {
        super.awakeFromNib()
                                selectionStyle = .none
    }
}
XQMuse/Root/Other/TCell/ChooseOptTitleTCell.xib
New file
@@ -0,0 +1,48 @@
<?xml version="1.0" encoding="UTF-8"?>
<document type="com.apple.InterfaceBuilder3.CocoaTouch.XIB" version="3.0" toolsVersion="32700.99.1234" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" useTraitCollections="YES" useSafeAreas="YES" colorMatched="YES">
    <device id="retina6_12" orientation="portrait" appearance="light"/>
    <dependencies>
        <deployment identifier="iOS"/>
        <plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="22685"/>
        <capability name="Safe area layout guides" minToolsVersion="9.0"/>
        <capability name="documents saved in the Xcode 8 format" minToolsVersion="8.0"/>
    </dependencies>
    <objects>
        <placeholder placeholderIdentifier="IBFilesOwner" id="-1" userLabel="File's Owner"/>
        <placeholder placeholderIdentifier="IBFirstResponder" id="-2" customClass="UIResponder"/>
        <tableViewCell contentMode="scaleToFill" selectionStyle="default" indentationWidth="10" rowHeight="122" id="KGk-i7-Jjw" customClass="ChooseOptTitleTCell" customModule="XQMuse" customModuleProvider="target">
            <rect key="frame" x="0.0" y="0.0" width="475" height="122"/>
            <autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMaxY="YES"/>
            <tableViewCellContentView key="contentView" opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" tableViewCell="KGk-i7-Jjw" id="H2p-sc-9uM">
                <rect key="frame" x="0.0" y="0.0" width="475" height="122"/>
                <autoresizingMask key="autoresizingMask"/>
                <subviews>
                    <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="--" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="kRQ-2y-AFq">
                        <rect key="frame" x="26" y="51.333333333333336" width="15" height="19.333333333333336"/>
                        <fontDescription key="fontDescription" type="boldSystem" pointSize="16"/>
                        <color key="textColor" red="0.36078431372549019" green="0.36078431372549019" blue="0.36078431372549019" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
                        <nil key="highlightedColor"/>
                    </label>
                    <imageView clipsSubviews="YES" userInteractionEnabled="NO" contentMode="scaleAspectFit" horizontalHuggingPriority="251" verticalHuggingPriority="251" image="icon_choose_small" translatesAutoresizingMaskIntoConstraints="NO" id="JIn-WD-yqw">
                        <rect key="frame" x="433" y="53" width="15.666666666666686" height="16"/>
                    </imageView>
                </subviews>
                <constraints>
                    <constraint firstAttribute="trailing" secondItem="JIn-WD-yqw" secondAttribute="trailing" constant="26.5" id="Bcs-8I-z6w"/>
                    <constraint firstItem="kRQ-2y-AFq" firstAttribute="leading" secondItem="H2p-sc-9uM" secondAttribute="leading" constant="26" id="WQ3-SM-SVg"/>
                    <constraint firstItem="kRQ-2y-AFq" firstAttribute="centerY" secondItem="H2p-sc-9uM" secondAttribute="centerY" id="avX-O0-oQ1"/>
                    <constraint firstItem="JIn-WD-yqw" firstAttribute="centerY" secondItem="H2p-sc-9uM" secondAttribute="centerY" id="mwJ-rV-JA2"/>
                </constraints>
            </tableViewCellContentView>
            <viewLayoutGuide key="safeArea" id="njF-e1-oar"/>
            <connections>
                <outlet property="img_choose" destination="JIn-WD-yqw" id="Lmq-49-qe0"/>
                <outlet property="label_title" destination="kRQ-2y-AFq" id="SHS-eN-oT1"/>
            </connections>
            <point key="canvasLocation" x="183.96946564885496" y="47.887323943661976"/>
        </tableViewCell>
    </objects>
    <resources>
        <image name="icon_choose_small" width="15.666666984558105" height="15.666666984558105"/>
    </resources>
</document>
XQMuse/Root/Other/View/ChooseOptTitleView.swift
New file
@@ -0,0 +1,109 @@
//
//  ChooseOptTitleView.swift
//  XQMuse
//
//  Created by 无故事王国 on 2024/9/10.
//
import UIKit
import JQTools
class ChooseOptTitleView: UIView,JQNibView{
                @IBOutlet weak var label_title: UILabel!
                @IBOutlet weak var tableView: UITableView!
                @IBOutlet weak var view_container: UIView!
                @IBOutlet weak var cons_bottom: NSLayoutConstraint!
                @IBOutlet weak var cons_tableHei: NSLayoutConstraint!
                private var items = [String]()
                private var clouse:((String)->Void)!
                private var selectIndex:IndexPath?
                override func awakeFromNib() {
                                super.awakeFromNib()
                                cons_bottom.constant = -JQ_ScreenW
                                alpha = 0
                                cons_tableHei.constant = 0
                                backgroundColor = .clear
                                view_container.backgroundColor = .white.withAlphaComponent(0.9)
                                tableView.register(UINib(nibName: "ChooseOptTitleTCell", bundle: nil), forCellReuseIdentifier: "_ChooseOptTitleTCell")
                                tableView.delegate = self
                                tableView.dataSource = self
                                tableView.separatorStyle = .none
                                layoutIfNeeded()
                }
                static func show(title:String,contents:[String],clouse:@escaping (String)->Void){
                                let titleView = ChooseOptTitleView.jq_loadNibView()
                                titleView.label_title.text = title
                                titleView.items = contents
                                titleView.clouse = clouse
                                sceneDelegate?.window?.addSubview(titleView)
                                titleView.frame = sceneDelegate?.window?.frame ?? .zero
                                titleView.cons_bottom.constant = 0
                                titleView.alpha = 1
                                titleView.cons_tableHei.constant = Double(contents.count) * 61
                                UIView.animate(withDuration: 0.5) {
                                                titleView.layoutIfNeeded()
                                }
                }
                override func layoutSubviews() {
                                super.layoutSubviews()
                                view_container.jq_cornerPartWithShadow(byRoundingCorners: [.topLeft,.topRight], radii: 20)
                }
                @IBAction func cancelAction(_ sender: UIButton) {
                                hidden()
                }
                private func hidden(){
                                cons_bottom.constant = -JQ_ScreenW
                                cons_tableHei.constant = 0
                                UIView.animate(withDuration: 0.6) {
                                                self.alpha = 0
                                                self.layoutIfNeeded()
                                } completion: { _ in
                                                self.removeFromSuperview()
                                }
                }
}
extension ChooseOptTitleView:UITableViewDelegate{
                func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
                                selectIndex = indexPath
                                tableView.reloadData()
                                CommonAlertView.show(title: "提示", content: "确认举报该提问?") { state in
                                                if state{
                                                                self.clouse(self.items[indexPath.row])
                                                                self.hidden()
                                                }
                                }
                }
}
extension ChooseOptTitleView:UITableViewDataSource{
                func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
                                let cell = tableView.dequeueReusableCell(withIdentifier: "_ChooseOptTitleTCell") as! ChooseOptTitleTCell
                                cell.label_title.text = items[indexPath.row]
                                if indexPath == selectIndex{
                                                cell.label_title.textColor = UIColor(hexString: "#8AAE65")
                                                cell.img_choose.image = UIImage(named: "icon_choose_small_s")
                                }else{
                                                cell.label_title.textColor = UIColor(hexString: "#5C5C5C")
                                                cell.img_choose.image = UIImage(named: "icon_choose_small")
                                }
                                return cell
                }
                func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
                                return items.count
                }
                func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat {
                                return 61
                }
}
XQMuse/Root/Other/View/ChooseOptTitleView.xib
New file
@@ -0,0 +1,99 @@
<?xml version="1.0" encoding="UTF-8"?>
<document type="com.apple.InterfaceBuilder3.CocoaTouch.XIB" version="3.0" toolsVersion="32700.99.1234" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" useTraitCollections="YES" useSafeAreas="YES" colorMatched="YES">
    <device id="retina6_12" orientation="portrait" appearance="light"/>
    <dependencies>
        <deployment identifier="iOS"/>
        <plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="22685"/>
        <capability name="Safe area layout guides" minToolsVersion="9.0"/>
        <capability name="System colors in document resources" minToolsVersion="11.0"/>
        <capability name="documents saved in the Xcode 8 format" minToolsVersion="8.0"/>
    </dependencies>
    <objects>
        <placeholder placeholderIdentifier="IBFilesOwner" id="-1" userLabel="File's Owner"/>
        <placeholder placeholderIdentifier="IBFirstResponder" id="-2" customClass="UIResponder"/>
        <view contentMode="scaleToFill" id="iN0-l3-epB" customClass="ChooseOptTitleView" customModule="XQMuse" customModuleProvider="target">
            <rect key="frame" x="0.0" y="0.0" width="393" height="852"/>
            <autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
            <subviews>
                <view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="l0f-mg-47Y">
                    <rect key="frame" x="0.0" y="556" width="393" height="296"/>
                    <subviews>
                        <button opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="6Qs-h9-yKJ">
                            <rect key="frame" x="47.666666666666657" y="181" width="298" height="37"/>
                            <color key="backgroundColor" red="0.54117647058823526" green="0.68235294117647061" blue="0.396078431372549" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
                            <constraints>
                                <constraint firstAttribute="height" constant="37" id="jkI-m6-q8o"/>
                            </constraints>
                            <fontDescription key="fontDescription" type="system" weight="medium" pointSize="14"/>
                            <inset key="imageEdgeInsets" minX="0.0" minY="0.0" maxX="2.2250738585072014e-308" maxY="0.0"/>
                            <state key="normal" title="取消"/>
                            <userDefinedRuntimeAttributes>
                                <userDefinedRuntimeAttribute type="boolean" keyPath="ld_maskToBoundsXIB" value="YES"/>
                                <userDefinedRuntimeAttribute type="number" keyPath="ld_cornerRadiusXIB">
                                    <real key="value" value="18.5"/>
                                </userDefinedRuntimeAttribute>
                            </userDefinedRuntimeAttributes>
                            <connections>
                                <action selector="cancelAction:" destination="iN0-l3-epB" eventType="touchUpInside" id="wE8-zo-YiR"/>
                            </connections>
                        </button>
                        <tableView clipsSubviews="YES" contentMode="scaleToFill" alwaysBounceVertical="YES" style="plain" separatorStyle="default" rowHeight="-1" estimatedRowHeight="-1" sectionHeaderHeight="-1" estimatedSectionHeaderHeight="-1" sectionFooterHeight="-1" estimatedSectionFooterHeight="-1" translatesAutoresizingMaskIntoConstraints="NO" id="wFR-nY-ulZ">
                            <rect key="frame" x="0.0" y="79.666666666666629" width="393" height="100"/>
                            <color key="backgroundColor" systemColor="systemBackgroundColor"/>
                            <constraints>
                                <constraint firstAttribute="height" constant="100" id="MsJ-tq-IzW"/>
                            </constraints>
                        </tableView>
                        <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="标题" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="gY6-YR-rdt">
                            <rect key="frame" x="178" y="34" width="37" height="21.666666666666671"/>
                            <fontDescription key="fontDescription" type="boldSystem" pointSize="18"/>
                            <color key="textColor" red="0.2196078431372549" green="0.2196078431372549" blue="0.2196078431372549" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
                            <nil key="highlightedColor"/>
                        </label>
                        <view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="VKN-sY-6vr">
                            <rect key="frame" x="24.666666666666657" y="79" width="349.33333333333337" height="0.66666666666668561"/>
                            <color key="backgroundColor" red="0.81568627450980391" green="0.81568627450980391" blue="0.81568627450980391" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
                            <constraints>
                                <constraint firstAttribute="height" constant="0.5" id="oNn-qG-4N0"/>
                            </constraints>
                        </view>
                    </subviews>
                    <color key="backgroundColor" systemColor="systemBackgroundColor"/>
                    <constraints>
                        <constraint firstItem="VKN-sY-6vr" firstAttribute="top" secondItem="gY6-YR-rdt" secondAttribute="bottom" constant="23.5" id="21t-Qx-E40"/>
                        <constraint firstItem="6Qs-h9-yKJ" firstAttribute="leading" secondItem="l0f-mg-47Y" secondAttribute="leading" constant="47.5" id="9Rb-F8-Rqg"/>
                        <constraint firstItem="6Qs-h9-yKJ" firstAttribute="top" secondItem="wFR-nY-ulZ" secondAttribute="bottom" constant="1.5" id="EcH-uf-Dmb"/>
                        <constraint firstItem="gY6-YR-rdt" firstAttribute="centerX" secondItem="l0f-mg-47Y" secondAttribute="centerX" id="NtY-kc-c36"/>
                        <constraint firstItem="gY6-YR-rdt" firstAttribute="top" secondItem="l0f-mg-47Y" secondAttribute="top" constant="34" id="XbA-cX-hkF"/>
                        <constraint firstAttribute="bottomMargin" secondItem="6Qs-h9-yKJ" secondAttribute="bottom" constant="36" id="bI0-lX-IlS"/>
                        <constraint firstAttribute="trailing" secondItem="VKN-sY-6vr" secondAttribute="trailing" constant="19" id="fr6-ao-RvF"/>
                        <constraint firstItem="VKN-sY-6vr" firstAttribute="leading" secondItem="l0f-mg-47Y" secondAttribute="leading" constant="24.5" id="kjd-HW-bdk"/>
                        <constraint firstAttribute="trailing" secondItem="wFR-nY-ulZ" secondAttribute="trailing" id="let-K1-rjZ"/>
                        <constraint firstItem="wFR-nY-ulZ" firstAttribute="top" secondItem="VKN-sY-6vr" secondAttribute="bottom" id="pKV-lG-L89"/>
                        <constraint firstItem="wFR-nY-ulZ" firstAttribute="leading" secondItem="l0f-mg-47Y" secondAttribute="leading" id="vom-6C-Hkf"/>
                        <constraint firstAttribute="trailing" secondItem="6Qs-h9-yKJ" secondAttribute="trailing" constant="47.5" id="yxz-wD-Bu0"/>
                    </constraints>
                </view>
            </subviews>
            <viewLayoutGuide key="safeArea" id="vUN-kp-3ea"/>
            <constraints>
                <constraint firstItem="vUN-kp-3ea" firstAttribute="trailing" secondItem="l0f-mg-47Y" secondAttribute="trailing" id="YHj-ce-zNF"/>
                <constraint firstItem="l0f-mg-47Y" firstAttribute="leading" secondItem="vUN-kp-3ea" secondAttribute="leading" id="eqZ-1B-WLP"/>
                <constraint firstAttribute="bottom" secondItem="l0f-mg-47Y" secondAttribute="bottom" id="fUy-1u-siK"/>
            </constraints>
            <connections>
                <outlet property="cons_bottom" destination="fUy-1u-siK" id="I2Q-eV-85c"/>
                <outlet property="cons_tableHei" destination="MsJ-tq-IzW" id="q2u-Sg-vVP"/>
                <outlet property="label_title" destination="gY6-YR-rdt" id="uJ5-Bm-hh9"/>
                <outlet property="tableView" destination="wFR-nY-ulZ" id="CKW-gg-Z3d"/>
                <outlet property="view_container" destination="l0f-mg-47Y" id="QVf-Pr-IJz"/>
            </connections>
            <point key="canvasLocation" x="139.69465648854961" y="20.422535211267608"/>
        </view>
    </objects>
    <resources>
        <systemColor name="systemBackgroundColor">
            <color white="1" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
        </systemColor>
    </resources>
</document>
XQMuse/Root/Other/View/ChooseOptView.swift
@@ -64,12 +64,24 @@
}
extension ChooseOptView:UITableViewDelegate & UITableViewDataSource{
                func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
                                clouse(indexPath.row)
                                self.cons_bottom.constant = -JQ_ScreenW
                                UIView.animate(withDuration: 0.4) {
                                                self.alpha = 0
                                                self.layoutIfNeeded()
                                } completion: { _ in
                                                self.removeFromSuperview()
                                }
                }
                func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
                                return items.count
                }
                
                func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
                                var cell = tableView.dequeueReusableCell(withIdentifier: "_cell")
                                let cell = tableView.dequeueReusableCell(withIdentifier: "_cell")
                                cell!.textLabel?.font = UIFont.systemFont(ofSize: 15, weight: .medium)
                                cell!.textLabel?.textColor = UIColor(hexString: "#92A87D")
                                cell!.selectionStyle = .none
XQMuse/Root/PayMusicView/PayMusicVC.swift
@@ -304,7 +304,10 @@
                                                }
                                })
                                timer?.fire()
                                RunLoop.current.add(timer!, forMode: .default)
                                if let t = timer{
                                                RunLoop.current.add(t, forMode: .default)
                                }
                }
                func stopTimer(){
XQMuse/Root/TreeGroup/Pngs/apngb-animated-level-1.png

XQMuse/Root/TreeGroup/Pngs/apngb-animated-level-2.png

XQMuse/Root/TreeGroup/Pngs/apngb-animated-level-3.png

XQMuse/Root/TreeGroup/Pngs/apngb-animated-level-4.png

XQMuse/Root/TreeGroup/Pngs/apngb-animated-level-5.png