From 5b7263b090874148a661ae02d5e4326f7b5c7522 Mon Sep 17 00:00:00 2001 From: chenguilong <598604202@qq.com> Date: Mon, 18 Jul 2022 19:02:48 +0800 Subject: [PATCH] =?UTF-8?q?=E9=A6=96=E9=A1=B5=E4=B8=AA=E6=92=AD=E9=A1=B5?= =?UTF-8?q?=E4=BA=8C=E7=BA=A7=E5=88=86=E7=B1=BBtab=E5=AE=8C=E6=88=90?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- xplan-ios.xcodeproj/project.pbxproj | 24 ++ .../Assets.xcassets/Home/Live/Contents.json | 6 + .../home_live_hot_bg.imageset/Contents.json | 22 ++ .../home_live_hot_bg@2x.png | Bin 0 -> 9343 bytes .../home_live_hot_bg@3x.png | Bin 0 -> 16104 bytes .../Contents.json | 22 ++ .../home_live_recommend_tag@2x.png | Bin 0 -> 947 bytes .../home_live_recommend_tag@3x.png | Bin 0 -> 1268 bytes .../Contents.json | 22 ++ .../home_live_record_bg@2x.png | Bin 0 -> 7759 bytes .../home_live_record_bg@3x.png | Bin 0 -> 15951 bytes .../Contents.json | 22 ++ .../home_live_record_icon@2x.png | Bin 0 -> 1193 bytes .../home_live_record_icon@3x.png | Bin 0 -> 1738 bytes xplan-ios/Main/Home/Api/Api+Home.h | 7 +- xplan-ios/Main/Home/Api/Api+Home.m | 11 +- .../Main/Home/Model/HomeLiveLookRecordModel.h | 21 ++ .../Main/Home/Model/HomeLiveLookRecordModel.m | 19 ++ .../Main/Home/Model/HomeRecommendRoomModel.h | 3 + .../Main/Home/Presenter/XPHomeLivePresenter.h | 7 + .../Main/Home/Presenter/XPHomeLivePresenter.m | 34 ++- .../Main/Home/Presenter/XPHomePresenter.m | 2 +- .../Main/Home/Protocol/XPHomeLiveProtocol.h | 10 +- .../Home/View/Cell/XPHomeLiveRecordCell.h | 19 ++ .../Home/View/Cell/XPHomeLiveRecordCell.m | 127 ++++++++++ .../Home/View/SubViews/XPHomeLiveHeadView.h | 34 +++ .../Home/View/SubViews/XPHomeLiveHeadView.m | 159 ++++++++++++ .../Home/View/XPHomeLivePageViewController.h | 22 ++ .../Home/View/XPHomeLivePageViewController.m | 196 +++++++++++++++ .../Home/View/XPHomeLivesViewController.m | 226 ++++++++++++------ 30 files changed, 936 insertions(+), 79 deletions(-) create mode 100644 xplan-ios/Assets.xcassets/Home/Live/Contents.json create mode 100644 xplan-ios/Assets.xcassets/Home/Live/home_live_hot_bg.imageset/Contents.json create mode 100644 xplan-ios/Assets.xcassets/Home/Live/home_live_hot_bg.imageset/home_live_hot_bg@2x.png create mode 100644 xplan-ios/Assets.xcassets/Home/Live/home_live_hot_bg.imageset/home_live_hot_bg@3x.png create mode 100644 xplan-ios/Assets.xcassets/Home/Live/home_live_recommend_tag.imageset/Contents.json create mode 100644 xplan-ios/Assets.xcassets/Home/Live/home_live_recommend_tag.imageset/home_live_recommend_tag@2x.png create mode 100644 xplan-ios/Assets.xcassets/Home/Live/home_live_recommend_tag.imageset/home_live_recommend_tag@3x.png create mode 100644 xplan-ios/Assets.xcassets/Home/Live/home_live_record_bg.imageset/Contents.json create mode 100644 xplan-ios/Assets.xcassets/Home/Live/home_live_record_bg.imageset/home_live_record_bg@2x.png create mode 100644 xplan-ios/Assets.xcassets/Home/Live/home_live_record_bg.imageset/home_live_record_bg@3x.png create mode 100644 xplan-ios/Assets.xcassets/Home/Live/home_live_record_icon.imageset/Contents.json create mode 100644 xplan-ios/Assets.xcassets/Home/Live/home_live_record_icon.imageset/home_live_record_icon@2x.png create mode 100644 xplan-ios/Assets.xcassets/Home/Live/home_live_record_icon.imageset/home_live_record_icon@3x.png create mode 100644 xplan-ios/Main/Home/Model/HomeLiveLookRecordModel.h create mode 100644 xplan-ios/Main/Home/Model/HomeLiveLookRecordModel.m create mode 100644 xplan-ios/Main/Home/View/Cell/XPHomeLiveRecordCell.h create mode 100644 xplan-ios/Main/Home/View/Cell/XPHomeLiveRecordCell.m create mode 100644 xplan-ios/Main/Home/View/SubViews/XPHomeLiveHeadView.h create mode 100644 xplan-ios/Main/Home/View/SubViews/XPHomeLiveHeadView.m create mode 100644 xplan-ios/Main/Home/View/XPHomeLivePageViewController.h create mode 100644 xplan-ios/Main/Home/View/XPHomeLivePageViewController.m diff --git a/xplan-ios.xcodeproj/project.pbxproj b/xplan-ios.xcodeproj/project.pbxproj index 19e8ba9e..d4be1b6a 100644 --- a/xplan-ios.xcodeproj/project.pbxproj +++ b/xplan-ios.xcodeproj/project.pbxproj @@ -155,6 +155,10 @@ 9B33E3CB27D85379003B0E62 /* UploadFile.m in Sources */ = {isa = PBXBuildFile; fileRef = 9B33E3C927D85379003B0E62 /* UploadFile.m */; }; 9B33E3CE27D8540C003B0E62 /* XPVoiceCardViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 9B33E3CD27D8540C003B0E62 /* XPVoiceCardViewController.m */; }; 9B33E3D427D8A1A4003B0E62 /* XPSkillCardPlayerManager.m in Sources */ = {isa = PBXBuildFile; fileRef = 9B33E3D327D8A1A4003B0E62 /* XPSkillCardPlayerManager.m */; }; + 9B39C88328850EFB00564D17 /* XPHomeLiveHeadView.m in Sources */ = {isa = PBXBuildFile; fileRef = 9B39C88228850EFA00564D17 /* XPHomeLiveHeadView.m */; }; + 9B39C8862885408C00564D17 /* HomeLiveLookRecordModel.m in Sources */ = {isa = PBXBuildFile; fileRef = 9B39C8852885408C00564D17 /* HomeLiveLookRecordModel.m */; }; + 9B39C88928854AB300564D17 /* XPHomeLiveRecordCell.m in Sources */ = {isa = PBXBuildFile; fileRef = 9B39C88828854AB300564D17 /* XPHomeLiveRecordCell.m */; }; + 9B39C88C28855ECA00564D17 /* XPHomeLivePageViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 9B39C88B28855ECA00564D17 /* XPHomeLivePageViewController.m */; }; 9B3A1DF4280571000058E2DD /* XPAnchorPKInviteView.m in Sources */ = {isa = PBXBuildFile; fileRef = 9B3A1DF3280571000058E2DD /* XPAnchorPKInviteView.m */; }; 9B41D36E282649230048C588 /* XPWeekStarRankUserModel.m in Sources */ = {isa = PBXBuildFile; fileRef = 9B41D36D282649230048C588 /* XPWeekStarRankUserModel.m */; }; 9B41D37128264E320048C588 /* XPWeekStarInfoView.m in Sources */ = {isa = PBXBuildFile; fileRef = 9B41D37028264E320048C588 /* XPWeekStarInfoView.m */; }; @@ -1161,6 +1165,14 @@ 9B33E3CD27D8540C003B0E62 /* XPVoiceCardViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = XPVoiceCardViewController.m; sourceTree = ""; }; 9B33E3D227D8A1A4003B0E62 /* XPSkillCardPlayerManager.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = XPSkillCardPlayerManager.h; sourceTree = ""; }; 9B33E3D327D8A1A4003B0E62 /* XPSkillCardPlayerManager.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = XPSkillCardPlayerManager.m; sourceTree = ""; }; + 9B39C88128850EFA00564D17 /* XPHomeLiveHeadView.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = XPHomeLiveHeadView.h; sourceTree = ""; }; + 9B39C88228850EFA00564D17 /* XPHomeLiveHeadView.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = XPHomeLiveHeadView.m; sourceTree = ""; }; + 9B39C8842885408C00564D17 /* HomeLiveLookRecordModel.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = HomeLiveLookRecordModel.h; sourceTree = ""; }; + 9B39C8852885408C00564D17 /* HomeLiveLookRecordModel.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = HomeLiveLookRecordModel.m; sourceTree = ""; }; + 9B39C88728854AB300564D17 /* XPHomeLiveRecordCell.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = XPHomeLiveRecordCell.h; sourceTree = ""; }; + 9B39C88828854AB300564D17 /* XPHomeLiveRecordCell.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = XPHomeLiveRecordCell.m; sourceTree = ""; }; + 9B39C88A28855ECA00564D17 /* XPHomeLivePageViewController.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = XPHomeLivePageViewController.h; sourceTree = ""; }; + 9B39C88B28855ECA00564D17 /* XPHomeLivePageViewController.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = XPHomeLivePageViewController.m; sourceTree = ""; }; 9B3A1DF2280571000058E2DD /* XPAnchorPKInviteView.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = XPAnchorPKInviteView.h; sourceTree = ""; }; 9B3A1DF3280571000058E2DD /* XPAnchorPKInviteView.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = XPAnchorPKInviteView.m; sourceTree = ""; }; 9B41D36C282649230048C588 /* XPWeekStarRankUserModel.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = XPWeekStarRankUserModel.h; sourceTree = ""; }; @@ -6347,6 +6359,8 @@ E8F9168D27ECA69500F10D8F /* HomeLittleGameRoomModel.m */, 9B3353C028816E6F00AC2F24 /* HomeLiveTagModel.h */, 9B3353C128816E6F00AC2F24 /* HomeLiveTagModel.m */, + 9B39C8842885408C00564D17 /* HomeLiveLookRecordModel.h */, + 9B39C8852885408C00564D17 /* HomeLiveLookRecordModel.m */, ); path = Model; sourceTree = ""; @@ -6360,6 +6374,8 @@ E8C6FFC527548120004DC9F0 /* XPHomePartyViewController.m */, 9B3353B92881527A00AC2F24 /* XPHomeLivesViewController.h */, 9B3353BA2881527A00AC2F24 /* XPHomeLivesViewController.m */, + 9B39C88A28855ECA00564D17 /* XPHomeLivePageViewController.h */, + 9B39C88B28855ECA00564D17 /* XPHomeLivePageViewController.m */, E8A6C28A27CF436300AC7442 /* XPHomeLikeViewController.h */, E8A6C28B27CF436300AC7442 /* XPHomeLikeViewController.m */, E8F9168227EC913C00F10D8F /* XPHomeLittleGameViewController.h */, @@ -6424,6 +6440,8 @@ E80CBDEC27D0D899001E1EC2 /* XPHomeLikeEmptyTableViewCell.m */, E8F9168927EC940E00F10D8F /* XPHomeLittleGameTableViewCell.h */, E8F9168A27EC940E00F10D8F /* XPHomeLittleGameTableViewCell.m */, + 9B39C88728854AB300564D17 /* XPHomeLiveRecordCell.h */, + 9B39C88828854AB300564D17 /* XPHomeLiveRecordCell.m */, ); path = Cell; sourceTree = ""; @@ -6447,6 +6465,8 @@ E80CBDEF27D0E2C8001E1EC2 /* XPHomeRecommendOtherRoomView.m */, E81AF31827F19265003B9E43 /* XPHomeGradientLabel.h */, E81AF31927F19265003B9E43 /* XPHomeGradientLabel.m */, + 9B39C88128850EFA00564D17 /* XPHomeLiveHeadView.h */, + 9B39C88228850EFA00564D17 /* XPHomeLiveHeadView.m */, ); path = SubViews; sourceTree = ""; @@ -7622,6 +7642,7 @@ 18F404C3276098F100A6C548 /* Api+Message.m in Sources */, E8E859D828264C2300EE4857 /* DDAbstractDatabaseLogger.m in Sources */, E8C6FFED27550CC2004DC9F0 /* HomeSearchResultModel.m in Sources */, + 9B39C88C28855ECA00564D17 /* XPHomeLivePageViewController.m in Sources */, E80016292803D5C500D6D17A /* XPGuildIncomeRecordTableViewCell.m in Sources */, 9BB549592782E6A30090CD26 /* XPNobleCenterPresenter.m in Sources */, 9B85B6D7279FDABA00A0A1AC /* XPUserCardSkillCardView.m in Sources */, @@ -7660,6 +7681,7 @@ E883E82E28153BDF0000005D /* XPGuildAnchorIncomeSectionView.m in Sources */, 9B17F71827BD150600440843 /* SVGAParserManager.m in Sources */, E80DE40D2775ABA500BE5BCB /* XPFirstRechargeFlowLayout.m in Sources */, + 9B39C88928854AB300564D17 /* XPHomeLiveRecordCell.m in Sources */, E896EFA22771AE9400AD2CC1 /* XPMineFriendViewController.m in Sources */, E8E70D8C26F2F5A500F03460 /* XPMineHeadItemCollectionViewCell.m in Sources */, 9BE9F0FC27FED2E100667200 /* XPAnchorFansJoinModel.m in Sources */, @@ -7718,6 +7740,7 @@ 9B1B729828002147003FACE9 /* XPMineFansTeamPresenter.m in Sources */, E86507E8281A8212006951B0 /* ContentTweetModel.m in Sources */, E8D55CA0281186D6006935A5 /* SessionAudioRecordView.m in Sources */, + 9B39C88328850EFB00564D17 /* XPHomeLiveHeadView.m in Sources */, E8A88D2A27E81C8600CA8837 /* XPRoomPKUserCollectionViewCell.m in Sources */, 9B3353C228816E6F00AC2F24 /* HomeLiveTagModel.m in Sources */, 9B7B606627BBA0EE0070BB72 /* XPAnchorAttentSendInfo.m in Sources */, @@ -7865,6 +7888,7 @@ E80016452804268E00D6D17A /* XPMineClanIncomeStatisViewController.m in Sources */, E88C72A3282917590047FB2B /* XPRoomMusicVoiceSettingView.m in Sources */, E81AF32827F1EE69003B9E43 /* XPRoomPKPanelUserView.m in Sources */, + 9B39C8862885408C00564D17 /* HomeLiveLookRecordModel.m in Sources */, E84150BF27747BD300A7F548 /* Api+FirstRecharge.m in Sources */, E8E859CF28264C2300EE4857 /* DDNumber.m in Sources */, E84B0E422727EE0A008818C6 /* XPRoomMessageHeaderView.m in Sources */, diff --git a/xplan-ios/Assets.xcassets/Home/Live/Contents.json b/xplan-ios/Assets.xcassets/Home/Live/Contents.json new file mode 100644 index 00000000..73c00596 --- /dev/null +++ b/xplan-ios/Assets.xcassets/Home/Live/Contents.json @@ -0,0 +1,6 @@ +{ + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/xplan-ios/Assets.xcassets/Home/Live/home_live_hot_bg.imageset/Contents.json b/xplan-ios/Assets.xcassets/Home/Live/home_live_hot_bg.imageset/Contents.json new file mode 100644 index 00000000..8b2481aa --- /dev/null +++ b/xplan-ios/Assets.xcassets/Home/Live/home_live_hot_bg.imageset/Contents.json @@ -0,0 +1,22 @@ +{ + "images" : [ + { + "idiom" : "universal", + "scale" : "1x" + }, + { + "filename" : "home_live_hot_bg@2x.png", + "idiom" : "universal", + "scale" : "2x" + }, + { + "filename" : "home_live_hot_bg@3x.png", + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/xplan-ios/Assets.xcassets/Home/Live/home_live_hot_bg.imageset/home_live_hot_bg@2x.png b/xplan-ios/Assets.xcassets/Home/Live/home_live_hot_bg.imageset/home_live_hot_bg@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..c85ef73dc576546d44f1b9cebb1edc0e35f9877c GIT binary patch literal 9343 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 H>lE`}M_3zy literal 0 HcmV?d00001 diff --git a/xplan-ios/Assets.xcassets/Home/Live/home_live_hot_bg.imageset/home_live_hot_bg@3x.png b/xplan-ios/Assets.xcassets/Home/Live/home_live_hot_bg.imageset/home_live_hot_bg@3x.png new file mode 100644 index 0000000000000000000000000000000000000000..c12712a7edf0890b34c870413e6e4c2ddf68f2ca GIT binary patch literal 16104 zcmdUWc{r5O+y67q%)@LL+t@Sqk-=msL}u)wj3xUrNph$`dG+c=Pa*x{#|SRx8AYxsgVEWCV%6}(t6wKhnxJb zMf|n)e;eI@rwaJriur5JYjbS=#?wXqI)9`0&zk}M`s3BN@A)gu>uZhcABy?EYc|JT z@|T-7*4tOt+SY%R@z+|`-m>{WEBI4I{MS$TkEaz1~R|FV%k_JTiG%AYLZPrT)? z+}YqS@t5vwZke|+%%2$Nk9P83HS;&RmN&Sozbp6)Rs6-6U%zrn%)%i(i{~wa zA2#^_V0zHris}|KF?aKAgxdj$Cz7;wo}Zj!t>*siPdppxnxU_x!@pPP9^B!nIl8^H z+HkuFJ31@*m&?Ih(rIF8Qpi1Y?CV+c*$BVq9RtQ6v9gE4|II&oGk(H5c6xo~^~Cp7 zkLEWCS`lN-zdrl4gc~pXc^mO~Vt+<&2fGb8pJtny}NX70R7 zJu?}&C(wj>`livP&Gm;h`ZX_x$6vfCGF!|1W;uK-05>((c*wl;&ZTwl#arK2eq9|t zqiBBg-`-PGwaFMMb#)y_>^@&lKLuG?IUhei1xp9G!y$(dE#-zEdrvOEcSJ2G{RmF_ z@#xE>)$;qN?Gc|l*0$Yz5b?xN@Au@u`Q)N=dqHJ(*_zL(->QFj&)8oMkIWXho4Jju zz5bi1+N$H%7F1wXI;!^O7OtZ?#$w@QY^oF4y?-9;FkB{q(vnvHZ_od8X#%~*3 zVYRlmyGW#cx*~O5RPoE_aPu#1o?$2BM*DDH}PUOHC#=JAC`rMh_)lLueV zK0AGG>Y0@H(r=8e$I`(x|Fgex+#m7#*0ldI^1qIHdyeTYL$XqyU#0w^J69i5!`Xw+VOAq`*X zfhWJc3s~djzu$l?#VwT&b6XC?5Lgg44o2(^1ca=tjMz1uyggp(bX+;PH-VZP)NCS6ig${2Cx~-}EcufdHZ5o|crPPa=#&7H;sp zW=8|C7dP%rWAad#Ld5MXD1&f>+2^_NRPjaL)1j>p26Mt8119+tBPBsfXZNchKDg!#O#9q787J6vepf&m>$5fzjT&Kt&)y)=dYUbnKl z$)yUYCPmv43Lf|2Dl21t>q~fgbHY{nMSLGk^+lfH6|t9-x)?7$12wPd)}b`g9nvn3 zpvU2s<>RnxC9Bjdbq*w{YUiBM$gAq!nqb#B&YS@^5wHi48W9yZ)xwjkymcWLK-RRd zQ{qfqX-6<^i_q0m1_BCELm%6MKj!#l@$iGonS0)oTn+8*HUNx5wJo=~i4%%*ru}2- z|E%l)j$}0O+%T9)GCqUAiMt^m*m;3V`--uumAwhUmF$rcNzZ`;F7fh^6b?JJ%`_MyiDbh9a6W+>xbZLDTm^sKLp}O0!J?aMe@tg=yvigUf

-2_Qbve`+{^1ql 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�vnA-3YEI&n{PGxSl5O^ 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 literal 0 HcmV?d00001 diff --git a/xplan-ios/Assets.xcassets/Home/Live/home_live_recommend_tag.imageset/Contents.json b/xplan-ios/Assets.xcassets/Home/Live/home_live_recommend_tag.imageset/Contents.json new file mode 100644 index 00000000..9c7d1bcb --- /dev/null +++ b/xplan-ios/Assets.xcassets/Home/Live/home_live_recommend_tag.imageset/Contents.json @@ -0,0 +1,22 @@ +{ + "images" : [ + { + "idiom" : "universal", + "scale" : "1x" + }, + { + "filename" : "home_live_recommend_tag@2x.png", + "idiom" : "universal", + "scale" : "2x" + }, + { + "filename" : "home_live_recommend_tag@3x.png", + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/xplan-ios/Assets.xcassets/Home/Live/home_live_recommend_tag.imageset/home_live_recommend_tag@2x.png b/xplan-ios/Assets.xcassets/Home/Live/home_live_recommend_tag.imageset/home_live_recommend_tag@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..f1cc49eca449adab35d403063a35bdf915ea5878 GIT binary patch literal 947 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 IH*`h(7cr%}(f|Me literal 0 HcmV?d00001 diff --git a/xplan-ios/Assets.xcassets/Home/Live/home_live_record_bg.imageset/home_live_record_bg@3x.png b/xplan-ios/Assets.xcassets/Home/Live/home_live_record_bg.imageset/home_live_record_bg@3x.png new file mode 100644 index 0000000000000000000000000000000000000000..a405dcb7b77c4e02947499d6f20c7d2e9e696fa5 GIT binary patch literal 15951 zcmd73XH*kU_&>VYWJ5?OAwcL5de8`nNKu4@4k82u41yRC5qnfbu%^&Nsv<=ZLs7AO zA&3PPA)yP1pn!-7p`%hFAfgbs{O)~m%em*=bMCAEo;lB%d3JX8v(G%wGtbP+yU+$sQoDpU_&r}g66+S-En_iyo^h1Ean`Sojd zWp17RTA5#Gb}jaQ|2Nh3yYKU#-v9mP|4BZ~4X+nojjgQCtkdN;<6{2!%G+^q_2loj z6N^<7OK-;iy&nI&vbxqP8smSTtDX?od|zmo{`sqGWu|*&vUjCv=KJXH)uDyeh2^!n zadF+$bl1?z&(AAUOKbncYl3yo&)J#3Yt5r8N2fs9|b)ShzAczuGXq+%Z4cKO%0L{@Fh%ZW$E|g)0Li;+BGWf91{;riW}D({~>M}7ys-N*Zx>qTV5L#t_a7(Jwoxwu=xG2v7S+J z&*B&1ka$ceUhmvi(M0Qnc&1l8CR+V4H*(BLYI0pU6eE2+cLPg~%98KTpZFP2+`Res z@X+Ab#+RchY5^1g*xuphNb!yCo4WJ&q~BR=gQB-DUqeS{(+s2-_|SLxk)pSEGLGA@ zm*alVp6l*iw3)8J+sO>A9k#cZl-wKoh_Y(`A$RQk+sid&AC7b$5*+zP&M-t?vK) z`P{GJxA&ETX@6^5ZW_Kgeu43o^XT*bD^tG>9jB+K)%rf4J^Sr*clU1~^3S((S5hjZ zj#yn>VmLTBIJM8kkF{o7o*wFqKIC>ysr6pk_al;f9xc!AfAlf?&CKhcm-GD9AKiR# z_GSc~-re{s#W(P4>5CUHUVa^j@2PovS^Uprae8^Ut9m!*gU!6h{P*x53w_UzTK@M9 zp|LjCnq7VI-}h{8_WsK=uO=)W%V_ky3WZ*j+`Cs3_m3xk#B4{`LWj9|{EkKJYWdDP z*^DbC+q_azQ#F;X8A5(4Tw>d{>U+Vl28M>l9t$1|3l|6H`;HFQEcVG3ZmO$0T=|U!$LTCK^Sspg&^r0)pN@a7W(I{@q~mU#;OdJpyLiJ5b)6jHl}Ak|{i4ZJ3wWhx+wEpk{G}D zz&ZD+0Kt#I*CQz(ReckA)trHUmS;EUg->KdO0oZwb~xdWNl3*f$m8?2TSm_8a7OAe z)%Q0=H?Jdzh3(P7a`953V~RxAQ`pCCu>CbRVj&q0O&gX;_lXoqqvdF3r3 z0tLMi4dv)U(>pxj7av->mptzX0_r_m3zDt_Uis!;%_ICeHXWwLg1vQDc4bhz-p`l* zJ)oCkxkiV9j$|s~hDN3v_X`YB#HWa^6_DFNL)Lu>20C4*V}nQv7A5%B0*0d!vIY9W z!vJPdiHK2EYbDX9K6FF|@bt>=8K=qUs3+=$C{pPvwM$FUW#!x)9oJN#Mwr3?hO~@$m!9@3V9M38EP#kEftF}#SlVR*G>pby;{J; znk(m#cs1$*nsF!OGUK`xwhVZKfahNyKxM$JI__S@*#Gv%#C_huu{?XC0Ww?3HmMaCj2_He*Sa@%~TI_E6{Q?dF7kk0vJQcv_MN{6h zZ#pTE)hw8h6uN68^HRwPRs%$U8KbbKc#=su{gef9>E~q%4H=?=#3Z>+j?F2+%oNCY zrNsTFl_#k7g54P%9gA$)RoIJp+|HVo-FY-HcUPL<&SI+#>E zjW;H73+n%NC=Skt-2o@nPsV5?5fYk85rt%B`t5`1VJN`9-3&$OZERVBdUwMp=K^-e zLkBgBEeacWRlyHn>VQmMX=}0rpHHKIVM!nrpET-VP;8Y@0d7V= zpoVY6bv0Fe*7&WZg!}SbQ3d%2YPoJ(7YTMW{W68iuZVq66RE)8Eb^%>V8`^PDG1yp z(VPx*S_k5nMFls`kY+mEu6-Sm1Mx8Fx(lwUj0NHW&_L1|{!o`GL1y{m>aEPxv4F8X zd8KX(8pL3tZ;pV5u$eBCoR3zc?*RS@35u$suyjIc(({so4s*|OtVj-rwL-QiBwB_r z`_KMBQCQKs@KG6Tu{C%u7r8qDi5YjXr=!bwo>9V5?QV$}59%%~A)SxFkzKJ^MJ8NT ziR$kai8n9VVAERA*x2X}DFv@CRuVSpVUZ0v{QPIKffp`!~05(^9Cpv)Ttn$Vmcs+C27A2CLvs3CNo!kbA|ZlN+E{V1L5N8-?7uH%U^95w7{JgqRHcm5A=bJJ zxfcQpU@DUMtbGj6&8GE^f@pFD`DI@MPo_vf*zXoyM27qDkHdox)6<)n6B3obNO+omcv%P?|2RFxpm37--%erI_ILY;`NQw34F#KY3+kQ3Dp=phE6YaNRu zp<~y3%K+8YBENTMrk>zda@A0}d8JoBIBQ+(%B~ZD)@0^&=Ic)*-~)0Nbmdj?PXqVOa7@90Ucd6k2U-n zQNQ~^an9twV`YN8xU*L2_3)m(#d-{U$JQ#Pzbrp_2!1;E7OWH;t2|3d-^gNI3^f||$e8cX*kBx4NroA2_#BD>ANVel-b z{e<<`6dsVoXOif_{9Bi z?R%6S+l#@|b(sjOcJ}1X46Bss`d&8!Puy{d*wn5|?$#U~IK^e|YwrG~_XnfrB8cJ za9pC--%Ag{;5nf%lWL*f?`-Th8*`86w917~$gLK{#M*@tg16KdKy&JeW`#|NN@IHg z>~*}MXCB>y$tBYXdf4(IDwThvuo017$ZVQsAKZ2);w<6;MT{J+Ii#uWp7dXwRLJ_6 z$>WcJM!Jp(EFRO;YHRerh40~{W2g|Jn}WvEo}s*YZEy_r1%XCVZBM%>p)dSVHj*^@vGN_Tr&J=GwVxC?3Htx+TGJ* zwwxFvs2Mh3T|=E&cYjCpf9d3b$8PX}t%#>|wHNv*IlL>oV?duo^p(Tmg}zCo61(E1 zb8Wh!j5{tObruWOf(o*ISUC^?tiMDVkA-X>y4Em9+!``s-@CoZc+}8!bsV@Vg(D<~ zNa7dDYU!C*i#;|P^?@9UJ#!*U;U?q|E3j5Y=27UI zy|3_N^kc3RZp*dP+N$sz_NZD>R2kv*BDcA0;icvdC+q2k_`?5C65Ib=^O9$qD|9&5 zT_mPkXn1ZXq4s5O#tcX|Txd7Rj6a~H3lcwa^e6z58(LEk2%S(5-Hnn&AU8ku*lY}- zHY9M;_K`SZgqVUvx_F^-b01$%^0m38u=ii_-Z=qWr$59Mcm> z!z-j>B_gE=WgDEEvsc5J z8-bT{k$AeO;o!jJmtE+Yy7c2y_uiV<*NeAW?@6hds3Gk|W@uL(ZGjU^sm40a8o!=O z>-^Ry@CUNoumEBn{cNP83MBQr$x&#)U8a)Oa}IdrHcZ_&%YVD<#+!Zfs4PRmhK_LE z(%|DJi58=m?w+!cWM7y(-u%Av#DWixOLOOiH24@541Pj9x!Tdci>t^(1rZH;=$D&D`jVohe^)kdl0Zv z1QfVa8gjdkQ7+70qQg=vn3C+L%=Us*!y}4hGrv7%fv=+{F+9U?%2wl>{# z*j|5+aXA|o?ow{W=qKkHrCutCmLwWP8$NxZoY-a)*(x0AvJGR?LqBSfOLWB-PVKyY zD%c%0aHn5hj`M`P!jCD+@x~k(Q~j1GFL9Gd~&Mzm-bjyxnD%_9Fpy8 zN{UuA;@$o;b}c&&w5r4@wRd6MJ%0(M(~%%t2WKBZUYP$f*SSW1E{&ZpA@IpMPtnV@cFHz=-W-d?xZ0 zU8T4H7UlWtfjt|4jO3}!%_M$Q5R7B1#LA}xd&q)6nHQk1FIN~*(bss~+t&8yUivEJ zYCZ{g8{xlp>3zlc$o4sP;VGw`-d)&of;jBzK?#%kCNyD-w2DIJMpR`pxEb@B>hr9J zO~PzA-9lonrz7Qb=W)4AWG#5xh2QfjN#hiyH{nf3sPL}EY5c{IY3Cp6dyQC|kWB%5 zx@PaTDD5I1f;~I%AcG*m;liZtuOLxNPFucv9V!3rh(wB!Y>n+!*Aducf-!b5{ehv1 zcUUS{qq)S84GruQ{Uk}2N`15WT*tOFIz%q~4?8nh&XwJMTf^}@mcsJG`g*KSNd^K$ zKpVTbwYdm1Kv_A1@8uMrEqJA_yDo{piX$~yJGZ5uDz2fcOE|P1(PBduj}rfzcII?j zgcY%n&@*Cwu1&xKeP-Wk1C`C(|hx&BN$J4YM(3UM}*b%pPHsJn9&(6n5$ESA0o>jig zN&Ot_la8L{dZ8#C@DWwaFC8efrA zHJmGqClJZEfShl|Jn>J?2^_A+FVCaeyLPEbpM-mbK$(1d;s zx;Q2Ep$RW-5z~#0A@VP;T{^U`23nnFy%&j74i!@W%C}qvCsG)^DGh33j}AuCcFItS zj%PxyIOlY2E6lb$#EtzSwA>I%GI8#Lb9!aMw;TuFB6~*#MW9&xbArdsxsRv{n{L!c z@eB_5?Z2+(NTr`*{ZUepEM#IOYmtu)Z0U-zOUGb-shD)4`D>B?6GA=FJ|4RAUn+py zw9EGLtz4H5B*)M8vFm*L@#ZYOjvdJ++`U2cEZFn!O}m=Xb_Qgao8ld7I<-k^!S@p) z#$xRY`7d;BTZXkK-Kh&nL-&ww zbt~#+DNYPjKF^A3)&Hm@qppnL)th)!z}JpQKERE%>eFEdz%$ahgv5g=zXw=8j9AS+ z0e2f^x$kfY9#WW0krwOEcI?Sr7cn&%qYfKfQk!!sdXstobYV0;87dnr(BAX;|Q-ekP9{BhEoP?5SWXatfW=;$(DIko~tsi zaQNKYS};oOA(^eaK2PMIMSpT*gZa-pLjf2fLocE(<4eN!&TCVq{2phxaZ=h~9P)@h zZGVRQG4{Mz!dY@1GGeW817-{&fvq~CLh z5)r<-hSF4`;$<$%yRl2QWe|2XkEjK>b+|RuGCvyefP+r%J0;(5<3_HCbKG4&A%+1E z(V~M(GDD}sjKzUfZ%|61Xf{28vmVb=$pL?Ud7r|d8?_zh(@(G>)}e7rgBjgAHOQG|5Tyo9j0Zm23R?KJ;qCnID{=JpaK@Pw=#e&fA z>dr?L4hl2neaoffBUeef*;VfRg{F7x7vi_a@BemDfTW~R@U7CGcYA#75y&Gd>4?L( z$neg6a7!5!MgIOluP1y7dccqPXIWssBRn~u%; z9cYh^x!!;YjTNxsWK?Wo{pi}9Fj&vYC=RZ^am>Wsl0s@W);}OHK9>W{Yzi{QF>fc_ zRJlAqS!9krmST-+);%VEZ8m%d6-Ies_^*py#%e-%q-E$sgax$6<1_f~1K`T_}< zp2v^7Y@LQe-qr&{;AFjzq)4tKJ3SY1A4gYan7^K(&b1A@oc%=p>qKg|)K<^bCx-b` z#$|{rKY0?oA2PK`nSRcL_9~WPGA#B!p2~dk>i6qck9Tc)8~E#XskqNjmrNiYmD&`% zg!PfYeUgxbOHiy(^O@ty_c)@l?CS12sH0>kA;U2}T-nOk&id!vW1qe2*y9s$Ovy(e@xy)dChB?O;}oMT1%;#;IFTl@xk;p_ zcz>e^>)9rkcmZM9aWW@wFL`ULbR6JD%DH3*?myUNT5U7|yu7Kl`C$Z{sx7^lz94c4 zt|`6R>QXP9P?_39?;o<529Z+9$k|{fB=I;XFCvt* zq;i6NL)aC-4+H-x*6hA^brr})&lf)e16`qG2VgQ6r;O!50sGrN zeOz{YJ6n;=d`hJ}rR&DU>&0WZ@7Lk_@B93wrXviS4#}1`=A0z$Y1{sxC(KzY1xX8o z{k#_1ZnRi+)tPc%{vA6f%-2^lo5cNb6Ds5<(-?l0+<`P+Wn%V>3)MNJD5bD}GH=Ye z%KBY`+S{WfKswa?pJapxmVdWMMnw|3uXrFGHePfCN>Z+}O8k-#z_AM31_P0q^hkU$ z&5?S^3KONGCww+?D}bzQg?5g_{?L^PQA9{v^^$0!zq`*x9(h>LzIuI+u%cDZSyCNQ zmV1;t6K2C?C4+krAge_>1dG7Tv_`-<(2-q9=+W2VwcueNRc*T;V$?5YD?kA{# zPw54^T&5@ZRI+V@edp_yKt(gUvG#`4$TZwRoAle*Ez;)b&H;~20L&^%0|*1^IdXOS zOePLRutt^sQea<4tuIEmYCogBeSGCloI|=g^_2Dp%ca;%CtoL+pFYlw6Z52!U_?%r zVH3UR=AVxP1eD%IQ_->muMQgd>|u*_1W+ zYA3@TWrqxf)v<^6#T4y*Eom|=iI+lZQBEzNhTy0K2Qqp>o69>oow)POxU$HOfsNjf zL0(dHhJ~wbLm9ikwqFN0?WBm8=dW~Yu&}QD2kQRudp0?Xia5Z2N$~yV3+#4S3R@&i z$S)@QE9Z_9DnXFeAFj|=zSI$#aBd*r0PD_;0Moi2B$v z@7iWbCpFb$eh-BVaKmC64y}|T;IRC`kEYx<65SSt0VUnNv^k00Ykv=F)=!lFPtWvQ z6)Pr*UCl9<*NkW#Ym0k%v}trDgAG!<=8dkY zyso8SF_9NSx1mB=I>=!P2ih{@LQ}7COi56I$L(We9d>$354kGzeEig68^X??IdVPp&+W zZP>0&07W^AnHOsVOSxd**KkpRnjS;c+0SVUU!@PmyeUU zcFyGEPO81P<-@q^C;?jtSQx6^+sDLluK5+?MC$({A{A8f>Yr5{(KEZ2aRW(Ud2lAs zb|E&YsLq+e{|aHh-ndA!%7OC8+nU2>k0DGCCRu^NMJf zX1^olRBH*`Q+U_GQ$H>v>{LjmcmOWo7{<(RyRBG0pobYiVCJ?xA92W3SyJbG+MO=| z8)P@)i?dD1z~%?Hg{V$r%7ytk-&TMp z+zIG7y_Lqesi}vyuiE}iUgBdNj>eq+bKl40;6Hx5t9~C=_c?*@RiYldjFw;#UEgrq z+1m|y^u<5A&BoNPr(Lfi+IK|0VSe89X%`^X=F%MQ)KZ&p^KM6^yn>m~0bks2&i|Mv zujxCcERqF>%w!n1ol9?B03HJbhLI2T3$!oS`*HV$NgSjQ+>Fy9UP!&Q2q^l)`oW#r z@#jR5Y`#784yOJ`4|TEL$ePO!Is4|dmO6XJhIpK1b4vi0(=EiPbBF9|bJEra&&6F> zUVrnaq@LGRGT4$OQLTiQrg}Oun4vJ_uxA`+x?=i3{pNiN`ZAaWO5~ggwNmce9Mq?A z{=6U$v}c**IVdQ)72V|XBOWiv+C=1B=P>1o(PQ&7=ZpP+qVZL~4h&%dX)84aKAZ(J zDzmt3^)xYPMYN$#{aoH}r@_J9%8+yHYmSiMiYoRd;88Gnn(0Bi+HaA#rLI8Sq!N8Q zQsngx)?iGYa5yZ}x#0iM%6|B<7{`-JTVa+7%L6E>t9pl(Uh>JhKZO-s@zh3COL0jDx3G)rb1h_zqO+D6beMM*Q5J>(-! zXF0ChmFRDK-?--?{Ij69;pwL44l~E0-grF6TB<8E@#Qg)!@R3U zwnD|T!^lwF-M3hMFkbc{1E*kH?=;oCQ73}iRX741p&<)l z(b!oauTTs581-AT%H0fHX=`_= z_9%O$O~yv2gfRJD63hz{z4u3%h4KCVVb5|*0mLmC@XB)ZJq}+e@Zdl{Tq5vglVB9({$cr32kHSF8~QqX0ZsAy^OgVwXu>V+audN7a2fZPjHnWQIZ_QvImALaa9d zxwNs{94*><75XG0d+jnJ(Xd(`){eM)BJy+XKFmAz@kym<$!2|S4^fJP(NoOuN1$c+ zpxPx@bs~G|wvvWeWP1!=NWRbdteR8LZZ?tvfX}F>=aNXM;}jcYKRlF>%obnv)o3O5 z(vht54K&`X7waGc%Qgn2KX3)Q``K2LDpb5aL6VMj+@hmDK_D|72&NBfOWMKhj?9NN zQ?VE&OJ04^QSc-EDvPukKu-<)CR#qFAbmdq7O*LBo1}&O7b@Wmxw|ti+N%k~++gmdQ}MQR3k zWjZ-!S%~Uk$3Y$L35BkcJAFHN$*PUf4uG}|+&2AI2Kob8F(LgGb@aG{iTUsrR2;Bz| z6=$%Mx*n-Y#6%)4?@QlE_stHH)d-Mop3D!X?$$@QX{$x!+^ef7MH(bu)%Z8pn) zTu7B-Full|(yZ z1aGqTO^h2cp}YSG@B@NDhP?lt^3*m9D+3u%nK6TCM5nQD;Wd6rC2O7@a6p=RoOyRP zdUL3OTDcmCpi&W7J>;T_-elc&07=SS`epkBhAxZ527mc`F~uL&ono=9Rbq&BZD*e< z;{TKwRq}lSyRuA+XU)lEZj=7F#nowmzWIb-)2+a~kt5qs+o1m=5TX#3O)Nq5(>-$6 zPM#prcrPVXJ4pPzinCp6-gLp>0*-W(fmjchWWO8O=&~U0`UWfl0W;9#*foo_qqe@K5BeAdbYS$e0loO0Pa=aaJIojB2n3{Bu%GP>M zRLNEq)dQ@SYYf`n@-UdD=58K+T#V{9ehLKJYZt-t<1!D)^I2#8wKiOgAn~3I3qmGi zwK?(vVP@zQ7W2qmI_t193fanMrFSTxs7XXufgTgZb}tK5`-s#exxnPF`YLT&s+rus z*j_dkPehMY$IjiY{V$eS=$YvngRy)dZ+!DiZ9{Cvi2aEm#(;g&w$lYc?<^N=j!tj= zkiVs=CcflLP41V94?oXe?%7-MS@RWPA{2flz?5tnYP!DeeGPHw9=ln_)o=$ki;(y6 zM0o5g)^S?LvB)D!^`F&Pn#Pk~(wGh!?rxAy1M<^>T|uT!zpxgXXID=|bouX}#!xk`{0lV2NqlQsgZZ$eRvQl<@}Zc)kc>E6h8jVK3th)#Ww-Q% zbI8WnLt8v?V$;&=;_~CUTvVod#LW-`AeUfa%*L!NKRf~IqpbJ(bk#wZmgPK9$}2s= z%&9uH2FL?9V2?Zv6TVa&f~R2^J0_ZNy`@VV0+W-ssOB8+?nD{cyDNBp@GLv69ns3K zi@RA&CfKE;0XC?{*=gPCW2KJ#IReUU;0Y%B@1qWau+7{Fy1r%f!)>q(MD)lpt<>I` z9MPK}S%gYy)kP!9~ zi>R4G%b}U^+!9q<7=YJ(x@5jw&t>jOlJ?x=r+60bFVl}=A7(dTn5v@OK{tJAY?dS+ zX`-oyMmJZS3B)+iTi;o@L*NR7q)6RMmw1!r8qHtM;AH+B;da`*f)3(SV?5}I+*&Eq@PfwFXdg&4t}D?ULA6@K5ey3=9VaRcoAPh9d$K zlYf~VW3-B7^n)h%cpL_|;Z;3+R%tA+YckMMq^q#+Zb> zO!QIeKJW7kX$uB{eYBKmU{1@b9isQzE27*8F0aTotCfktsvXdE$}_^*WBdw9^s&P% z)l4@_3gf&!O1vx=dKH#%UrYPa&P}m=DM6N&&MyAQtciT10$2wQHt`uM(Lc>Tt8d;- zenfZTY?<8!RSuu6J&HimH{VWi_TSFX^{r4+4CN%sVE;7LrJgY>?}tsizujiIROT0Y zy@X+^YO2y^iB&*MhYFsOHYuY6MOUhO2f12z{?Rj0iH^cIxk=xKAF|mOcd_jLmM`T5 z=A9TU)ku3@@a2PiY(I3RT8nZw$Wmt)ZL2_`F0!fXmZEIRf6R!6Iu}=YO%)$lACBPz zec0qhE?hVJSxam7xkJHeGV|mwd{Hw~cNg=hzu(37k#75L_&TqB={>Uh^ih)0&q1(rgM1{1 zP4i_Y*xAO14l&=_3X`F_9!vQ@521nt%)dq5$z{}O*fHjte{xe{0{XUH+l$hg%3J7d zNc|RO|5Hbn1sC1^H5}Q7<6%|odH+$NW1>`hnx1oIxHh;GpZsVJOBv%N)fe5p{KWLG z*Er43oCUYqrQ>S(N*LfRU`$q$x2G@ZsY=C?_ysA!>Wu4Uh78$f6`Z#@a=*1EZxG$F zh|6o$sDFQSCx5dlJ_X)bao?E|t>JJBQ0agUL>V6d<*MRP&CybFv|}Px4A=ri*%o6g zG7M~DWt5exhEJ5Vzd1Ks<^7%am}vx-p7;N%=Dfngm?gSsp26XAM50`|bLRmx???z2 zq3wq*VSmiGBJ>$k5rC>u;y%aQIi*z&9yrm_v|W1OZssfCkQwuQ<}T=)SD|B2$7g6= zuXT1(r%jJ_njd>(MmK@VeCwMn~G{-dT#>`z(CU-mmc?ewEvNYNMau8rz1=5z`A=@|QK`b9bxZFR%$B^uT$f^0Jr8%%Lp@Ou zHuehZvSq8Ke>m(v6Wam6)pAsnL=m%53Z(FSLn``gFSqpPqg{?L#R}LV+lSWGCF3TO zEXNa|mQzfeDe;B+ibj)oESOH+eiA!3v44ILM_Id! zc*uM*?PAr42x-|N#juB0^&_(f3(u$|pVU7=MeYX{?VZZ``^YrAVkvSZfRRq$P$`3_ z98a@5*wL83*wSt;Dc5x)#tCM+qhx&ks9Gj7l9>z;?P$Y_wH1ZzkY78Lrj8h-dIjz$ z>%M|eO^aXaT%|KLlv`w6OSmVgqI3V`>RDtls$YGd7&Xpbia@)VhQDJT2E&AIpdXXZ zw=17~E18VpB5uG&z-}q(R{m?ier1-7o%o{p8&jhQ7Yn?Po?}-VFRk0D)iEjmWjTh` z#jAi4FmuheK~M>pnWk&oY#R~?uFCRYF`iubF~;y=aF8_M)D0Nk6s4M(VhM~P?=G2i zor{f}{b}o)Qh@v^Oe=^%duU&Cv)17*ckRZ!tYInN{%;hWxoQq zXByDzh7-a#CbZKCwH%y9jPiZ>2gM*niS9qd2Hv#y4h#O_s**F0ZrKax(CPsZi_7R3o!5o=G{*6kRvVt>#r|Lttj9h9|!Jrue=-P+7x?X%m zIasN&FYIdI{L09QGY2I!afsGKFI#0M;l)2eG2Y&Y72b@Y8ZW%spP}(=Kx0Z;2{;x! zY$kMFeTBLFeHmqyH|fIPr9QH=K_iC7_h5Z33cU95U@PuK%588s+oXhGn}8FtO{Aoi z@y*BuST;d*mR)BKR>aB~oB2d{WUx}6&#`mf-_#PF&bljJor-dkMY@fm_H~_2ocOwx z(3PORMP^@)4in2VkW=PM78{|6ZosX^;snh31zq7N)K|{R(!kBSxN_-qd;09t|IB~` zrH-j7)J?mVYT;WQ9U&{JzrstE%ozJFX{$X{(-PsO_4 z%H|+Z%)3?xc3D$vyFPsEf^qL#d&mx-nk{wjR1zDK$ELz!2uK_$lcafsYWCGSo22$A{)75a^$ zQt5ohPQZX~WcxCACpc0LV3g`wX&c2|MOC>5ODWKzq+4cq0AnH=1rv?fJ0H)Z&oSGjqJJ31|m=NSc zOw79d83RE;CGdY?oPlALfK&h9PgcT%0024^c+dm3X+h+FJx9=5@OKvX1PWJ9*8>+57SRs+V`~ z*@jPbfP`lNY7=0OVgBE;(YufDc=Xov%TA2&<&zIZFHCNH9eVeC@gu0b>;F;n|NZ&@ zpIqVgJ~ ziZTrh^T)M2K9|*8UZMZiVL5;upAz@D>0e5d)CqkRgG%=A=3q{bwEbE?0KV;0Qa zSsV%8Tk(FuGgz}8LFev$=AFLXiIVj6R|0~bbKLH6-<9Xj4y_*_sY1oUOnu(>5lg<- zhF6eHl8#k|0?F6AN7`EV)ev*?n&StP_@+)O(8H_~-gNf=)b{r~w|1nA*xSN3%&G;H z9qi5%&Lx2d##BtQS>8|ofv3LXAfx7;GkJiNx3R^u^9NtED{kzW+6+@JjIfN{lw!d7 z*qL-JLItSnF8puqOi^CPW`AQ+l{eT}@?(RY-KMths^d<^e_fS<17W`(ytOf)?D}l# zVscW1X+qGGpA38$3%!>gkYB_^>WFl^zP>uKv1}w_Y+u&?Yy2yxUVIcr-vU-J23ChF zsNg_?^T2b$hQbm>Ia(}N#e%lmK7?iKWLw4*$u;Yb%jeAOEr8Ox+X@HN<%iohcXDMXqC>I4{#2rfcU5$%IZ zz)MHEfJ{k%Mufl;gylgiL|`!;hMJHP5AH!ae^3Ce04fPM84#-JOl&4Z8t4Q#$fr5c z*^s2sZGlE4CStb%@k%gE2t7kg788{Z&LJ=;0coU237rr; zEhHLJF2%d|7=4famlznpACFLR4UxIvW|0(%uLnCFaycwhcru8NCur#;Z{J5v6ABy2 z`g)wM1*Z^UCNd%yyE3p}hZrqnN|M@(Oin72Ndff^VlrM#c6Xz?m2A93o@j#fD7g8g z#sEJuEojY|Lb`0TUKbw%?HLtyy=k@usb;e?`yna1A{II*by}7nFhca#` zWzNo2(K>1F>S}LqYi_1WwY5Ahcg=wHmW?3hvBMZau|M{vl~07Y1ug7!eJ`=xb&s;# zb=;t_A8%NEi?xW^z`EAP`}O?VJXMm_Y%KlV+dAs6R!uzKe4&gnSAV0f?#8Z7LH;bC zS3}E%wk?ZKRaWLsPG20!Gc;{1{`9q^`tQ9P0^G(%E9-8J%x&)#@h>v-vXfiRKUh0# zf0D2}E4$g#`t!T0bzj83GsN?Jfw9WPC7?T3c)Tt=$D_5tv;8T5Sz;g8p>fRMIbU_H zbBx`%HL=-a%|Gd)s~@@7?_CLS){mHl4mJ8yr`c`VbKk|0AEI18nI;~&@%`L}j=kGv zY8W~xaUf;h)sdDe5 z2|XGsAGdZB6UGwhvyPaESr%_JK zHhsEK7VN5pTQn2Lk{|u;vZ~y=R literal 0 HcmV?d00001 diff --git a/xplan-ios/Assets.xcassets/Home/Live/home_live_record_icon.imageset/home_live_record_icon@3x.png b/xplan-ios/Assets.xcassets/Home/Live/home_live_record_icon.imageset/home_live_record_icon@3x.png new file mode 100644 index 0000000000000000000000000000000000000000..7af1be01c7b6bfd8fcdfb41949e065634be4b2f6 GIT binary patch literal 1738 zcmWlZ3pmty7sn^sblIf5%v;gL?$*|;RY?0tWE#0_#w^mf4aVItV+_V+42I?sUMX3c zv|F~szPZg(7|{x4i;B#)t6awNW*UQTGlT!x|Nr+qzw>*3=lPyf_%!?1--)QTsT<(P9k6jfU^h)VxTgBPKV=S z@Zo@y7{cO!C;%EA*g=pKh-rvtfkA`s@*y!A;v>K>6+vTJ!Qjfr^3cPO_%H-jCWZo? z1_U8^WkMhe-1u-@1f)!$upyKVu6dX zfma5CP9`A)!ebyJ8UyfWp}hku2)@h0!2H-qKqC00!s!(7N=Jeia6*7}8W{zYBnV<6 zXq%|OHwAP$Y{*N?;3Nc%4x%Gr;XS-j!e3Kxw;MWtgUihb;VgnedS-z?8{U6_85P`? zf&V!m=K+h0%~`2Jo;*i-`=O~1X=#R{IuO=CX*HylLd*puy#S~pBtH*mJn+u|DhG*4 zLg=x`vscK-OSstu*XrSVEwHbEpajkpBc3@3EeY7H7jLu2(O2S|>`n5)>2KCfG!U(f z=hccyK9hOSYWHq)bE7pn?OWwcLqi2Wi9tNLqSNWL^YdzzQZX?$CYQ^lQfX6DLq$b= z7`j|sh(xVMqfyN&6mofe1^-h}`feOr!;cHfJLt{$JvbUaIj>rn=+P z^k-z^!AAatuU&~oMkS(G4`MRZ9lXxRZ|5q_t_}?1@1=cIOQkk@#r4ah3VA;#-g3Wv zXVw1}DGW#dUv2#>{uVbkH>aee9AW;+9Bn%tPYyP;fe*G50Ou)8s%p68ftT{8L5X4GQh ziAtr4{arE7uTq*UlnG616({c1)HJfXOZ0kjtG2fun+|uF)o}e>+3#?RJJff8)tA9bXWaHQ36T7T}X^p|l|xxO9k=}Y|D)qV#Q>UP6~^E1Ugii!@ox=)j%9H>M}9qgS%vTU%M{&V+m+ne_qegd-9ob&dksasE1S2mBWWmYe0v+|yhqoKxx$fK zBccbK7xL)3-XpPn1Qk=QO`ts*AX|>I- z5>c__6d}&=(b(^46wAGgk)=1}!ofQRT{fAI@yP)MYd@(AzS8HL(b7#;!l}JH$L`4@ zMa~BPd9useXVvK|w-otlEtGn}3EyZ#h2OoxXXmHfDcHzRA(%{2zGAQO>G&mlm$zTOy2G%c?_VGSMjSI)@ZZb|YCFO8NGN zM6ESrMl8rY4EI5#Iq90cnE~&&-ko%#>@^oRnHWV@{!yrXJ{8WbUq|MR9T+zbd6DUt zT65TVsnteut2EWWariN7%HVJ1j^QmI`j0lm7G2ktUu|5?GHR* rdLV)1-Np!XClDUl1!s5)g+#0)g!2CZ6X3jG literal 0 HcmV?d00001 diff --git a/xplan-ios/Main/Home/Api/Api+Home.h b/xplan-ios/Main/Home/Api/Api+Home.h index a5e25373..5978666e 100644 --- a/xplan-ios/Main/Home/Api/Api+Home.h +++ b/xplan-ios/Main/Home/Api/Api+Home.h @@ -67,7 +67,7 @@ NS_ASSUME_NONNULL_BEGIN /// 请求个播放更多房间列表 /// @param completion 完成 -+ (void)homeAnchorMoreRoomList:(HttpRequestHelperCompletion)completion; ++ (void)homeAnchorMoreRoomList:(HttpRequestHelperCompletion)completion singleRoomSortId:(NSString *)singleRoomSortId; /// 请求热门房间列表 /// @param completion 完成 @@ -110,6 +110,11 @@ NS_ASSUME_NONNULL_BEGIN /// @param uid 用户的uid + (void)homeQuickMatchLittleGame:(HttpRequestHelperCompletion)completion uid:(NSString *)uid; +/// 获取首页个播浏览记录 +/// @param complection 完成 +/// @param uid 用户的uid ++ (void)onceLookAnchorRoomComplection:(HttpRequestHelperCompletion)complection uid:(NSString *)uid; + @end NS_ASSUME_NONNULL_END diff --git a/xplan-ios/Main/Home/Api/Api+Home.m b/xplan-ios/Main/Home/Api/Api+Home.m index f53c2dcd..1e010820 100644 --- a/xplan-ios/Main/Home/Api/Api+Home.m +++ b/xplan-ios/Main/Home/Api/Api+Home.m @@ -73,8 +73,8 @@ /// 请求个播放更多房间列表 /// @param completion 完成 -+ (void)homeAnchorMoreRoomList:(HttpRequestHelperCompletion)completion { - [self makeRequest:@"single/broadcast/morePopularityAnchorList" method:HttpRequestHelperMethodGET completion:completion, __FUNCTION__, nil]; ++ (void)homeAnchorMoreRoomList:(HttpRequestHelperCompletion)completion singleRoomSortId:(NSString *)singleRoomSortId { + [self makeRequest:@"single/broadcast/morePopularityAnchorList" method:HttpRequestHelperMethodGET completion:completion, __FUNCTION__, singleRoomSortId, nil]; } /// 请求热门房间列表 @@ -135,4 +135,11 @@ [self makeRequest:@"home/fastPick" method:HttpRequestHelperMethodGET completion:completion, __FUNCTION__, uid, nil]; } +/// 获取首页个播浏览记录 +/// @param complection 完成 +/// @param uid 用户的uid ++ (void)onceLookAnchorRoomComplection:(HttpRequestHelperCompletion)complection uid:(NSString *)uid { + [self makeRequest:@"single/broadcast/onceLook" method:HttpRequestHelperMethodGET completion:complection, __FUNCTION__, uid, nil]; +} + @end diff --git a/xplan-ios/Main/Home/Model/HomeLiveLookRecordModel.h b/xplan-ios/Main/Home/Model/HomeLiveLookRecordModel.h new file mode 100644 index 00000000..7bc3ec05 --- /dev/null +++ b/xplan-ios/Main/Home/Model/HomeLiveLookRecordModel.h @@ -0,0 +1,21 @@ +// +// HomeLiveLookRecordModel.h +// xplan-ios +// +// Created by GreenLand on 2022/7/18. +// 个播房浏览记录 + +#import + +NS_ASSUME_NONNULL_BEGIN +@class HomeRecommendRoomModel; +@interface HomeLiveLookRecordModel : NSObject + +///是否有历史浏览记录 +@property (nonatomic, assign) BOOL onceLookStatus; + +@property (nonatomic, strong) NSArray *singleRoomList; + +@end + +NS_ASSUME_NONNULL_END diff --git a/xplan-ios/Main/Home/Model/HomeLiveLookRecordModel.m b/xplan-ios/Main/Home/Model/HomeLiveLookRecordModel.m new file mode 100644 index 00000000..5e33e2c6 --- /dev/null +++ b/xplan-ios/Main/Home/Model/HomeLiveLookRecordModel.m @@ -0,0 +1,19 @@ +// +// HomeLiveLookRecordModel.m +// xplan-ios +// +// Created by GreenLand on 2022/7/18. +// + +#import "HomeLiveLookRecordModel.h" +#import "HomeRecommendRoomModel.h" + +@implementation HomeLiveLookRecordModel + ++ (NSDictionary *)objectClassInArray { + return @{ + @"singleRoomList": [HomeRecommendRoomModel class] + }; +} + +@end diff --git a/xplan-ios/Main/Home/Model/HomeRecommendRoomModel.h b/xplan-ios/Main/Home/Model/HomeRecommendRoomModel.h index 76150c2f..0877b0e3 100644 --- a/xplan-ios/Main/Home/Model/HomeRecommendRoomModel.h +++ b/xplan-ios/Main/Home/Model/HomeRecommendRoomModel.h @@ -38,6 +38,9 @@ NS_ASSUME_NONNULL_BEGIN @property (nonatomic,copy) NSString *iconContent; ///是否在跨房PK中 @property (nonatomic, assign) BOOL crossPking; +///是否是推荐房间 +@property (nonatomic, assign) BOOL isRecommend; + @end NS_ASSUME_NONNULL_END diff --git a/xplan-ios/Main/Home/Presenter/XPHomeLivePresenter.h b/xplan-ios/Main/Home/Presenter/XPHomeLivePresenter.h index 61929326..8c8ad8c3 100644 --- a/xplan-ios/Main/Home/Presenter/XPHomeLivePresenter.h +++ b/xplan-ios/Main/Home/Presenter/XPHomeLivePresenter.h @@ -11,9 +11,16 @@ NS_ASSUME_NONNULL_BEGIN @interface XPHomeLivePresenter : BaseMvpPresenter +/// 获取曾经看过的个播房列表 +- (void)getOnceLookRoom; + /// 获取所有的直播tag列表 - (void)getHomeLiveTagList; +/// 获取更多的个播房间 +/// @param tabId 个播tabId +- (void)getHomeMoreAnchorRoomListWithTabId:(NSString *)tabId; + @end NS_ASSUME_NONNULL_END diff --git a/xplan-ios/Main/Home/Presenter/XPHomeLivePresenter.m b/xplan-ios/Main/Home/Presenter/XPHomeLivePresenter.m index f6c3cc62..628cdcc7 100644 --- a/xplan-ios/Main/Home/Presenter/XPHomeLivePresenter.m +++ b/xplan-ios/Main/Home/Presenter/XPHomeLivePresenter.m @@ -10,16 +10,48 @@ #import "AccountInfoStorage.h" #import "HomeLiveTagModel.h" #import "XPHomeLiveProtocol.h" +#import "HomeLiveLookRecordModel.h" +#import "HomeRecommendRoomModel.h" @implementation XPHomeLivePresenter +/// 获取曾经看过的个播房列表 +- (void)getOnceLookRoom { + NSString * uid = [[AccountInfoStorage instance] getUid]; + [Api onceLookAnchorRoomComplection:[self createHttpCompletion:^(BaseModel * _Nonnull data) { + HomeLiveLookRecordModel *model = [HomeLiveLookRecordModel modelWithJSON:data.data]; + [[self getView] getOnceLookRoomListSuccess:model]; + }] uid:uid]; +} + /// 获取所有的直播tag列表 - (void)getHomeLiveTagList { NSString * uid = [[AccountInfoStorage instance] getUid]; [Api homeLiveTagComplection:[self createHttpCompletion:^(BaseModel * _Nonnull data) { - NSArray * array = [HomeLiveTagModel modelsWithArray:data.data]; + HomeLiveTagModel *recommend = [[HomeLiveTagModel alloc] init]; + recommend.sortName = @"推荐"; + NSMutableArray *array = [NSMutableArray array]; + [array addObject:recommend]; + NSArray * arrayData = [HomeLiveTagModel modelsWithArray:data.data]; + [array addObjectsFromArray:arrayData]; [[self getView] getHomeLiveTagListSuccess:array]; + } fail:^(NSInteger code, NSString * _Nullable msg) { + HomeLiveTagModel *recommend = [[HomeLiveTagModel alloc] init]; + recommend.sortName = @"推荐"; + NSMutableArray *array = [NSMutableArray array]; + [array addObject:recommend]; + [[self getView] getHomeLiveTagListFail:array]; }] uid:uid]; } +/// 获取更多的个播房间 +/// @param tabId 个播tabId +- (void)getHomeMoreAnchorRoomListWithTabId:(NSString *)tabId { + [Api homeAnchorMoreRoomList:[self createHttpCompletion:^(BaseModel * _Nonnull data) { + NSArray * array = [HomeRecommendRoomModel modelsWithArray:data.data]; + [[self getView] getAnchorRoomListSuccess:array]; + }fail:^(NSInteger code, NSString * _Nullable msg) { + }] singleRoomSortId:tabId ? tabId : @""]; +} + @end diff --git a/xplan-ios/Main/Home/Presenter/XPHomePresenter.m b/xplan-ios/Main/Home/Presenter/XPHomePresenter.m index 3b1d86c6..291eba0b 100644 --- a/xplan-ios/Main/Home/Presenter/XPHomePresenter.m +++ b/xplan-ios/Main/Home/Presenter/XPHomePresenter.m @@ -38,7 +38,7 @@ [[self getView] getHomeMoreAnchorRoomListSuccess:array]; }fail:^(NSInteger code, NSString * _Nullable msg) { [[self getView] getHomeMoreAnchorRoomListFail:msg]; - }]]; + }] singleRoomSortId:@""]; } @end diff --git a/xplan-ios/Main/Home/Protocol/XPHomeLiveProtocol.h b/xplan-ios/Main/Home/Protocol/XPHomeLiveProtocol.h index 8c380f72..8ccf56f4 100644 --- a/xplan-ios/Main/Home/Protocol/XPHomeLiveProtocol.h +++ b/xplan-ios/Main/Home/Protocol/XPHomeLiveProtocol.h @@ -7,10 +7,18 @@ #import -@class HomeLiveTagModel; +@class HomeLiveTagModel, HomeLiveLookRecordModel, HomeRecommendRoomModel; @protocol XPHomeLiveProtocol +///获取个播浏览记录成功 +- (void)getOnceLookRoomListSuccess:(HomeLiveLookRecordModel *)data; + ///获取所有的tag成功 - (void)getHomeLiveTagListSuccess:(NSArray *)array; +///获取所有的tag失败 +- (void)getHomeLiveTagListFail:(NSArray *)array; + +///获取个播房成功 +- (void)getAnchorRoomListSuccess:(NSArray *)array; @end diff --git a/xplan-ios/Main/Home/View/Cell/XPHomeLiveRecordCell.h b/xplan-ios/Main/Home/View/Cell/XPHomeLiveRecordCell.h new file mode 100644 index 00000000..a74b527c --- /dev/null +++ b/xplan-ios/Main/Home/View/Cell/XPHomeLiveRecordCell.h @@ -0,0 +1,19 @@ +// +// XPHomeLiveRecordCell.h +// xplan-ios +// +// Created by GreenLand on 2022/7/18. +// + +#import + +NS_ASSUME_NONNULL_BEGIN +@class HomeRecommendRoomModel; + +@interface XPHomeLiveRecordCell : UICollectionViewCell + +@property (nonatomic,strong) HomeRecommendRoomModel *recordRoom; + +@end + +NS_ASSUME_NONNULL_END diff --git a/xplan-ios/Main/Home/View/Cell/XPHomeLiveRecordCell.m b/xplan-ios/Main/Home/View/Cell/XPHomeLiveRecordCell.m new file mode 100644 index 00000000..7e78980c --- /dev/null +++ b/xplan-ios/Main/Home/View/Cell/XPHomeLiveRecordCell.m @@ -0,0 +1,127 @@ +// +// XPHomeLiveRecordCell.m +// xplan-ios +// +// Created by GreenLand on 2022/7/18. +// + +#import "XPHomeLiveRecordCell.h" +///Third +#import +///Tool +#import "NetImageView.h" +#import "ThemeColor.h" +#import "UIImage+Utils.h" +///Model +#import "HomeRecommendRoomModel.h" + +@interface XPHomeLiveRecordCell () + +///头像 +@property (nonatomic,strong) NetImageView *avatarImageView; +///昵称 +@property (nonatomic,strong) UILabel *nickLabel; +///是否推荐标签 +@property (nonatomic, strong) UIImageView *tagImageView; +///推荐 +@property (nonatomic, strong) UILabel *recommendLabel; + +@end + +@implementation XPHomeLiveRecordCell + +- (instancetype)initWithFrame:(CGRect)frame +{ + self = [super initWithFrame:frame]; + if (self) { + [self initSubViews]; + [self initSubViewConstraints]; + } + return self; +} + +#pragma mark - Private Method +- (void)initSubViews { + [self.contentView addSubview:self.avatarImageView]; + [self.contentView addSubview:self.nickLabel]; + [self.contentView addSubview:self.tagImageView]; + [self.contentView addSubview:self.recommendLabel]; +} + +- (void)initSubViewConstraints { + [self.avatarImageView mas_makeConstraints:^(MASConstraintMaker *make) { + make.size.mas_equalTo(CGSizeMake(60, 60)); + make.left.mas_equalTo(self.contentView).mas_offset(2); + make.top.mas_equalTo(self.contentView).mas_offset(1); + }]; + + [self.tagImageView mas_makeConstraints:^(MASConstraintMaker *make) { + make.left.top.mas_equalTo(self.contentView); + make.width.mas_equalTo(26); + make.height.mas_equalTo(13); + }]; + + [self.nickLabel mas_makeConstraints:^(MASConstraintMaker *make) { + make.left.right.mas_equalTo(0); + make.top.mas_equalTo(self.avatarImageView.mas_bottom).offset(8); + }]; + [self.recommendLabel mas_makeConstraints:^(MASConstraintMaker *make) { + make.left.mas_equalTo(self.tagImageView).mas_offset(4); + make.top.mas_equalTo(self.tagImageView).mas_offset(1); + }]; +} + +#pragma mark - Getters And Setters +- (void)setRecordRoom:(HomeRecommendRoomModel *)recordRoom { + _recordRoom = recordRoom; + if (_recordRoom) { + self.avatarImageView.imageUrl = _recordRoom.avatar; + self.nickLabel.text = _recordRoom.nick; + self.tagImageView.hidden = !recordRoom.isRecommend; + self.recommendLabel.hidden = !recordRoom.isRecommend; + } +} + +- (NetImageView *)avatarImageView { + if (!_avatarImageView) { + NetImageConfig * config = [[NetImageConfig alloc]init]; + config.imageType = ImageTypeUserIcon; + config.placeHolder = [UIImageConstant defaultAvatarPlaceholder]; + _avatarImageView = [[NetImageView alloc] initWithConfig:config]; + _avatarImageView.layer.masksToBounds = YES; + _avatarImageView.layer.cornerRadius = 8; + } + return _avatarImageView; +} + +- (UILabel *)nickLabel { + if (!_nickLabel) { + _nickLabel = [[UILabel alloc] init]; + _nickLabel.font = [UIFont systemFontOfSize:10]; + _nickLabel.textColor = [ThemeColor mainTextColor]; + _nickLabel.textAlignment = NSTextAlignmentCenter; + } + return _nickLabel; +} + +- (UILabel *)recommendLabel { + if (!_recommendLabel) { + _recommendLabel = [[UILabel alloc] init]; + _recommendLabel.text = @"推荐"; + _recommendLabel.font = [UIFont systemFontOfSize:8]; + _recommendLabel.textColor = [UIColor whiteColor]; + _recommendLabel.textAlignment = NSTextAlignmentCenter; + } + return _recommendLabel; +} + +- (UIImageView *)tagImageView { + if (!_tagImageView) { + _tagImageView = [[UIImageView alloc] init]; + _tagImageView.image = [UIImage imageNamed:@"home_live_recommend_tag"]; + _tagImageView.contentMode = UIViewContentModeScaleAspectFit; + } + return _tagImageView; +} + +@end diff --git a/xplan-ios/Main/Home/View/SubViews/XPHomeLiveHeadView.h b/xplan-ios/Main/Home/View/SubViews/XPHomeLiveHeadView.h new file mode 100644 index 00000000..cce99f29 --- /dev/null +++ b/xplan-ios/Main/Home/View/SubViews/XPHomeLiveHeadView.h @@ -0,0 +1,34 @@ +// +// XPHomeLiveHeadView.h +// xplan-ios +// +// Created by GreenLand on 2022/7/18. +// + +#import + +NS_ASSUME_NONNULL_BEGIN + +@class HomeRecommendRoomModel; +@protocol XPHomeLiveHeadViewDelegate +///点击了某个item +- (void)xPHomeLiveHeadViewDidClickItem:(HomeRecommendRoomModel *)model; + +@end +@interface XPHomeLiveHeadView : UIView + +///当前的控制器 +@property (nonatomic,weak) UIViewController *currenViewController; + +///获取当前View的高度 ++ (CGFloat)getHomeLiveHeaderViewHeight:(NSArray *)recommendList; +///浏览记录列表 +@property (nonatomic, strong) NSMutableArray *roomList; +///是否有历史浏览记录 +@property (nonatomic, assign) BOOL hadHistoryRecord; + +@property (nonatomic, weak) id delegate; + +@end + +NS_ASSUME_NONNULL_END diff --git a/xplan-ios/Main/Home/View/SubViews/XPHomeLiveHeadView.m b/xplan-ios/Main/Home/View/SubViews/XPHomeLiveHeadView.m new file mode 100644 index 00000000..b12791c7 --- /dev/null +++ b/xplan-ios/Main/Home/View/SubViews/XPHomeLiveHeadView.m @@ -0,0 +1,159 @@ +// +// XPHomeLiveHeadView.m +// xplan-ios +// +// Created by GreenLand on 2022/7/18. +// + +#import "XPHomeLiveHeadView.h" +#import "HomeRecommendRoomModel.h" +///Third +#import +#import "ThemeColor.h" +#import "XPMacro.h" +///View +#import "XPHomeLiveRecordCell.h" + +@interface XPHomeLiveHeadView() + +@property (nonatomic, strong) UIImageView *bgImageView; +@property (nonatomic, strong) UIImageView *iconImageView; +@property (nonatomic, strong) UILabel *titleLabel; +///列表 +@property (nonatomic,strong) UICollectionView *collectionView; + +@end + +@implementation XPHomeLiveHeadView + +- (instancetype)initWithFrame:(CGRect)frame +{ + self = [super initWithFrame:frame]; + if (self) { + [self initSubViews]; + [self initSubViewConstraints]; + self.clipsToBounds = YES; + } + return self; +} +#pragma mark - Public Method ++ (CGFloat)getHomeLiveHeaderViewHeight:(NSArray *)recommendList { + CGFloat totaHeight = 0; + if (recommendList.count) { + totaHeight = 127 + 8; + } + return totaHeight; +} + +#pragma mark - Private Method +- (void)initSubViews { + [self addSubview:self.bgImageView]; + [self addSubview:self.iconImageView]; + [self addSubview:self.titleLabel]; + [self addSubview:self.collectionView]; +} + +- (void)initSubViewConstraints { + [self.bgImageView mas_makeConstraints:^(MASConstraintMaker *make) { + make.left.mas_equalTo(15); + make.right.mas_equalTo(-15); + make.top.mas_equalTo(8); + make.bottom.mas_equalTo(0); + }]; + + [self.iconImageView mas_makeConstraints:^(MASConstraintMaker *make) { + make.left.mas_equalTo(self.bgImageView).mas_offset(14); + make.top.mas_equalTo(self.bgImageView).mas_offset(6); + make.width.height.mas_equalTo(16); + }]; + + [self.titleLabel mas_makeConstraints:^(MASConstraintMaker *make) { + make.left.mas_equalTo(self.iconImageView.mas_right).mas_offset(4); + make.centerY.mas_equalTo(self.iconImageView); + }]; + [self.collectionView mas_makeConstraints:^(MASConstraintMaker *make) { + make.left.right.bottom.mas_equalTo(self.bgImageView); + make.top.mas_equalTo(self.iconImageView.mas_bottom).mas_offset(8); + }]; +} + +#pragma mark - UICollectionViewCellDelegate And UICollectionViewDatasource +- (__kindof UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath { + XPHomeLiveRecordCell * cell = [collectionView dequeueReusableCellWithReuseIdentifier:NSStringFromClass([XPHomeLiveRecordCell class]) forIndexPath:indexPath]; + cell.recordRoom = [self.roomList objectAtIndex:indexPath.item]; + return cell; +} + +- (NSInteger)collectionView:(UICollectionView *)collectionView numberOfItemsInSection:(NSInteger)section { + return self.roomList.count; +} + +- (void)collectionView:(UICollectionView *)collectionView didSelectItemAtIndexPath:(NSIndexPath *)indexPath { + [collectionView deselectItemAtIndexPath:indexPath animated:YES]; + if (self.roomList.count > 0) { + HomeRecommendRoomModel * liveModel = [self.roomList objectAtIndex:indexPath.item]; + if (self.delegate && [self.delegate respondsToSelector:@selector(xPHomeLiveHeadViewDidClickItem:)]) { + [self.delegate xPHomeLiveHeadViewDidClickItem:liveModel]; + } + } +} + +#pragma mark - Getters And Setters +- (void)setRoomList:(NSMutableArray *)roomList { + _roomList = roomList; + [self.collectionView reloadData]; +} + +- (void)setHadHistoryRecord:(BOOL)hadHistoryRecord { + if (hadHistoryRecord) { + self.bgImageView.image = [UIImage imageNamed:@"home_live_record_bg"]; + self.titleLabel.text = @"曾经看过的人"; + } else { + self.bgImageView.image = [UIImage imageNamed:@"home_live_hot_bg"]; + self.titleLabel.text = @"Top热播"; + } +} + +- (UICollectionView *)collectionView{ + if (!_collectionView) { + UICollectionViewFlowLayout *layout = [[UICollectionViewFlowLayout alloc] init]; + layout.scrollDirection = UICollectionViewScrollDirectionHorizontal; + layout.minimumLineSpacing = 12; + layout.itemSize = CGSizeMake(62, 80); + layout.sectionInset = UIEdgeInsetsMake(0, 15, 0, 15); + _collectionView = [[UICollectionView alloc] initWithFrame:CGRectZero collectionViewLayout:layout]; + _collectionView.dataSource = self; + _collectionView.delegate = self; + _collectionView.backgroundColor = [UIColor clearColor]; + [_collectionView registerClass:[XPHomeLiveRecordCell class] forCellWithReuseIdentifier:NSStringFromClass([XPHomeLiveRecordCell class])]; + } + return _collectionView; +} + +- (UIImageView *)bgImageView { + if (!_bgImageView) { + _bgImageView = [[UIImageView alloc] init]; + _bgImageView.image = [UIImage imageNamed:@"home_live_record_bg"]; + } + return _bgImageView; +} + +- (UIImageView *)iconImageView { + if (!_iconImageView) { + _iconImageView = [[UIImageView alloc] init]; + _iconImageView.image = [UIImage imageNamed:@"home_live_record_icon"]; + } + return _iconImageView; +} + +- (UILabel *)titleLabel { + if (!_titleLabel) { + _titleLabel = [[UILabel alloc] init]; + _titleLabel.font = [UIFont systemFontOfSize:14 weight:UIFontWeightMedium]; + _titleLabel.textColor = [ThemeColor mainTextColor]; + _titleLabel.text = @"曾经看过的人"; + } + return _titleLabel; +} + +@end diff --git a/xplan-ios/Main/Home/View/XPHomeLivePageViewController.h b/xplan-ios/Main/Home/View/XPHomeLivePageViewController.h new file mode 100644 index 00000000..74c7d63b --- /dev/null +++ b/xplan-ios/Main/Home/View/XPHomeLivePageViewController.h @@ -0,0 +1,22 @@ +// +// XPHomeLivePageViewController.h +// xplan-ios +// +// Created by GreenLand on 2022/7/18. +// + +#import "MvpViewController.h" +#import + +NS_ASSUME_NONNULL_BEGIN + +@interface XPHomeLivePageViewController : MvpViewController + +///模块的 ID +@property (nonatomic,copy) NSString *tabId; + +- (void)configLiveRoomList:(NSArray *)list; + +@end + +NS_ASSUME_NONNULL_END diff --git a/xplan-ios/Main/Home/View/XPHomeLivePageViewController.m b/xplan-ios/Main/Home/View/XPHomeLivePageViewController.m new file mode 100644 index 00000000..84b74ed1 --- /dev/null +++ b/xplan-ios/Main/Home/View/XPHomeLivePageViewController.m @@ -0,0 +1,196 @@ +// +// XPHomeLivePageViewController.m +// xplan-ios +// +// Created by GreenLand on 2022/7/18. +// + +#import "XPHomeLivePageViewController.h" +///Third +#import +#import +///Tool +#import "ThemeColor.h" +#import "XPMacro.h" +///View +#import "XPHomeHapppyRoomTableViewCell.h" +#import "XPHomeBannerTableViewCell.h" +#import "XPHomeListEmptyTableViewCell.h" +#import "XPHomeListCollectionViewCell.h" +#import "XPHomeListEmptyCollectionViewCell.h" +///Model +#import "HomePlayRoomModel.h" +#import "HomeRecommendRoomModel.h" +///VC +#import "XPWebViewController.h" +#import "XPRoomViewController.h" +#import "XPHomeLivePresenter.h" +#import "XPHomeLiveProtocol.h" + +@interface XPHomeLivePageViewController () +///列表 +@property (nonatomic,strong) UICollectionView *collectionView; +@property (nonatomic, copy) void(^scrollCallback)(UIScrollView *scrollView); +///没有新的数据了 +@property (nonatomic,assign) BOOL hasNoMoreData; +///数据源 +@property (nonatomic,strong) NSMutableArray *datasource; +@end + +@implementation XPHomeLivePageViewController + +- (BOOL)isHiddenNavBar { + return YES; +} + +- (XPHomeLivePresenter *)createPresenter { + return [[XPHomeLivePresenter alloc] init]; +} + +- (void)viewDidLoad { + [super viewDidLoad]; + [self headerRefresh]; + [self initSubViews]; + [self initSubViewConstraints]; +} + +#pragma mark - Private Method +- (void)initSubViews { + self.view.backgroundColor = [UIColor clearColor]; + [self.view addSubview:self.collectionView]; +} + +- (void)initSubViewConstraints { + [self.collectionView mas_makeConstraints:^(MASConstraintMaker *make) { + make.edges.mas_equalTo(self.view); + }]; +} + +#pragma mark - 刷新的fangfa +- (void)headerRefresh { + [self.presenter getHomeMoreAnchorRoomListWithTabId:self.tabId]; +} + +#pragma mark - UICollectionViewDataSource +- (NSInteger)collectionView:(UICollectionView *)collectionView numberOfItemsInSection:(NSInteger)section { + return self.datasource.count > 0 ? self.datasource.count : 1; +} + +- (__kindof UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath { + if (self.datasource.count > 0) { + XPHomeListCollectionViewCell * cell = [collectionView dequeueReusableCellWithReuseIdentifier:NSStringFromClass([XPHomeListCollectionViewCell class]) forIndexPath:indexPath]; + HomeRecommendRoomModel * model = [self.datasource objectAtIndex:indexPath.item]; + cell.roomModel = model; + return cell; + } + + XPHomeListEmptyCollectionViewCell * emptyCell = [collectionView dequeueReusableCellWithReuseIdentifier:NSStringFromClass([XPHomeListEmptyCollectionViewCell class]) forIndexPath:indexPath]; + return emptyCell; + +} +#pragma mark - UICollectionViewDelegate +- (void)collectionView:(UICollectionView *)collectionView didSelectItemAtIndexPath:(NSIndexPath *)indexPath { + [collectionView deselectItemAtIndexPath:indexPath animated:YES]; + if (self.datasource.count > 0) { + HomeRecommendRoomModel * model = [self.datasource objectAtIndex:indexPath.item]; + NSString *roomUid = model.uid; + if (roomUid.length > 0) { + [XPRoomViewController openRoom:roomUid viewController:self]; + } + } +} + +- (CGSize)collectionView:(UICollectionView *)collectionView layout:(UICollectionViewLayout *)collectionViewLayout sizeForItemAtIndexPath:(NSIndexPath *)indexPath { + if (self.datasource.count <= 0) { + return CGSizeMake(KScreenWidth, KScreenHeight- kNavigationHeight - 49 - 20); + } + return CGSizeMake((KScreenWidth - 15 * 3) / 2, 157 + 36); +} + +#pragma mark - XPHomeProtocol +- (void)getHomeRecommendRoomListSuccess:(NSArray *)list state:(BOOL)state { + if (state == 0) { + self.hasNoMoreData = NO; + [self.datasource removeAllObjects]; + [self.collectionView.mj_header endRefreshing]; + } else { + [self.collectionView.mj_footer endRefreshing]; + } + if (list.count > 0) { + self.hasNoMoreData = NO; + [self.datasource addObjectsFromArray:list]; + } else { + self.hasNoMoreData = YES; + } + [self.collectionView reloadData]; +} +- (void)getHomeRecommendRoomListFail:(NSString *)message state:(BOOL)state { + if (state ==0) { + [self.collectionView.mj_header endRefreshing]; + } else { + [self.collectionView.mj_footer endRefreshing]; + } +} + +///获取个播房列表成功 +- (void)getAnchorRoomListSuccess:(NSArray *)array { + [self.datasource removeAllObjects]; + [self.datasource addObjectsFromArray:array]; + [self.collectionView reloadData]; +} + +- (void)getHomeMoreAnchorRoomListFail:(NSString *)messag { + [self.collectionView.mj_header endRefreshing]; + [self.collectionView.mj_footer endRefreshing]; +} + +#pragma mark - JXPagingViewListViewDelegate +- (UIView *)listView { + return self.view; +} + +- (UIScrollView *)listScrollView { + return self.collectionView; +} + +- (void)listViewDidScrollCallback:(void (^)(UIScrollView *))callback { + self.scrollCallback = callback; +} + +- (void)scrollViewDidScroll:(UIScrollView *)scrollView { + self.scrollCallback(scrollView); +} +#pragma mark - Getters And Setters + +- (void)setTabId:(NSString *)tabId { + _tabId = tabId; + dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(0.2 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{ + [self headerRefresh]; + }); +} + +- (UICollectionView *)collectionView{ + if (!_collectionView) { + UICollectionViewFlowLayout *layout = [[UICollectionViewFlowLayout alloc] init]; + + layout.minimumLineSpacing = 0; + layout.minimumInteritemSpacing = 15; + layout.sectionInset = UIEdgeInsetsMake(0, 15, 0, 15); + _collectionView = [[UICollectionView alloc] initWithFrame:CGRectZero collectionViewLayout:layout]; + _collectionView.dataSource = self; + _collectionView.delegate = self; + _collectionView.backgroundColor = [UIColor clearColor]; + [_collectionView registerClass:[XPHomeListCollectionViewCell class] forCellWithReuseIdentifier:NSStringFromClass([XPHomeListCollectionViewCell class])]; + [_collectionView registerClass:[XPHomeListEmptyCollectionViewCell class] forCellWithReuseIdentifier:NSStringFromClass([XPHomeListEmptyCollectionViewCell class])]; + } + return _collectionView; +} + +- (NSMutableArray *)datasource { + if (!_datasource) { + _datasource = [NSMutableArray array]; + } + return _datasource; +} + +@end diff --git a/xplan-ios/Main/Home/View/XPHomeLivesViewController.m b/xplan-ios/Main/Home/View/XPHomeLivesViewController.m index 17140f06..046e43fc 100644 --- a/xplan-ios/Main/Home/View/XPHomeLivesViewController.m +++ b/xplan-ios/Main/Home/View/XPHomeLivesViewController.m @@ -11,107 +11,104 @@ #import #import #import +#import +#import ///Tool #import "XPMacro.h" #import "ThemeColor.h" #import "XPHtmlUrl.h" ///Model #import "HomeLiveTagModel.h" +#import "HomeLiveLookRecordModel.h" +#import "HomeRecommendRoomModel.h" ///View #import "XPRoomSearchContainerViewController.h" #import "XPHomePartyViewController.h" #import "XPWebViewController.h" #import "XPHomeLikeViewController.h" #import "XPHomeLittleGameViewController.h" +#import "XPHomeLiveHeadView.h" +#import "XPHomeHappyViewController.h" +#import "XPHomeLivePageViewController.h" +#import "XPMineUserInfoViewController.h" +#import "XPRoomViewController.h" ///P #import "XPHomeLivePresenter.h" #import "XPHomeLiveProtocol.h" UIKIT_EXTERN NSString * kHomeMoreScrollPageKey; -@interface XPHomeLivesViewController () + +@interface XPHomeLivesViewController () ///分页标题 @property (nonatomic, strong) NSArray *titles; +@property (nonatomic, strong) JXPagerView *pagingView; ///分页控件 @property (nonatomic, strong) JXCategoryTitleView *titleView; ///分页lineView @property (nonatomic, strong) JXCategoryListContainerView *contentView; ///tag的列表 @property (nonatomic,copy) NSArray *tagList; +///头部浏览记录 +@property (nonatomic, strong) XPHomeLiveHeadView *headerView; +///浏览记录房间列表 +@property (nonatomic, strong) NSArray *roomList; @end @implementation XPHomeLivesViewController +- (XPHomeLivePresenter *)createPresenter { + return [[XPHomeLivePresenter alloc] init]; +} + - (BOOL)isHiddenNavBar { return YES; } -- (XPHomeLivePresenter *)createPresenter { - return [[XPHomeLivePresenter alloc] init]; -} - (void)viewDidLoad { [super viewDidLoad]; - [self initHttp]; + [self initHeaderAndFooterRrfresh]; [self initSubViews]; - [self initSubViewConstraints]; +} + +- (void)viewDidLayoutSubviews { + [super viewDidLayoutSubviews]; + self.pagingView.frame = self.view.bounds; +} + +#pragma mark - InitHttp +- (void)headerRefresh { + self.titleView.defaultSelectedIndex = 0; + [self.presenter getOnceLookRoom]; + [self.presenter getHomeLiveTagList]; +} + +- (void)initHeaderAndFooterRrfresh { + MJRefreshNormalHeader *header = [MJRefreshNormalHeader headerWithRefreshingTarget:self refreshingAction:@selector(headerRefresh)]; + header.stateLabel.font = [UIFont systemFontOfSize:10.0]; + header.lastUpdatedTimeLabel.font = [UIFont systemFontOfSize:10.0]; + header.stateLabel.textColor = [ThemeColor secondTextColor]; + header.lastUpdatedTimeLabel.textColor = [ThemeColor secondTextColor]; + self.pagingView.mainTableView.mj_header = header; + [self headerRefresh]; } #pragma mark - Private Method - (void)initSubViews { - [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(recommendMoreNotification:) name:kHomeMoreScrollPageKey object:nil]; self.view.backgroundColor = [UIColor clearColor]; - [self.view addSubview:self.titleView]; - [self.view addSubview:self.contentView]; + [self.view addSubview:self.pagingView]; } -- (void)initSubViewConstraints { - [self.titleView mas_makeConstraints:^(MASConstraintMaker *make) { - make.top.mas_equalTo(self.view).offset(10); - make.left.right.mas_equalTo(self.view); - make.height.mas_equalTo(30); - }]; - - [self.contentView mas_makeConstraints:^(MASConstraintMaker *make) { - make.top.mas_equalTo(self.titleView.mas_bottom); - make.left.right.bottom.mas_equalTo(self.view); - }]; +#pragma mark - XPHomeRecommendProtocol +- (void)getOnceLookRoomListSuccess:(HomeLiveLookRecordModel *)data { + self.headerView.hadHistoryRecord = data.onceLookStatus; + self.headerView.roomList = [NSMutableArray arrayWithArray:data.singleRoomList]; + self.roomList = data.singleRoomList; + [self.pagingView reloadData]; } -- (void)initHttp { - [self.presenter getHomeLiveTagList]; -} - -#pragma mark - JXCategoryViewDelegate -- (NSInteger)numberOfListsInlistContainerView:(JXCategoryListContainerView *)listContainerView { - return self.titles.count; -} - -- (id)listContainerView:(JXCategoryListContainerView *)listContainerView initListForIndex:(NSInteger)index { - HomeLiveTagModel * hometag = [self.tagList objectAtIndex:index]; - UIViewController * list = (UIViewController *)[self.contentView.validListDict objectForKey:[NSNumber numberWithInteger:index]]; - if (list) { - return list; - } else { - XPHomePartyViewController * homeVC = [[XPHomePartyViewController alloc] init]; - homeVC.tabId = hometag.tid; - return homeVC; - } -} - -- (void)categoryView:(JXCategoryBaseView *)categoryView didSelectedItemAtIndex:(NSInteger)index { - HomeLiveTagModel * hometag = [self.tagList objectAtIndex:index]; - XPHomePartyViewController * list = (XPHomePartyViewController *)[self.contentView.validListDict objectForKey:[NSNumber numberWithInteger:index]];; - list.tabId = hometag.tid; -} - -#pragma mark - JXCategoryListContentViewDelegate -- (UIView *)listView { - return self.view; -} - -#pragma mark - XPHomeContainerProtocol - (void)getHomeLiveTagListSuccess:(NSArray *)array { self.tagList = array; NSMutableArray * titles = [NSMutableArray array]; @@ -123,16 +120,85 @@ UIKIT_EXTERN NSString * kHomeMoreScrollPageKey; self.titles = titles.copy; self.titleView.titles = self.titles; [self.titleView reloadData]; + [self.pagingView.mainTableView.mj_header endRefreshing]; + [self.pagingView reloadData]; } -#pragma mark - Event Response -- (void)recommendMoreNotification:(NSNotification *)notification { - NSDictionary * dic = notification.object; - dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(0.5 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{ - if ([[dic objectForKey:@"section"] integerValue] == 3) { - [self.titleView selectItemAtIndex:0]; +- (void)getHomeLiveTagListFail:(NSArray *)array { + self.tagList = array; + NSMutableArray * titles = [NSMutableArray array]; + [array enumerateObjectsUsingBlock:^(HomeLiveTagModel * _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) { + if (obj.sortName.length > 0) { + [titles addObject:obj.sortName]; } - }); + }]; + self.titles = titles.copy; + self.titleView.titles = self.titles; + [self.titleView reloadData]; + [self.pagingView.mainTableView.mj_header endRefreshing]; + [self.pagingView reloadData]; +} + +#pragma mark - JXCategoryListContentViewDelegate +- (UIView *)listView { + return self.view; +} + +#pragma mark - JXCategoryViewDelegate +- (NSUInteger)tableHeaderViewHeightInPagerView:(JXPagerView *)pagerView { + return [XPHomeLiveHeadView getHomeLiveHeaderViewHeight:self.roomList]; +} + +- (UIView *)tableHeaderViewInPagerView:(JXPagerView *)pagerView { + return self.headerView; +} + +- (NSUInteger)heightForPinSectionHeaderInPagerView:(JXPagerView *)pagerView { + return 50; +} + +- (UIView *)viewForPinSectionHeaderInPagerView:(JXPagerView *)pagerView { + return self.titleView; +} + +- (NSInteger)numberOfListsInPagerView:(JXPagerView *)pagerView { + return self.titles.count; +} + +- (id)pagerView:(JXPagerView *)pagerView initListAtIndex:(NSInteger)index { + UIViewController *viewController; + XPHomeLivePageViewController * homeVC = [[XPHomeLivePageViewController alloc] init]; + HomeLiveTagModel *tag = self.tagList[index]; + homeVC.tabId = tag.tid; + return homeVC; + return (id )viewController; +} + +- (void)categoryView:(JXCategoryBaseView *)categoryView didSelectedItemAtIndex:(NSInteger)index { +// HomeLiveTagModel *tag = self.tagList[index]; +// [self.presenter getHomeMoreAnchorRoomListWithTabId:tag.tid]; +// if ([title isEqualToString:@"开黑畅聊"]) { +// [self.presenter getPlayGameWithTeam:1]; +// } else { +// [self.presenter getHomePersonalRoomList]; +// } +} + +#pragma mark - JXPagerMainTableViewGestureDelegate +- (BOOL)mainTableViewGestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldRecognizeSimultaneouslyWithGestureRecognizer:(UIGestureRecognizer *)otherGestureRecognizer { + ///1000是外部的scrollView 1001是人气主播中的collectionView + if (otherGestureRecognizer.view.tag == 1000 || otherGestureRecognizer.view == self.headerView || otherGestureRecognizer.view.tag == 1001) { + return NO; + } + return [gestureRecognizer isKindOfClass:[UIPanGestureRecognizer class]] && [otherGestureRecognizer isKindOfClass:[UIPanGestureRecognizer class]]; +} + +#pragma mark - XPHomeLiveHeadViewDelegate +- (void)xPHomeLiveHeadViewDidClickItem:(HomeRecommendRoomModel *)model { + NSString *roomUid = model.uid; + if (roomUid.length > 0) { + [XPRoomViewController openRoom:roomUid viewController:self]; + } } #pragma mark - Getters And Setters @@ -140,36 +206,50 @@ UIKIT_EXTERN NSString * kHomeMoreScrollPageKey; if (!_titleView) { _titleView = [[JXCategoryTitleView alloc] init]; _titleView.delegate = self; - _titleView.titles = self.titles; _titleView.backgroundColor = [UIColor clearColor]; - _titleView.titleColor = [ThemeColor secondTextColor]; + _titleView.titleColor = [ThemeColor textThirdColor]; _titleView.titleSelectedColor = [ThemeColor mainTextColor]; - _titleView.titleFont = [UIFont fontWithName:@"PingFang-SC-Medium" size:13]; - _titleView.titleSelectedFont = [UIFont fontWithName:@"PingFang-SC-Medium" size:16]; + _titleView.titleFont = [UIFont fontWithName:@"PingFang-SC-Medium" size:14]; + _titleView.titleSelectedFont = [UIFont fontWithName:@"PingFang-SC-Medium" size:14]; _titleView.titleLabelAnchorPointStyle = JXCategoryTitleLabelAnchorPointStyleCenter; _titleView.contentScrollViewClickTransitionAnimationEnabled = NO; _titleView.defaultSelectedIndex = 0; - _titleView.cellSpacing = 20; - _titleView.cellWidthIncrement = 5; - _titleView.listContainer = self.contentView; _titleView.averageCellSpacingEnabled = NO; + _titleView.titles = self.titles; + _titleView.cellSpacing = 25; + _titleView.titles = self.titles; + _titleView.listContainer = (id)self.pagingView.listContainerView; JXCategoryIndicatorBackgroundView * indocator = [[JXCategoryIndicatorBackgroundView alloc] init]; indocator.indicatorColor = [ThemeColor appMainColor]; indocator.indicatorHeight = 24; - indocator.indicatorWidthIncrement = 15; + indocator.indicatorWidthIncrement = 20; indocator.indicatorCornerRadius = 12; _titleView.indicators = @[indocator]; } return _titleView; } -- (JXCategoryListContainerView *)contentView { - if (!_contentView) { - _contentView = [[JXCategoryListContainerView alloc] initWithType:JXCategoryListContainerType_ScrollView delegate:self]; - _contentView.defaultSelectedIndex = 0; +- (JXPagerView *)pagingView { + if (!_pagingView) { + _pagingView = [[JXPagerView alloc] initWithDelegate:self]; + _pagingView.backgroundColor = [UIColor clearColor]; + _pagingView.listContainerView.backgroundColor = [UIColor clearColor]; + _pagingView.mainTableView.backgroundColor = [UIColor clearColor]; + _pagingView.mainTableView.gestureDelegate = self; + _pagingView.listContainerView.listCellBackgroundColor = UIColor.clearColor; } - return _contentView; + return _pagingView; +} + +- (XPHomeLiveHeadView *)headerView { + if (!_headerView) { + _headerView = [[XPHomeLiveHeadView alloc] init]; + _headerView.backgroundColor = [UIColor clearColor]; + _headerView.currenViewController = self; + _headerView.delegate = self; + } + return _headerView; } @end