| | |
| | | 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 */; }; |
| | |
| | | 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 */; }; |
| | |
| | | 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>"; }; |
| | |
| | | 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>"; }; |
| | |
| | | 137ECACE2C78268B00C338BE /* LoginTreatyVC.xib */, |
| | | ); |
| | | path = VC; |
| | | sourceTree = "<group>"; |
| | | }; |
| | | 132C7EF42C8FE9A800A4CA18 /* TCell */ = { |
| | | isa = PBXGroup; |
| | | children = ( |
| | | 132C7EF52C8FE9BB00A4CA18 /* ChooseOptTitleTCell.swift */, |
| | | 132C7EF62C8FE9BB00A4CA18 /* ChooseOptTitleTCell.xib */, |
| | | ); |
| | | path = TCell; |
| | | sourceTree = "<group>"; |
| | | }; |
| | | 13334FD82C73219A00914086 /* CCell */ = { |
| | |
| | | 13EFCDC02C6DD27A00B51AE6 /* PaymentOrderVC.xib */, |
| | | 130913E82C6DE33200418201 /* PaymentOrderResultVC.swift */, |
| | | 130913E92C6DE33200418201 /* PaymentOrderResultVC.xib */, |
| | | 13FAD54C2C901D6300566998 /* SearchContentVC.swift */, |
| | | 13FAD54D2C901D6300566998 /* SearchContentVC.xib */, |
| | | ); |
| | | path = VC; |
| | | sourceTree = "<group>"; |
| | |
| | | 137ABE362C6B6636003A91C5 /* Other */ = { |
| | | isa = PBXGroup; |
| | | children = ( |
| | | 132C7EF42C8FE9A800A4CA18 /* TCell */, |
| | | 13D256B52C6C68EB006FC2D7 /* View */, |
| | | 137ABE372C6B6641003A91C5 /* WebVC.swift */, |
| | | ); |
| | |
| | | 1377B4122C6DAA2000CF7CA5 /* ChooseOptView.xib */, |
| | | 13334FD42C731C1B00914086 /* VideoView.swift */, |
| | | 13EA70002C75F880005DF280 /* IdCardView.swift */, |
| | | 132C7EF02C8FE3B900A4CA18 /* ChooseOptTitleView.swift */, |
| | | 132C7EF22C8FE3BF00A4CA18 /* ChooseOptTitleView.xib */, |
| | | ); |
| | | path = View; |
| | | sourceTree = "<group>"; |
| | |
| | | 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 */, |
| | |
| | | 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 */, |
| | |
| | | 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 */, |
| | |
| | | 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 */, |
| | |
| | | 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 */, |
| | |
| | | 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 |
| | |
| | | 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 |
| | | } |
| | | } |
| | | } |
| | |
| | | <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> |
| | |
| | | </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"/> |
| | |
| | | |
| | | 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 |
| | |
| | | JQ_currentViewController().jq_push(vc: vc) |
| | | return |
| | | } |
| | | |
| | | let vc = HomeItemDetailVC(id: m.id) |
| | | JQ_currentViewController().jq_push(vc: vc) |
| | | } |
| | | } |
| | | |
| | |
| | | |
| | | class SearchHotTCell: UITableViewCell { |
| | | |
| | | override func awakeFromNib() { |
| | | @IBOutlet weak var label_num: UILabel! |
| | | @IBOutlet weak var label_content: UILabel! |
| | | override func awakeFromNib() { |
| | | super.awakeFromNib() |
| | | |
| | | } |
| | |
| | | </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> |
| | |
| | | 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 { |
| | | |
| | |
| | | @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 |
| | |
| | | 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() { |
| | |
| | | // 当长按开始时,你可以获取到 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 |
| | | } |
| | | } |
| | | } |
| | | } |
| | |
| | | longPress.minimumPressDuration = 0.5 |
| | | headerView.addGestureRecognizer(longPress) |
| | | } |
| | | let v = viewModel.dataSource.value!.list[section] |
| | | headerView.setCommentModel(v) |
| | | |
| | | return headerView |
| | | } |
| | |
| | | } |
| | | |
| | | 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 |
| | | } |
| | | } |
| | | |
| | |
| | | @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)" |
| | | } |
| | | } |
| | | } |
| | |
| | | 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() |
| | |
| | | |
| | | 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) |
| | |
| | | |
| | | 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)) |
| | |
| | | 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() |
| | | // } |
| | | } |
| | | } |
| | | |
| | |
| | | |
| | | } |
| | | |
| | | |
| | | @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) { |
| | |
| | | } |
| | | |
| | | @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(){ |
| | |
| | | <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"/> |
| | |
| | | <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> |
| | |
| | | <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"/> |
New file |
| | |
| | | // |
| | | // 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 |
| | | } |
| | | } |
New file |
| | |
| | | <?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> |
| | |
| | | @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) { |
| | |
| | | tableView.delegate = self |
| | | tableView.dataSource = self |
| | | tableView.separatorStyle = .none |
| | | tableView.isScrollEnabled = false |
| | | tableView.backgroundColor = .clear |
| | | tableView.register(UINib(nibName: "SearchHotTCell", bundle: nil), forCellReuseIdentifier: "_SearchHotTCell") |
| | | |
| | |
| | | |
| | | 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 { |
| | |
| | | extension SearchVC:UICollectionViewDelegate & UICollectionViewDataSource{ |
| | | |
| | | func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) { |
| | | tf_search.text = (SearchCache.array[indexPath.row] as! String) |
| | | searchDone() |
| | | } |
| | | |
| | |
| | | <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> |
| | |
| | | <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> |
| | |
| | | <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"/> |
| | |
| | | |
| | | } |
| | | |
| | | 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") |
| | | } |
| | |
| | | var id = 0 |
| | | var volume:Double = 0.5 |
| | | var bgm:BGMModel? |
| | | var playModel:PlayMode = .line |
| | | } |
| | | |
| | | |
| | |
| | | var backgroundUrl: String = "" |
| | | var cateId: Int = 0 |
| | | var chargeType:ChargeType = .free |
| | | var paidStatus:ConditionType = .no |
| | | var coverDescription: String = "" |
| | | var coverUrl: String = "" |
| | | var detailDescription: String = "" |
| | |
| | | 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 = "" |
| | |
| | | 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 = "" |
| | | } |
| | | |
| | | |
| | |
| | | .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{ |
New file |
| | |
| | | // |
| | | // 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 |
| | | } |
| | | } |
New file |
| | |
| | | <?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> |
New file |
| | |
| | | // |
| | | // 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 |
| | | } |
| | | } |
New file |
| | |
| | | <?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> |
| | |
| | | } |
| | | |
| | | 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 |
| | |
| | | } |
| | | }) |
| | | timer?.fire() |
| | | RunLoop.current.add(timer!, forMode: .default) |
| | | |
| | | if let t = timer{ |
| | | RunLoop.current.add(t, forMode: .default) |
| | | } |
| | | } |
| | | |
| | | func stopTimer(){ |