diff --git a/YuMi.xcodeproj/project.pbxproj b/YuMi.xcodeproj/project.pbxproj index 46489f30..efb6753f 100644 --- a/YuMi.xcodeproj/project.pbxproj +++ b/YuMi.xcodeproj/project.pbxproj @@ -536,6 +536,9 @@ 4CA532C32D5F37DC00B8F59F /* LuckyPackageMessageTableViewCell.m in Sources */ = {isa = PBXBuildFile; fileRef = 4CA532C22D5F37DC00B8F59F /* LuckyPackageMessageTableViewCell.m */; }; 4CA5A3342D93D4AB00CE41D6 /* 大.svga in Resources */ = {isa = PBXBuildFile; fileRef = 4CA5A3332D93D4AB00CE41D6 /* 大.svga */; }; 4CACCCE42D9A695000CCB135 /* brove_gift.svga in Resources */ = {isa = PBXBuildFile; fileRef = 4CACCCE32D9A695000CCB135 /* brove_gift.svga */; }; + 4CAFEFF62DD2F21B00CD81DF /* CreateEventPickerContainerView.m in Sources */ = {isa = PBXBuildFile; fileRef = 4CAFEFF52DD2F21B00CD81DF /* CreateEventPickerContainerView.m */; }; + 4CAFF00A2DD342A400CD81DF /* MessagePublicEventModel.m in Sources */ = {isa = PBXBuildFile; fileRef = 4CAFF0092DD342A400CD81DF /* MessagePublicEventModel.m */; }; + 4CAFF00D2DD343B200CD81DF /* PublicEventTableViewCell.m in Sources */ = {isa = PBXBuildFile; fileRef = 4CAFF00C2DD343B200CD81DF /* PublicEventTableViewCell.m */; }; 4CB753D22D30F10900B13DF5 /* LuckyPackageViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 4CB753D12D30F10900B13DF5 /* LuckyPackageViewController.m */; }; 4CBBB44C2DA66334001B1C6D /* MessageCPNotifyModel.m in Sources */ = {isa = PBXBuildFile; fileRef = 4CBBB44B2DA66334001B1C6D /* MessageCPNotifyModel.m */; }; 4CBDC4242DC0B078005A75B9 /* EventCenterViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 4CBDC4232DC0B078005A75B9 /* EventCenterViewController.m */; }; @@ -546,6 +549,9 @@ 4CC312272D79A10100F57A07 /* ShareProvider.m in Sources */ = {isa = PBXBuildFile; fileRef = 4CC312262D79A10100F57A07 /* ShareProvider.m */; }; 4CC6195A2CEC7770008C1EE8 /* MyDressingDataPresent.m in Sources */ = {isa = PBXBuildFile; fileRef = 4CC619592CEC7770008C1EE8 /* MyDressingDataPresent.m */; }; 4CC6195D2CEC996E008C1EE8 /* MyDressingDataModel.m in Sources */ = {isa = PBXBuildFile; fileRef = 4CC6195C2CEC996E008C1EE8 /* MyDressingDataModel.m */; }; + 4CCFDA002DD59038009BD2FD /* EventCenterEmptyCell.m in Sources */ = {isa = PBXBuildFile; fileRef = 4CCFD9FF2DD59038009BD2FD /* EventCenterEmptyCell.m */; }; + 4CCFDA032DD59211009BD2FD /* Api+EventCenter.m in Sources */ = {isa = PBXBuildFile; fileRef = 4CCFDA022DD59211009BD2FD /* Api+EventCenter.m */; }; + 4CCFDA062DD5C127009BD2FD /* EventItemModel.m in Sources */ = {isa = PBXBuildFile; fileRef = 4CCFDA052DD5C127009BD2FD /* EventItemModel.m */; }; 4CD15D912D7E902800D9279F /* LoginViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 4CD15D902D7E902800D9279F /* LoginViewController.m */; }; 4CD15D922D7EC2AC00D9279F /* CoreTelephony.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 23E56B3B2B03564B00C8DAC9 /* CoreTelephony.framework */; }; 4CD15D952D7FE9E400D9279F /* LoginTypesViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 4CD15D942D7FE9E400D9279F /* LoginTypesViewController.m */; }; @@ -2714,6 +2720,12 @@ 4CA532C22D5F37DC00B8F59F /* LuckyPackageMessageTableViewCell.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = LuckyPackageMessageTableViewCell.m; sourceTree = ""; }; 4CA5A3332D93D4AB00CE41D6 /* 大.svga */ = {isa = PBXFileReference; lastKnownFileType = file; path = "大.svga"; sourceTree = ""; }; 4CACCCE32D9A695000CCB135 /* brove_gift.svga */ = {isa = PBXFileReference; lastKnownFileType = file; path = brove_gift.svga; sourceTree = ""; }; + 4CAFEFF42DD2F21B00CD81DF /* CreateEventPickerContainerView.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = CreateEventPickerContainerView.h; sourceTree = ""; }; + 4CAFEFF52DD2F21B00CD81DF /* CreateEventPickerContainerView.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = CreateEventPickerContainerView.m; sourceTree = ""; }; + 4CAFF0082DD342A400CD81DF /* MessagePublicEventModel.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = MessagePublicEventModel.h; sourceTree = ""; }; + 4CAFF0092DD342A400CD81DF /* MessagePublicEventModel.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = MessagePublicEventModel.m; sourceTree = ""; }; + 4CAFF00B2DD343B200CD81DF /* PublicEventTableViewCell.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = PublicEventTableViewCell.h; sourceTree = ""; }; + 4CAFF00C2DD343B200CD81DF /* PublicEventTableViewCell.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = PublicEventTableViewCell.m; sourceTree = ""; }; 4CB753D02D30F10900B13DF5 /* LuckyPackageViewController.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = LuckyPackageViewController.h; sourceTree = ""; }; 4CB753D12D30F10900B13DF5 /* LuckyPackageViewController.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = LuckyPackageViewController.m; sourceTree = ""; }; 4CBBB44A2DA66334001B1C6D /* MessageCPNotifyModel.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = MessageCPNotifyModel.h; sourceTree = ""; }; @@ -2734,6 +2746,12 @@ 4CC619592CEC7770008C1EE8 /* MyDressingDataPresent.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = MyDressingDataPresent.m; sourceTree = ""; }; 4CC6195B2CEC996E008C1EE8 /* MyDressingDataModel.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = MyDressingDataModel.h; sourceTree = ""; }; 4CC6195C2CEC996E008C1EE8 /* MyDressingDataModel.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = MyDressingDataModel.m; sourceTree = ""; }; + 4CCFD9FE2DD59038009BD2FD /* EventCenterEmptyCell.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = EventCenterEmptyCell.h; sourceTree = ""; }; + 4CCFD9FF2DD59038009BD2FD /* EventCenterEmptyCell.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = EventCenterEmptyCell.m; sourceTree = ""; }; + 4CCFDA012DD59211009BD2FD /* Api+EventCenter.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "Api+EventCenter.h"; sourceTree = ""; }; + 4CCFDA022DD59211009BD2FD /* Api+EventCenter.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = "Api+EventCenter.m"; sourceTree = ""; }; + 4CCFDA042DD5C127009BD2FD /* EventItemModel.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = EventItemModel.h; sourceTree = ""; }; + 4CCFDA052DD5C127009BD2FD /* EventItemModel.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = EventItemModel.m; sourceTree = ""; }; 4CD15D8F2D7E902800D9279F /* LoginViewController.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = LoginViewController.h; sourceTree = ""; }; 4CD15D902D7E902800D9279F /* LoginViewController.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = LoginViewController.m; sourceTree = ""; }; 4CD15D932D7FE9E400D9279F /* LoginTypesViewController.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = LoginTypesViewController.h; sourceTree = ""; }; @@ -8107,6 +8125,8 @@ 4CD6FF652D673A5C00262AB7 /* AgentMessageModel.m */, 4CBBB44A2DA66334001B1C6D /* MessageCPNotifyModel.h */, 4CBBB44B2DA66334001B1C6D /* MessageCPNotifyModel.m */, + 4CAFF0082DD342A400CD81DF /* MessagePublicEventModel.h */, + 4CAFF0092DD342A400CD81DF /* MessagePublicEventModel.m */, ); path = SesssionModel; sourceTree = ""; @@ -9563,6 +9583,8 @@ E885D532297798E1004DC088 /* SessionSettingTableViewCell.m */, 4CD6FF672D673F7F00262AB7 /* AgentMessageTableViewCell.h */, 4CD6FF682D673F7F00262AB7 /* AgentMessageTableViewCell.m */, + 4CAFF00B2DD343B200CD81DF /* PublicEventTableViewCell.h */, + 4CAFF00C2DD343B200CD81DF /* PublicEventTableViewCell.m */, ); path = Cell; sourceTree = ""; @@ -10053,6 +10075,8 @@ E87E62522A3F55B2002F68C9 /* View */ = { isa = PBXGroup; children = ( + 4CAFEFF42DD2F21B00CD81DF /* CreateEventPickerContainerView.h */, + 4CAFEFF52DD2F21B00CD81DF /* CreateEventPickerContainerView.m */, E87DF4B82A42C7BB009C1185 /* Search */, E87E625F2A3F5669002F68C9 /* Cell */, E87E625E2A3F565D002F68C9 /* CustomView */, @@ -10087,6 +10111,8 @@ children = ( E8C6FFC927548120004DC9F0 /* Api+Home.h */, E8C6FFC827548120004DC9F0 /* Api+Home.m */, + 4CCFDA012DD59211009BD2FD /* Api+EventCenter.h */, + 4CCFDA022DD59211009BD2FD /* Api+EventCenter.m */, ); path = Api; sourceTree = ""; @@ -10118,6 +10144,8 @@ 23B8D8DA2B85FDDD00CA472F /* PIHomeCategoryTitleModel.m */, 54C389652C24464600FD47B1 /* HomeMineRoomModel.h */, 54C389662C24464600FD47B1 /* HomeMineRoomModel.m */, + 4CCFDA042DD5C127009BD2FD /* EventItemModel.h */, + 4CCFDA052DD5C127009BD2FD /* EventItemModel.m */, ); path = Model; sourceTree = ""; @@ -10168,6 +10196,8 @@ E87E62702A3F5907002F68C9 /* XPNewHomeRecommendTableViewCell.m */, 23FF42612AA5861E0055733C /* XPNewHomePartyCollectionViewCell.h */, 23FF42622AA5861E0055733C /* XPNewHomePartyCollectionViewCell.m */, + 4CCFD9FE2DD59038009BD2FD /* EventCenterEmptyCell.h */, + 4CCFD9FF2DD59038009BD2FD /* EventCenterEmptyCell.m */, 4CBDC4282DC0BB95005A75B9 /* EventCenterOfficialCell.h */, 4CBDC4292DC0BB95005A75B9 /* EventCenterOfficialCell.m */, 4CBDC42B2DC0BBB7005A75B9 /* EventCenterEventCell.h */, @@ -12256,6 +12286,7 @@ 23FE47D82BB3CEAF00F09D23 /* PINobleCenterTitleView.m in Sources */, 54C9A1252C3E74AE00C6D970 /* MessageGameOrderView.m in Sources */, 9BD9A18427A0F128004186FE /* XPMineVisitorItemModel.m in Sources */, + 4CAFF00D2DD343B200CD81DF /* PublicEventTableViewCell.m in Sources */, E852D73E28631C18001465ED /* XPMonentsCommentTableViewCell.m in Sources */, 54F4693B2C2A984D00A83655 /* MedalModel.m in Sources */, 23CEFC4E2AFB8FC100576D89 /* BSNSDictionary.m in Sources */, @@ -12264,6 +12295,7 @@ 1427219829A75F6F00C7C423 /* HTTPServer.m in Sources */, E80B0712280D0A6700A79F63 /* FansInfoModel.m in Sources */, 2305EEFB2AD696B400AD403C /* PIRoomPhotoAlbumChoosePhotoView.m in Sources */, + 4CCFDA062DD5C127009BD2FD /* EventItemModel.m in Sources */, E87E62682A3F571D002F68C9 /* XPHomeContainerPresenter.m in Sources */, E8EEB8F326FC2050007C6EBA /* SDWaitingView.m in Sources */, E85E7B2F2A4EB0D300B6D00A /* XPGoldIncomeSectionView.m in Sources */, @@ -12438,6 +12470,7 @@ 23CEFC4F2AFB8FC100576D89 /* BSSDLayoutUtil.m in Sources */, E81C27AB26EF2D920031E639 /* ThirdUserInfo.m in Sources */, 23FF25682ABC3BC00064E904 /* XPHomeGameCell.m in Sources */, + 4CCFDA002DD59038009BD2FD /* EventCenterEmptyCell.m in Sources */, E8788950273A699900BF1D57 /* ThemeColor+SendGift.m in Sources */, 23B8D8D82B85F8B900CA472F /* PIHoemCategoryTitleCell.m in Sources */, E81C279D26EEEC620031E639 /* YUMIConstant.m in Sources */, @@ -12820,6 +12853,7 @@ E82D5C70276AE60000858D6D /* HeadwearModel.m in Sources */, 4C5C37232D0C1C7900BA9AB8 /* RegionListViewController.m in Sources */, 4CE746C62D9297C30094E496 /* BravoGiftTipModel.m in Sources */, + 4CCFDA032DD59211009BD2FD /* Api+EventCenter.m in Sources */, 238B37CC2AC55A2C00BFC9D5 /* XPTreasureFairyPrizeSubView.m in Sources */, E81125C4296E57B7000D9804 /* QinputPhotoView.m in Sources */, E880B3A1278BD60C00A83B0D /* XPAcrossRoomPKSelectRoomView.m in Sources */, @@ -12963,6 +12997,7 @@ 9B208A362779B50100F9E54A /* GiftNobleInfoModel.m in Sources */, E80A086227F2AC190027B30C /* RoomPKDetailInfoModel.m in Sources */, 238B37CD2AC55A2C00BFC9D5 /* XPTreasureFailyResultView.m in Sources */, + 4CAFF00A2DD342A400CD81DF /* MessagePublicEventModel.m in Sources */, E824545126F5CE6E00BE8163 /* XPMineModifPayPwdPresenter.m in Sources */, E8098CB1282E86EF0090B9F0 /* XPMomentsContentView.m in Sources */, E85E3FA728B7A6F000268DC8 /* MessageContentMonentsView.m in Sources */, @@ -13160,6 +13195,7 @@ E839533F276A0CDB00CF2F24 /* XPMineNameplateTableViewCell.m in Sources */, E80E09AE2A41336500CD2BE7 /* XPWebViewNavView.m in Sources */, E85E7B2D2A4EB0D300B6D00A /* XPGuildHeaderView.m in Sources */, + 4CAFEFF62DD2F21B00CD81DF /* CreateEventPickerContainerView.m in Sources */, E85E7B542A4EB4AD00B6D00A /* XPMineGuildListModel.m in Sources */, 54283CE52CE48A69009729B5 /* ShoppingMallViewController.m in Sources */, 9BCE6144277D657600CC0358 /* XPReleaseRadioTableViewCell.m in Sources */, @@ -13623,7 +13659,7 @@ "$(inherited)", "@executable_path/Frameworks", ); - MARKETING_VERSION = 20.20.59; + MARKETING_VERSION = 20.20.60; OTHER_LDFLAGS = ( "$(inherited)", "-ObjC", @@ -13956,7 +13992,7 @@ "$(inherited)", "@executable_path/Frameworks", ); - MARKETING_VERSION = 20.20.59; + MARKETING_VERSION = 20.20.60; OTHER_LDFLAGS = ( "$(inherited)", "-ObjC", diff --git a/YuMi/Assets.xcassets/20.20.59/event_clock.imageset/Contents.json b/YuMi/Assets.xcassets/20.20.59/event_clock.imageset/Contents.json new file mode 100644 index 00000000..b9353300 --- /dev/null +++ b/YuMi/Assets.xcassets/20.20.59/event_clock.imageset/Contents.json @@ -0,0 +1,21 @@ +{ + "images" : [ + { + "idiom" : "universal", + "scale" : "1x" + }, + { + "idiom" : "universal", + "scale" : "2x" + }, + { + "filename" : "容器@3x (1).png", + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/YuMi/Assets.xcassets/20.20.59/event_clock.imageset/容器@3x (1).png b/YuMi/Assets.xcassets/20.20.59/event_clock.imageset/容器@3x (1).png new file mode 100644 index 00000000..59e91c39 Binary files /dev/null and b/YuMi/Assets.xcassets/20.20.59/event_clock.imageset/容器@3x (1).png differ diff --git a/YuMi/Assets.xcassets/20.20.59/event_ring.imageset/Contents.json b/YuMi/Assets.xcassets/20.20.59/event_ring.imageset/Contents.json new file mode 100644 index 00000000..0939770f --- /dev/null +++ b/YuMi/Assets.xcassets/20.20.59/event_ring.imageset/Contents.json @@ -0,0 +1,21 @@ +{ + "images" : [ + { + "idiom" : "universal", + "scale" : "1x" + }, + { + "idiom" : "universal", + "scale" : "2x" + }, + { + "filename" : "容器@3x (2).png", + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/YuMi/Assets.xcassets/20.20.59/event_ring.imageset/容器@3x (2).png b/YuMi/Assets.xcassets/20.20.59/event_ring.imageset/容器@3x (2).png new file mode 100644 index 00000000..f2bd8e29 Binary files /dev/null and b/YuMi/Assets.xcassets/20.20.59/event_ring.imageset/容器@3x (2).png differ diff --git a/YuMi/Assets.xcassets/20.20.59/event_ring_sub.imageset/Contents.json b/YuMi/Assets.xcassets/20.20.59/event_ring_sub.imageset/Contents.json new file mode 100644 index 00000000..c7ccfd37 --- /dev/null +++ b/YuMi/Assets.xcassets/20.20.59/event_ring_sub.imageset/Contents.json @@ -0,0 +1,21 @@ +{ + "images" : [ + { + "idiom" : "universal", + "scale" : "1x" + }, + { + "idiom" : "universal", + "scale" : "2x" + }, + { + "filename" : "切图 68@3x (2).png", + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/YuMi/Assets.xcassets/20.20.59/event_ring_sub.imageset/切图 68@3x (2).png b/YuMi/Assets.xcassets/20.20.59/event_ring_sub.imageset/切图 68@3x (2).png new file mode 100644 index 00000000..cebd3f24 Binary files /dev/null and b/YuMi/Assets.xcassets/20.20.59/event_ring_sub.imageset/切图 68@3x (2).png differ diff --git a/YuMi/Assets.xcassets/20.20.59/event_ring_unsub.imageset/Contents.json b/YuMi/Assets.xcassets/20.20.59/event_ring_unsub.imageset/Contents.json new file mode 100644 index 00000000..6120496b --- /dev/null +++ b/YuMi/Assets.xcassets/20.20.59/event_ring_unsub.imageset/Contents.json @@ -0,0 +1,21 @@ +{ + "images" : [ + { + "idiom" : "universal", + "scale" : "1x" + }, + { + "idiom" : "universal", + "scale" : "2x" + }, + { + "filename" : "切图 68@3x (1).png", + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/YuMi/Assets.xcassets/20.20.59/event_ring_unsub.imageset/切图 68@3x (1).png b/YuMi/Assets.xcassets/20.20.59/event_ring_unsub.imageset/切图 68@3x (1).png new file mode 100644 index 00000000..8434f602 Binary files /dev/null and b/YuMi/Assets.xcassets/20.20.59/event_ring_unsub.imageset/切图 68@3x (1).png differ diff --git a/YuMi/Assets.xcassets/20.20.59/room_icon.imageset/Contents.json b/YuMi/Assets.xcassets/20.20.59/room_icon.imageset/Contents.json new file mode 100644 index 00000000..8a0dd2e9 --- /dev/null +++ b/YuMi/Assets.xcassets/20.20.59/room_icon.imageset/Contents.json @@ -0,0 +1,21 @@ +{ + "images" : [ + { + "idiom" : "universal", + "scale" : "1x" + }, + { + "idiom" : "universal", + "scale" : "2x" + }, + { + "filename" : "容器@3x.png", + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/YuMi/Assets.xcassets/20.20.59/room_icon.imageset/容器@3x.png b/YuMi/Assets.xcassets/20.20.59/room_icon.imageset/容器@3x.png new file mode 100644 index 00000000..9365afc4 Binary files /dev/null and b/YuMi/Assets.xcassets/20.20.59/room_icon.imageset/容器@3x.png differ diff --git a/YuMi/Assets.xcassets/20.20.59/鸭子.imageset/Contents.json b/YuMi/Assets.xcassets/20.20.59/鸭子.imageset/Contents.json new file mode 100644 index 00000000..db97dc0d --- /dev/null +++ b/YuMi/Assets.xcassets/20.20.59/鸭子.imageset/Contents.json @@ -0,0 +1,21 @@ +{ + "images" : [ + { + "idiom" : "universal", + "scale" : "1x" + }, + { + "idiom" : "universal", + "scale" : "2x" + }, + { + "filename" : "鸭子@3x.png", + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/YuMi/Assets.xcassets/20.20.59/鸭子.imageset/鸭子@3x.png b/YuMi/Assets.xcassets/20.20.59/鸭子.imageset/鸭子@3x.png new file mode 100644 index 00000000..14da0a4c Binary files /dev/null and b/YuMi/Assets.xcassets/20.20.59/鸭子.imageset/鸭子@3x.png differ diff --git a/YuMi/Global/YUMIHtmlUrl.h b/YuMi/Global/YUMIHtmlUrl.h index e3e3337f..101b19e8 100644 --- a/YuMi/Global/YUMIHtmlUrl.h +++ b/YuMi/Global/YUMIHtmlUrl.h @@ -112,6 +112,8 @@ typedef NS_ENUM(NSUInteger, URLType) { KLuckyPackageRule, /// 人機驗證 kCaptchaSwitchPath, + /// 活动详情页 + kEventDetailPath }; NSString * const URLWithType(URLType type); diff --git a/YuMi/Global/YUMIHtmlUrl.m b/YuMi/Global/YUMIHtmlUrl.m index 58111a6c..71d2978d 100644 --- a/YuMi/Global/YUMIHtmlUrl.m +++ b/YuMi/Global/YUMIHtmlUrl.m @@ -28,7 +28,8 @@ NSString * const URLWithType(URLType type) { @(KRoomLevelRule) : @"modules/roomLevel/index.html",///房间等级, @(KLuckyPackageRule) : @"modules/luckyBagRules/index.html",///红包礼物, @(kCaptchaSwitchPath) : @"modules/humanMachineVerification/index.html", - @(kAccountlogoutConfirmURL) : @"modules/logout/confirm.html" + @(kAccountlogoutConfirmURL) : @"modules/logout/confirm.html", + @(kEventDetailPath) : @"modules/eventDetails/index.html?eventId=", }; NSString * newUrl = [newDic objectForKey:@(type)]; if(newUrl != nil){ diff --git a/YuMi/Global/YUMIMacroUitls.h b/YuMi/Global/YUMIMacroUitls.h index e5ab57e1..f7a73a4f 100644 --- a/YuMi/Global/YUMIMacroUitls.h +++ b/YuMi/Global/YUMIMacroUitls.h @@ -46,7 +46,7 @@ isPhoneXSeries = [[UIApplication sharedApplication] delegate].window.safeAreaIns #define kFontHeavy(font) [UIFont systemFontOfSize:kGetScaleWidth(font) weight:UIFontWeightHeavy] ///内置版本号 -#define PI_App_Version @"1.0.27" +#define PI_App_Version @"1.0.27.1" ///渠道 #define PI_App_Source @"appstore" #define PI_Test_Flight @"TestFlight" diff --git a/YuMi/Modules/YMMessage/Model/AttachmentModel.h b/YuMi/Modules/YMMessage/Model/AttachmentModel.h index 06996fbf..14b3c5ba 100644 --- a/YuMi/Modules/YMMessage/Model/AttachmentModel.h +++ b/YuMi/Modules/YMMessage/Model/AttachmentModel.h @@ -68,6 +68,8 @@ typedef NS_ENUM(NSUInteger, CustomMessageType) { CustomMessageType_RoomBoom = 63, /// CP 礼物 CustomMessageType_CP = 64, + /// 房间活动 + CustomMessageType_Public_Event = 68, ///塔罗 CustomMessageType_Tarot = 71, ///相亲 @@ -153,6 +155,10 @@ typedef NS_ENUM(NSUInteger, CustomMessageType) { CustomMessageType_CP_message = 117, }; +typedef NS_ENUM(NSUInteger, CustomMessageTypePublicEvent) { + Custom_Message_Sub_Public_Event_message = 681, +}; + /// first = CustomMessageType_CP_message typedef NS_ENUM(NSUInteger, CustomMessageTypeCPmessage) { Custom_Message_Sub_CP_message_request = 1170, diff --git a/YuMi/Modules/YMMessage/View/Session/Cell/MessageCell.m b/YuMi/Modules/YMMessage/View/Session/Cell/MessageCell.m index 74cff4ec..c2bc860e 100644 --- a/YuMi/Modules/YMMessage/View/Session/Cell/MessageCell.m +++ b/YuMi/Modules/YMMessage/View/Session/Cell/MessageCell.m @@ -90,28 +90,28 @@ //在自定义cell中的init方法加入 - UILongPressGestureRecognizer *longPressGesture = [[UILongPressGestureRecognizer alloc] initWithTarget:self action:@selector(longPressCellHandle:)]; + UILongPressGestureRecognizer *longPressGesture = [[UILongPressGestureRecognizer alloc] initWithTarget:self action:@selector(longPressCellHandle:)]; longPressGesture.minimumPressDuration = 0.5; - [self.messageBackground addGestureRecognizer:longPressGesture]; + [self.messageBackground addGestureRecognizer:longPressGesture]; } - (void)initLayout { [self.leftAvatar mas_makeConstraints:^(MASConstraintMaker *make) { make.leading.top.mas_equalTo(self).offset(15); - make.width.height.mas_equalTo(45); + make.width.height.mas_equalTo(45).priorityHigh(); }]; [self.rightAvatar mas_makeConstraints:^(MASConstraintMaker *make) { make.top.mas_equalTo(self).offset(15); make.trailing.mas_equalTo(self).offset(-15); - make.width.height.mas_equalTo(45); + make.width.height.mas_equalTo(45).priorityHigh(); }]; [self.messageBackground mas_makeConstraints:^(MASConstraintMaker *make) { - self.messageBackgroundLeft = make.leading.mas_equalTo(self.leftAvatar.mas_trailing).offset(15); - self.messageBackgroundRight = make.trailing.mas_equalTo(self.rightAvatar.mas_leading).offset(-15); - self.messageBackgroundLeftAvatar = make.leading.mas_equalTo(self.leftAvatar.mas_leading); - self.messageBackgroundRightAvatar = make.trailing.mas_equalTo(self.rightAvatar.mas_trailing); + self.messageBackgroundLeft = make.leading.mas_equalTo(self.leftAvatar.mas_trailing).offset(15).priorityHigh(); + self.messageBackgroundRight = make.trailing.mas_equalTo(self.rightAvatar.mas_leading).offset(-15).priorityHigh(); + self.messageBackgroundLeftAvatar = make.leading.mas_equalTo(self.leftAvatar.mas_leading).priorityHigh(); + self.messageBackgroundRightAvatar = make.trailing.mas_equalTo(self.rightAvatar.mas_trailing).priorityHigh(); make.top.mas_equalTo(self).offset(20); }]; @@ -161,7 +161,7 @@ - (BOOL)checkDataWith:(long)currentStr { NSDate* date = [NSDate dateWithTimeIntervalSince1970:currentStr]; NSCalendar * calendar = [NSCalendar currentCalendar]; - NSCalendarUnit unit =NSCalendarUnitYear | NSCalendarUnitMonth | NSCalendarUnitDay | NSCalendarUnitHour | NSCalendarUnitMinute | NSCalendarUnitSecond; + NSCalendarUnit unit = NSCalendarUnitYear | NSCalendarUnitMonth | NSCalendarUnitDay | NSCalendarUnitHour | NSCalendarUnitMinute | NSCalendarUnitSecond; NSDateComponents * cmps = [calendar components:unit fromDate:date toDate:[NSDate date] options:0]; if (cmps.minute <= 2) { return YES; @@ -226,9 +226,9 @@ [self.messageBackgroundRight install]; [self.messageBackgroundRightAvatar uninstall]; } else { - [self.messageBackgroundLeft uninstall]; - [self.messageBackgroundRight install]; + [self.messageBackgroundLeft install]; [self.messageBackgroundLeftAvatar uninstall]; + [self.messageBackgroundRight install]; [self.messageBackgroundRightAvatar uninstall]; } self.rightAvatar.imageUrl = avatarUrl; @@ -243,7 +243,7 @@ [self.messageBackgroundRightAvatar install]; } else { [self.messageBackgroundLeft install]; - [self.messageBackgroundRight uninstall]; + [self.messageBackgroundRight install]; [self.messageBackgroundLeftAvatar uninstall]; [self.messageBackgroundRightAvatar uninstall]; } @@ -264,7 +264,11 @@ } } } else { +#if DEBUG NSAssert(classStr != nil, @"message should not be nil"); +#else + return; +#endif } [self.messageBackground addSubview:self.messageContent]; //MARK: 不太理解原来的 layout 关系,对开黑卡特殊处理 diff --git a/YuMi/Modules/YMMessage/View/Session/Cell/PublicEventTableViewCell.h b/YuMi/Modules/YMMessage/View/Session/Cell/PublicEventTableViewCell.h new file mode 100644 index 00000000..d768fbdd --- /dev/null +++ b/YuMi/Modules/YMMessage/View/Session/Cell/PublicEventTableViewCell.h @@ -0,0 +1,16 @@ +// +// PublicEventTableViewCell.h +// YuMi +// +// Created by P on 2025/5/13. +// + +#import "MessageContentCustomView.h" + +NS_ASSUME_NONNULL_BEGIN + +@interface PublicEventTableViewCell : MessageContentCustomView + +@end + +NS_ASSUME_NONNULL_END diff --git a/YuMi/Modules/YMMessage/View/Session/Cell/PublicEventTableViewCell.m b/YuMi/Modules/YMMessage/View/Session/Cell/PublicEventTableViewCell.m new file mode 100644 index 00000000..e3dc51a7 --- /dev/null +++ b/YuMi/Modules/YMMessage/View/Session/Cell/PublicEventTableViewCell.m @@ -0,0 +1,133 @@ +// +// PublicEventTableViewCell.m +// YuMi +// +// Created by P on 2025/5/13. +// + +#import "PublicEventTableViewCell.h" +#import "MessagePublicEventModel.h" + +@interface PublicEventTableViewCell () + +@property (nonatomic, strong) NetImageView *topImageView; +@property (nonatomic, strong) UIImageView *roomIcon; +@property (nonatomic, strong) UILabel *roomIDLabel; +@property (nonatomic, strong) UILabel *eventDescLabel; +@property (nonatomic, strong) UIButton *joinButton; + +@end + +@implementation PublicEventTableViewCell + +- (void)initSubViews { + [super initSubViews]; +// return; + [self.backView addSubview:self.topImageView]; + [self.backView addSubview:self.roomIcon]; + [self.backView addSubview:self.roomIDLabel]; + [self.backView addSubview:self.eventDescLabel]; + [self.backView addSubview:self.joinButton]; +} + +- (void)initSubViewConstraints { + [super initSubViewConstraints]; +// return; + [self.topImageView mas_makeConstraints:^(MASConstraintMaker *make) { +// make.edges.mas_equalTo(self); + make.top.leading.mas_equalTo(self); + make.width.mas_equalTo(self); + make.height.mas_equalTo(86); + }]; + + [self.roomIcon mas_makeConstraints:^(MASConstraintMaker *make) { + make.top.mas_equalTo(self.topImageView.mas_bottom).offset(8); + make.leading.mas_equalTo(8); + make.size.mas_equalTo(CGSizeMake(16, 16)); + }]; + + + [self.roomIDLabel mas_makeConstraints:^(MASConstraintMaker *make) { + make.centerY.mas_equalTo(self.roomIcon); + make.leading.mas_equalTo(self.roomIcon.mas_trailing).offset(8); + }]; + + [self.joinButton mas_makeConstraints:^(MASConstraintMaker *make) { + make.bottom.trailing.mas_equalTo(-8); + make.size.mas_equalTo(CGSizeMake(96, 30)); + }]; + + [self.eventDescLabel mas_makeConstraints:^(MASConstraintMaker *make) { + make.top.mas_equalTo(self.roomIcon.mas_bottom).offset(8); + make.leading.trailing.mas_equalTo(self.backView).inset(8); + make.bottom.mas_equalTo(self.joinButton.mas_top).offset(-8); + }]; +} + +- (void)didTapJoinButton { + +} + +- (void)render:(MessageBaseModel *)message { + if ([message isKindOfClass:[MessagePublicEventModel class]]) { + MessagePublicEventModel *model = (MessagePublicEventModel *)message; + NSLog(@"%@", model); + } +} + + +#pragma mark - +- (NetImageView *)topImageView { + if (!_topImageView) { + NetImageConfig * config = [[NetImageConfig alloc] init]; + config.placeHolder = [UIImageConstant defaultBannerPlaceholder]; + _topImageView = [[NetImageView alloc] initWithConfig:config]; + [_topImageView setCornerRadius:8]; + } + return _topImageView; +} + +- (UIImageView *)roomIcon { + if (!_roomIcon) { + _roomIcon = [[UIImageView alloc] initWithImage:kImage(@"room_icon")]; + } + return _roomIcon; +} + +- (UILabel *)roomIDLabel { + if (!_roomIDLabel) { + _roomIDLabel = [UILabel labelInitWithText:YMLocalizedString(@"XPMineGuildViewController6") + font:kFontRegular(13) + textColor:UIColorFromRGB(0x313131)]; + } + return _roomIDLabel; +} + +- (UILabel *)eventDescLabel { + if (!_eventDescLabel) { + _eventDescLabel = [UILabel labelInitWithText:@"Your Event is about to start! Your fans and subscribers have been notified!" + font:kFontMedium(14) + textColor:UIColorFromRGB(0x313131)]; + _eventDescLabel.numberOfLines = 0; + } + return _eventDescLabel; +} + +- (UIButton *)joinButton { + if (!_joinButton) { + _joinButton = [UIButton buttonWithType:UIButtonTypeCustom]; + [_joinButton setTitle:YMLocalizedString(@"XPCandyTreeViewController4") forState:UIControlStateNormal]; + [_joinButton.titleLabel setFont:kFontMedium(14)]; + [_joinButton addTarget:self + action:@selector(didTapJoinButton) + forControlEvents:UIControlEventTouchUpInside]; + [_joinButton setCornerRadius:15]; + [_joinButton addGradientBackgroundWithColors:@[ + UIColorFromRGB(0xe29030), + UIColorFromRGB(0xfcc074) + ] startPoint:CGPointMake(0, 0.5) endPoint:CGPointMake(1, 0.5) cornerRadius:15]; + } + return _joinButton; +} + +@end diff --git a/YuMi/Modules/YMMessage/View/Session/Content/SesssionModel/MessagePublicEventModel.h b/YuMi/Modules/YMMessage/View/Session/Content/SesssionModel/MessagePublicEventModel.h new file mode 100644 index 00000000..ef9e859d --- /dev/null +++ b/YuMi/Modules/YMMessage/View/Session/Content/SesssionModel/MessagePublicEventModel.h @@ -0,0 +1,24 @@ +// +// MessagePublicEventModel.h +// YuMi +// +// Created by P on 2025/5/13. +// + +#import "MessageBaseModel.h" + +NS_ASSUME_NONNULL_BEGIN + +@interface MessagePublicEventModel : MessageBaseModel + +@property (nonatomic, copy) NSString *eventBanner; +@property (nonatomic, assign) NSInteger roomUid; +@property (nonatomic, copy) NSString *id; +@property (nonatomic, copy) NSString *eventTopic; +@property (nonatomic, copy) NSString *eventDetail; +@property (nonatomic, assign) NSInteger type; +@property (nonatomic, assign) NSInteger roomErbanNo; + +@end + +NS_ASSUME_NONNULL_END diff --git a/YuMi/Modules/YMMessage/View/Session/Content/SesssionModel/MessagePublicEventModel.m b/YuMi/Modules/YMMessage/View/Session/Content/SesssionModel/MessagePublicEventModel.m new file mode 100644 index 00000000..eb477aa9 --- /dev/null +++ b/YuMi/Modules/YMMessage/View/Session/Content/SesssionModel/MessagePublicEventModel.m @@ -0,0 +1,27 @@ +// +// MessagePublicEventModel.m +// YuMi +// +// Created by P on 2025/5/13. +// + +#import "MessagePublicEventModel.h" + +@implementation MessagePublicEventModel + +- (instancetype)initWithMessage:(NIMMessage *)message { + if (self = [super initWithMessage:message]) { + self.message = message; + self.isHiddenAvatar = NO; + self.messageType = SessionMessageType_Custom; + // TODO: 计算高度 + self.height = 230; + } + return self; +} + +- (NSString *)cellContent:(MessageBaseModel *)model { + return @"PublicEventTableViewCell"; +} + +@end diff --git a/YuMi/Modules/YMMessage/View/Session/SessionViewController.m b/YuMi/Modules/YMMessage/View/Session/SessionViewController.m index c103450a..83f2bd97 100644 --- a/YuMi/Modules/YMMessage/View/Session/SessionViewController.m +++ b/YuMi/Modules/YMMessage/View/Session/SessionViewController.m @@ -57,6 +57,7 @@ #import "MessageTipsModel.h" #import "MessageTreasureFairyModel.h" #import "MessageCPNotifyModel.h" +#import "MessagePublicEventModel.h" ///View #import "XPMineUserInfoViewController.h" @@ -234,6 +235,10 @@ #pragma mark - cell的样式 - (MessageBaseModel *)modeTransformMessage:(NIMMessage *)message { MessageBaseModel * model; +#if DEBUG + model = [[MessagePublicEventModel alloc] initWithMessage:message]; + return model; +#endif switch (message.messageType) { case NIMMessageTypeText: model = [[MessageTextModel alloc] initWithMessage:message]; @@ -253,7 +258,7 @@ default: model = [[MessageUnSupportModel alloc] initWithMessage:message]; break; - break; + } return model; } @@ -277,6 +282,11 @@ NSInteger second = attachment.second; switch (first) { + case CustomMessageType_Public_Event: + if (second == Custom_Message_Sub_Public_Event_message) { + model = [[MessagePublicEventModel alloc] initWithMessage:message]; + } + break; case CustomMessageType_CP_message: if (second == Custom_Message_Sub_CP_message_request || second == Custom_Message_Sub_CP_message_result) { model = [[MessageCPNotifyModel alloc] initWithMessage:message]; diff --git a/YuMi/Modules/YMNewHome/Api/Api+EventCenter.h b/YuMi/Modules/YMNewHome/Api/Api+EventCenter.h new file mode 100644 index 00000000..2eca4c7c --- /dev/null +++ b/YuMi/Modules/YMNewHome/Api/Api+EventCenter.h @@ -0,0 +1,33 @@ +// +// Api+EventCenter.h +// YuMi +// +// Created by P on 2025/5/15. +// + +#import "Api.h" + +NS_ASSUME_NONNULL_BEGIN + +@interface Api(EventCenter) + +/// 活动广场列表 ++ (void)usereventSquare:(HttpRequestHelperCompletion)complection + page:(NSNumber *)page + pageSize:(NSNumber *)pageSize; + +/// 我发布的活动 ++ (void)usereventMySquare:(HttpRequestHelperCompletion)complection + page:(NSNumber *)page + pageSize:(NSNumber *)pageSize + uid:(NSString *)uid; + +/// 我订阅的活动 ++ (void)usereventMySub:(HttpRequestHelperCompletion)complection + page:(NSNumber *)page + pageSize:(NSNumber *)pageSize + uid:(NSString *)uid; + +@end + +NS_ASSUME_NONNULL_END diff --git a/YuMi/Modules/YMNewHome/Api/Api+EventCenter.m b/YuMi/Modules/YMNewHome/Api/Api+EventCenter.m new file mode 100644 index 00000000..c7a326c9 --- /dev/null +++ b/YuMi/Modules/YMNewHome/Api/Api+EventCenter.m @@ -0,0 +1,41 @@ +// +// Api+EventCenter.m +// YuMi +// +// Created by P on 2025/5/15. +// + +#import "Api+EventCenter.h" + +@implementation Api(EventCenter) + +/// 活动广场列表 ++ (void)usereventSquare:(HttpRequestHelperCompletion)complection + page:(NSNumber *)page + pageSize:(NSNumber *)pageSize { + [self makeRequest:@"userevent/square" + method:HttpRequestHelperMethodGET + completion:complection, __FUNCTION__, page, pageSize, nil]; +} + +/// 我发布的活动 ++ (void)usereventMySquare:(HttpRequestHelperCompletion)complection + page:(NSNumber *)page + pageSize:(NSNumber *)pageSize + uid:(NSString *)uid { + [self makeRequest:@"userevent/mysquare" + method:HttpRequestHelperMethodGET + completion:complection, __FUNCTION__, page, pageSize, uid, nil]; +} + +/// 我订阅的活动 ++ (void)usereventMySub:(HttpRequestHelperCompletion)complection + page:(NSNumber *)page + pageSize:(NSNumber *)pageSize + uid:(NSString *)uid { + [self makeRequest:@"userevent/mySub" + method:HttpRequestHelperMethodGET + completion:complection, __FUNCTION__, page, pageSize, uid, nil]; +} + +@end diff --git a/YuMi/Modules/YMNewHome/Model/EventItemModel.h b/YuMi/Modules/YMNewHome/Model/EventItemModel.h new file mode 100644 index 00000000..e9911ebf --- /dev/null +++ b/YuMi/Modules/YMNewHome/Model/EventItemModel.h @@ -0,0 +1,40 @@ +// +// EventItemModel.h +// YuMi +// +// Created by P on 2025/5/15. +// + +#import "PIBaseModel.h" + +NS_ASSUME_NONNULL_BEGIN + +@interface EventItemModel : PIBaseModel + +@property (nonatomic, strong) NSString *eventTopic; // 事件主题 +@property (nonatomic, assign) NSTimeInterval updateTime; // 更新时间戳 +@property (nonatomic, assign) NSInteger offectTimes; // 未知字段 +@property (nonatomic, assign) NSInteger shareNum; // 分享次数 +@property (nonatomic, assign) NSInteger liveStatus; // 1未开始,2进行中,3-已结束 +@property (nonatomic, assign) NSInteger eventStatus; // 0-待审核,1-审核通过,2-拒绝,3-删除,4-过期 +@property (nonatomic, assign) NSInteger eventDuration; // 事件持续时间 +@property (nonatomic, strong) NSString *roomAvatar; // 房间头像 +@property (nonatomic, strong) NSString *eventBanner; // 事件横幅 +@property (nonatomic, assign) NSInteger subNum; // 订阅数量 +@property (nonatomic, strong) NSString *eventDetail; // 事件详情 +@property (nonatomic, assign) NSInteger id; // 事件ID +@property (nonatomic, assign) NSInteger uid; // 用户ID +@property (nonatomic, assign) NSInteger noticeFans; // 通知粉丝 +@property (nonatomic, assign) NSInteger roomErbanNo; // 房间号 +@property (nonatomic, strong) NSString *eventStartTimeStr;// 事件开始时间字符串 +@property (nonatomic, assign) NSTimeInterval eventEndTime;// 事件结束时间戳 +@property (nonatomic, assign) BOOL subStatus; // 订阅状态 +@property (nonatomic, assign) NSInteger roomUid; // 房间用户ID +@property (nonatomic, assign) NSTimeInterval eventStartTime;// 事件开始时间戳 +@property (nonatomic, assign) NSTimeInterval createTime; // 创建时间戳 + +@property (nonatomic, copy) NSString *gender; + +@end + +NS_ASSUME_NONNULL_END diff --git a/YuMi/Modules/YMNewHome/Model/EventItemModel.m b/YuMi/Modules/YMNewHome/Model/EventItemModel.m new file mode 100644 index 00000000..7a07454f --- /dev/null +++ b/YuMi/Modules/YMNewHome/Model/EventItemModel.m @@ -0,0 +1,12 @@ +// +// EventItemModel.m +// YuMi +// +// Created by P on 2025/5/15. +// + +#import "EventItemModel.h" + +@implementation EventItemModel + +@end diff --git a/YuMi/Modules/YMNewHome/Model/HomeBannerInfoModel.h b/YuMi/Modules/YMNewHome/Model/HomeBannerInfoModel.h index 25968418..0dc19986 100644 --- a/YuMi/Modules/YMNewHome/Model/HomeBannerInfoModel.h +++ b/YuMi/Modules/YMNewHome/Model/HomeBannerInfoModel.h @@ -51,6 +51,8 @@ typedef NS_ENUM(NSUInteger, HomeBannerInfoSkipType) { ///跳转的类型 @property (nonatomic, assign)HomeBannerInfoSkipType skipType; +@property (nonatomic, assign) NSInteger activityShow; // = 1 时,为官方活动 + @property(nonatomic, strong) HomeBannerFillVoInfoModel *fillVo; @end diff --git a/YuMi/Modules/YMNewHome/Presenter/CreateEventPresenter.h b/YuMi/Modules/YMNewHome/Presenter/CreateEventPresenter.h index 7355ce5f..d4fbb288 100644 --- a/YuMi/Modules/YMNewHome/Presenter/CreateEventPresenter.h +++ b/YuMi/Modules/YMNewHome/Presenter/CreateEventPresenter.h @@ -6,11 +6,30 @@ // #import "BaseMvpPresenter.h" +#import "EventItemModel.h" NS_ASSUME_NONNULL_BEGIN +@protocol CreateEventPresenterProcotol +@optional +- (void)eventSquareListSuccess:(NSArray *)list; +- (void)eventSquareListFailure:(NSString *)msg; + +- (void)myCreateEventListSuccess:(NSArray *)list; +- (void)myCreateEventListFailure:(NSString *)msg; + +- (void)mySubEventListSuccess:(NSArray *)list; +- (void)mySubEventListFailure:(NSString *)msg; + +@end + @interface CreateEventPresenter : BaseMvpPresenter + +- (void)loadEventSquare:(NSInteger)page; +- (void)loadMyCreateEvents:(NSInteger)page; +- (void)loadMySubEvents:(NSInteger)page; + - (void)createEventWithTitle:(NSString *)title image:(UIImage *)image uploadToHome:(BOOL)uploadToHome diff --git a/YuMi/Modules/YMNewHome/Presenter/CreateEventPresenter.m b/YuMi/Modules/YMNewHome/Presenter/CreateEventPresenter.m index ccb5ceb6..8836371c 100644 --- a/YuMi/Modules/YMNewHome/Presenter/CreateEventPresenter.m +++ b/YuMi/Modules/YMNewHome/Presenter/CreateEventPresenter.m @@ -6,20 +6,56 @@ // #import "CreateEventPresenter.h" -#import "CreateEventViewController.h" +#import "Api+EventCenter.h" @interface CreateEventPresenter() -@property (nonatomic, weak) CreateEventViewController *view; - @end @implementation CreateEventPresenter +// Maybe 用一个方法 + 枚举指来指代一个功能类型的 api call? -//- (void)attachView:(id)view { -// [super attachView:view]; -// self.view = view; -//} +- (void)loadEventSquare:(NSInteger)page { + [Api usereventSquare:[self createHttpCompletion:^(BaseModel * _Nonnull data) { + if ([[self getView] respondsToSelector:@selector(eventSquareListSuccess:)]) { + [[self getView] eventSquareListSuccess:[EventItemModel modelsWithArray:data.data]]; + } + } fail:^(NSInteger code, NSString * _Nullable msg) { + if ([[self getView] respondsToSelector:@selector(eventSquareListFailure:)]) { + [[self getView] eventSquareListFailure:msg]; + } + } showLoading:YES errorToast:YES] page:@(page) pageSize:@20]; +} + +- (void)loadMyCreateEvents:(NSInteger)page { + [Api usereventMySquare:[self createHttpCompletion:^(BaseModel * _Nonnull data) { + if ([[self getView] respondsToSelector:@selector(eventSquareListSuccess:)]) { + [[self getView] myCreateEventListSuccess:@[]]; + } + } fail:^(NSInteger code, NSString * _Nullable msg) { + if ([[self getView] respondsToSelector:@selector(eventSquareListFailure:)]) { + [[self getView] myCreateEventListFailure:msg]; + } + } showLoading:YES errorToast:YES] + page:@(page) + pageSize:@20 + uid:[AccountInfoStorage instance].getUid]; +} + +- (void)loadMySubEvents:(NSInteger)page { + [Api usereventMySub:[self createHttpCompletion:^(BaseModel * _Nonnull data) { + if ([[self getView] respondsToSelector:@selector(eventSquareListSuccess:)]) { + [[self getView] mySubEventListSuccess:@[]]; + } + } fail:^(NSInteger code, NSString * _Nullable msg) { + if ([[self getView] respondsToSelector:@selector(eventSquareListFailure:)]) { + [[self getView] myCreateEventListFailure:msg]; + } + } showLoading:YES errorToast:YES] + page:@(page) + pageSize:@20 + uid:[AccountInfoStorage instance].getUid]; +} - (void)createEventWithTitle:(NSString *)title image:(UIImage *)image @@ -31,32 +67,32 @@ notifyFans:(BOOL)notifyFans { // 输入验证 if (title.length == 0) { - [self.view showError:@"请输入活动标题"]; +// [[self getView] showError:@"请输入活动标题"]; return; } if (!image) { - [self.view showError:@"请选择活动横幅图片"]; +// [[self getView] showError:@"请选择活动横幅图片"]; return; } if (roomId.length == 0) { - [self.view showError:@"请选择房间"]; +// [[self getView] showError:@"请选择房间"]; return; } if (!startTime) { - [self.view showError:@"请选择开始时间"]; +// [[self getView] showError:@"请选择开始时间"]; return; } if (duration <= 0) { - [self.view showError:@"请选择活动时长"]; +// [[self getView] showError:@"请选择活动时长"]; return; } if (content.length == 0) { - [self.view showError:@"请输入活动内容"]; +// [[self getView] showError:@"请输入活动内容"]; return; } @@ -67,7 +103,7 @@ // 模拟网络请求成功 dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(1.0 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{ - [self.view showCreateSuccess]; +// [[self getView] showCreateSuccess]; }); } diff --git a/YuMi/Modules/YMNewHome/Presenter/XPHomeContainerPresenter.h b/YuMi/Modules/YMNewHome/Presenter/XPHomeContainerPresenter.h index 5ce3fabd..797b6bbc 100644 --- a/YuMi/Modules/YMNewHome/Presenter/XPHomeContainerPresenter.h +++ b/YuMi/Modules/YMNewHome/Presenter/XPHomeContainerPresenter.h @@ -21,7 +21,7 @@ NS_ASSUME_NONNULL_BEGIN -(void)checkIpRegionAction; - (void)getHomeTopData; -- (void)getHomeAllTopsData; +//- (void)getHomeAllTopsData; - (void)getHomeRanks; @end diff --git a/YuMi/Modules/YMNewHome/Presenter/XPHomeContainerPresenter.m b/YuMi/Modules/YMNewHome/Presenter/XPHomeContainerPresenter.m index 67c44c1b..e3aa6f3f 100644 --- a/YuMi/Modules/YMNewHome/Presenter/XPHomeContainerPresenter.m +++ b/YuMi/Modules/YMNewHome/Presenter/XPHomeContainerPresenter.m @@ -37,84 +37,90 @@ NSArray * array = [HomeBannerInfoModel modelsWithArray:data.data]; [banner sendNext:array]; [banner sendCompleted]; - }fail:^(NSInteger code, NSString * _Nullable msg) { - [banner sendError:nil]; - [banner sendCompleted]; - } errorToast:NO] uid:uid type:@"1"]; - - [Api requestCurrentResourceListCompletion:[self createHttpCompletion:^(BaseModel * _Nonnull data) { - NSArray *list = [PIHomeItemModel modelsWithArray:data.data]; - [menu sendNext:list]; - [menu sendCompleted]; - }fail:^(NSInteger code, NSString * _Nullable msg) { - [menu sendError:nil]; - [menu sendCompleted]; - }]]; -} - -- (void)getHomeAllTopsData { - RACSubject *banner = [RACSubject subject]; - RACSubject *menu = [RACSubject subject]; - RACSubject *rank = [RACSubject subject]; - - RACSignal *bannerSignal = [banner catch:^RACSignal *(NSError *error) { - return [RACSignal return:nil]; - }]; - RACSignal *menuSignal = [menu catch:^RACSignal *(NSError *error) { - return [RACSignal return:nil]; - }]; - - RACSignal *rankSignal = [rank catch:^RACSignal *(NSError *error) { - return [RACSignal return:nil]; - }]; - - RACSignal *combinedSignal = [RACSignal combineLatest:@[bannerSignal, menuSignal, rankSignal] - reduce:^id(NSArray* bannerList, NSArray* menuList, NSArray *rankAvatars) { - return @[bannerList ?: @[], - menuList ?: @[], - rankAvatars ?: @[]]; - }]; - - @kWeakify(self); - [[combinedSignal deliverOn:RACScheduler.mainThreadScheduler] - subscribeNext:^(NSArray *combinedValues) { - @kStrongify(self); - [[self getView] getHomeTopDataSuccess:[combinedValues xpSafeObjectAtIndex:0] - banners:[combinedValues xpSafeObjectAtIndex:1] - rankAvatars:[combinedValues xpSafeObjectAtIndex:2]]; - } error:^(NSError * _Nullable error) { - }]; - - NSString * uid = [AccountInfoStorage instance].getUid; - [Api homeBannerList:[self createHttpCompletion:^(BaseModel * _Nonnull data) { - NSArray * array = [HomeBannerInfoModel modelsWithArray:data.data]; - [banner sendNext:array]; - [banner sendCompleted]; + [menu sendNext:@[]]; + [menu sendCompleted]; }fail:^(NSInteger code, NSString * _Nullable msg) { [banner sendError:nil]; [banner sendCompleted]; - } errorToast:NO] uid:uid type:@"1"]; - - [Api requestCurrentResourceListCompletion:[self createHttpCompletion:^(BaseModel * _Nonnull data) { - NSArray *list = [PIHomeItemModel modelsWithArray:data.data]; - [menu sendNext:list]; - [menu sendCompleted]; - }fail:^(NSInteger code, NSString * _Nullable msg) { + [menu sendError:nil]; [menu sendCompleted]; - }]]; + } errorToast:NO] uid:uid type:@"1"]; - [Api getHomeRanksCompletion:[self createHttpCompletion:^(BaseModel * _Nonnull data) { - NSArray *list = [HomeRankAvatarModel modelsWithArray:data.data]; - [rank sendNext:list]; - [rank sendCompleted]; - }fail:^(NSInteger code, NSString * _Nullable msg) { - [rank sendError:nil]; - [rank sendCompleted]; - }]]; +// [Api requestCurrentResourceListCompletion:[self createHttpCompletion:^(BaseModel * _Nonnull data) { +// NSArray *list = [PIHomeItemModel modelsWithArray:data.data]; +// [menu sendNext:list]; +// [menu sendCompleted]; +// }fail:^(NSInteger code, NSString * _Nullable msg) { +// [menu sendError:nil]; +// [menu sendCompleted]; +// }]]; } +//- (void)getHomeAllTopsData { +// RACSubject *banner = [RACSubject subject]; +// RACSubject *menu = [RACSubject subject]; +// RACSubject *rank = [RACSubject subject]; +// +// RACSignal *bannerSignal = [banner catch:^RACSignal *(NSError *error) { +// return [RACSignal return:nil]; +// }]; +// RACSignal *menuSignal = [menu catch:^RACSignal *(NSError *error) { +// return [RACSignal return:nil]; +// }]; +// +// RACSignal *rankSignal = [rank catch:^RACSignal *(NSError *error) { +// return [RACSignal return:nil]; +// }]; +// +// RACSignal *combinedSignal = [RACSignal combineLatest:@[bannerSignal, menuSignal, rankSignal] +// reduce:^id(NSArray* bannerList, NSArray* menuList, NSArray *rankAvatars) { +// return @[bannerList ?: @[], +// menuList ?: @[], +// rankAvatars ?: @[]]; +// }]; +// +// @kWeakify(self); +// [[combinedSignal deliverOn:RACScheduler.mainThreadScheduler] +// subscribeNext:^(NSArray *combinedValues) { +// @kStrongify(self); +// [[self getView] getHomeTopDataSuccess:[combinedValues xpSafeObjectAtIndex:0] +// banners:[combinedValues xpSafeObjectAtIndex:1] +// rankAvatars:[combinedValues xpSafeObjectAtIndex:2]]; +// } error:^(NSError * _Nullable error) { +// +// }]; +// +// NSString * uid = [AccountInfoStorage instance].getUid; +// [Api homeBannerList:[self createHttpCompletion:^(BaseModel * _Nonnull data) { +// NSArray * array = [HomeBannerInfoModel modelsWithArray:data.data]; +// [banner sendNext:array]; +// [banner sendCompleted]; +// }fail:^(NSInteger code, NSString * _Nullable msg) { +// [banner sendError:nil]; +// [banner sendCompleted]; +// } errorToast:NO] uid:uid type:@"1"]; +// +// [Api requestCurrentResourceListCompletion:[self createHttpCompletion:^(BaseModel * _Nonnull data) { +// NSArray *list = [PIHomeItemModel modelsWithArray:data.data]; +// [menu sendNext:list]; +// [menu sendCompleted]; +// }fail:^(NSInteger code, NSString * _Nullable msg) { +// [menu sendError:nil]; +// [menu sendCompleted]; +// }]]; +// +// [Api getHomeRanksCompletion:[self createHttpCompletion:^(BaseModel * _Nonnull data) { +// NSArray *list = [HomeRankAvatarModel modelsWithArray:data.data]; +// [rank sendNext:list]; +// [rank sendCompleted]; +// }fail:^(NSInteger code, NSString * _Nullable msg) { +// [rank sendError:nil]; +// [rank sendCompleted]; +// }]]; +//} + ///得到首页轮播图 - (void)getHomeTopBannerList{ NSString * uid = [AccountInfoStorage instance].getUid; @@ -122,7 +128,7 @@ [Api homeBannerList:[self createHttpCompletion:^(BaseModel * _Nonnull data) { @kStrongify(self); NSArray * array = [HomeBannerInfoModel modelsWithArray:data.data]; - [[self getView]getHomeTopBannerListSuccess:array]; + [[self getView] getHomeTopBannerListSuccess:array]; }fail:^(NSInteger code, NSString * _Nullable msg) { } errorToast:NO] uid:uid type:@"1"]; diff --git a/YuMi/Modules/YMNewHome/View/Cell/EventCenterEmptyCell.h b/YuMi/Modules/YMNewHome/View/Cell/EventCenterEmptyCell.h new file mode 100644 index 00000000..76c307e8 --- /dev/null +++ b/YuMi/Modules/YMNewHome/View/Cell/EventCenterEmptyCell.h @@ -0,0 +1,9 @@ +#import "UIKit/UIKit.h" + +@interface EventCenterEmptyCell : UITableViewCell + ++ (CGFloat)cellHeight; ++ (void)registerTo:(UITableView *)tableView; ++ (EventCenterEmptyCell *)cellFor:(UITableView *)tableView atIndexPath:(NSIndexPath *)indexPath; + +@end diff --git a/YuMi/Modules/YMNewHome/View/Cell/EventCenterEmptyCell.m b/YuMi/Modules/YMNewHome/View/Cell/EventCenterEmptyCell.m new file mode 100644 index 00000000..6244f046 --- /dev/null +++ b/YuMi/Modules/YMNewHome/View/Cell/EventCenterEmptyCell.m @@ -0,0 +1,48 @@ +#import "EventCenterEmptyCell.h" + +@implementation EventCenterEmptyCell +{ + UILabel *titleLabel; + UIImageView *ufoImageView; +} + ++ (CGFloat)cellHeight { + return 170; +} + ++ (void)registerTo:(UITableView *)tableView { + [tableView registerClass:[self class] + forCellReuseIdentifier:NSStringFromClass([self class])]; +} + ++ (EventCenterEmptyCell *)cellFor:(UITableView *)tableView atIndexPath:(NSIndexPath *)indexPath { + return [tableView dequeueReusableCellWithIdentifier:NSStringFromClass([self class]) forIndexPath:indexPath]; +} + +- (instancetype)initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(NSString *)reuseIdentifier { + if (self = [super initWithStyle:style reuseIdentifier:reuseIdentifier]) { + + self.selectionStyle = UITableViewCellSelectionStyleNone; + self.contentView.backgroundColor = [UIColor whiteColor]; + + titleLabel = [UILabel labelInitWithText:YMLocalizedString(@"20.20.59_text_19") + font:kFontRegular(14) + textColor:UIColorFromRGB(0xafb1b3)]; + ufoImageView = [[UIImageView alloc] initWithImage:kImage(@"common_empty_UFO")]; + [self.contentView addSubview:ufoImageView]; + [self.contentView addSubview:titleLabel]; + [ufoImageView mas_makeConstraints:^(MASConstraintMaker *make) { + make.centerX.mas_equalTo(self.contentView); + make.top.mas_equalTo(16); + make.size.mas_equalTo(CGSizeMake(110, 110)); + }]; + [titleLabel mas_makeConstraints:^(MASConstraintMaker *make) { + make.centerX.mas_equalTo(self.contentView); + make.top.mas_equalTo(ufoImageView.mas_bottom).offset(16); + make.height.mas_equalTo(20); + }]; + } + return self; +} + +@end diff --git a/YuMi/Modules/YMNewHome/View/Cell/EventCenterEventCell.h b/YuMi/Modules/YMNewHome/View/Cell/EventCenterEventCell.h index 2a4d6a79..47d34c42 100644 --- a/YuMi/Modules/YMNewHome/View/Cell/EventCenterEventCell.h +++ b/YuMi/Modules/YMNewHome/View/Cell/EventCenterEventCell.h @@ -6,11 +6,17 @@ // #import +#import "EventItemModel.h" NS_ASSUME_NONNULL_BEGIN @interface EventCenterEventCell : UITableViewCell ++ (CGFloat)cellHeight; ++ (void)registerTo:(UITableView *)tableView; ++ (EventCenterEventCell *)cellFor:(UITableView *)tableView atIndexPath:(NSIndexPath *)indexPath; + +- (void)updateCell:(EventItemModel *)model; @end NS_ASSUME_NONNULL_END diff --git a/YuMi/Modules/YMNewHome/View/Cell/EventCenterEventCell.m b/YuMi/Modules/YMNewHome/View/Cell/EventCenterEventCell.m index ae2390c1..b5b3291b 100644 --- a/YuMi/Modules/YMNewHome/View/Cell/EventCenterEventCell.m +++ b/YuMi/Modules/YMNewHome/View/Cell/EventCenterEventCell.m @@ -7,17 +7,238 @@ #import "EventCenterEventCell.h" +@interface EventCenterEventCell() + +@property (nonatomic, strong) EventItemModel *model; + +@property (nonatomic, strong) NetImageView *bgImageView; +@property (nonatomic, strong) NetImageView *avatarImageView; +@property (nonatomic, strong) UILabel *nameLabel; +@property (nonatomic, strong) UILabel *idLabel; +@property (nonatomic, strong) UILabel *eventDescLabel; +@property (nonatomic, strong) UILabel *timeLabel; +@property (nonatomic, strong) UILabel *subLabel; + +@property (nonatomic, strong) UIImageView *sexImageView; +@property (nonatomic, strong) UIImageView *clockImageView; +@property (nonatomic, strong) UIImageView *ringImageView; + +@property (nonatomic, strong) UIButton *statusButton; + +@end + @implementation EventCenterEventCell -- (void)awakeFromNib { - [super awakeFromNib]; - // Initialization code ++ (CGFloat)cellHeight { + return 130; +} + ++ (void)registerTo:(UITableView *)tableView { + [tableView registerClass:[self class] + forCellReuseIdentifier:NSStringFromClass([self class])]; +} + ++ (EventCenterEventCell *)cellFor:(UITableView *)tableView atIndexPath:(NSIndexPath *)indexPath { + return [tableView dequeueReusableCellWithIdentifier:NSStringFromClass([self class]) + forIndexPath:indexPath]; } - (void)setSelected:(BOOL)selected animated:(BOOL)animated { [super setSelected:selected animated:animated]; +} - // Configure the view for the selected state +- (instancetype)initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(NSString *)reuseIdentifier { + if (self = [super initWithStyle:style reuseIdentifier:reuseIdentifier]) { + self.selectionStyle = UITableViewCellSelectionStyleNone; + self.separatorInset = UIEdgeInsetsZero; + self.contentView.backgroundColor = [UIColor whiteColor]; + + [self.contentView addSubview:self.bgImageView]; + [self.bgImageView mas_makeConstraints:^(MASConstraintMaker *make) { + make.top.mas_equalTo(self.contentView).inset(12); + make.leading.trailing.mas_equalTo(self.contentView).inset(15); + make.height.mas_equalTo(118); + }]; + + UIView *mask_1 = [self blackMask]; + [self.contentView addSubview:mask_1]; + [mask_1 mas_makeConstraints:^(MASConstraintMaker *make) { + make.edges.mas_equalTo(self.bgImageView); + }]; + + [self.contentView addSubview:self.avatarImageView]; + [self.avatarImageView mas_makeConstraints:^(MASConstraintMaker *make) { + make.top.leading.mas_equalTo(self.bgImageView).offset(12); + make.size.mas_equalTo(CGSizeMake(35, 35)); + }]; + + [self.contentView addSubview:self.nameLabel]; + [self.nameLabel mas_makeConstraints:^(MASConstraintMaker *make) { + make.top.mas_equalTo(self.avatarImageView).offset(1); + make.leading.mas_equalTo(self.avatarImageView.mas_trailing).offset(6); + }]; + + [self.contentView addSubview:self.sexImageView]; + [self.sexImageView mas_makeConstraints:^(MASConstraintMaker *make) { + make.centerY.mas_equalTo(self.nameLabel); + make.leading.mas_equalTo(2); + make.size.mas_equalTo(CGSizeMake(14, 14)); + }]; + + [self.contentView addSubview:self.idLabel]; + [self.idLabel mas_makeConstraints:^(MASConstraintMaker *make) { + make.bottom.mas_equalTo(self.avatarImageView).offset(1); + make.leading.mas_equalTo(self.nameLabel); + }]; + + [self.contentView addSubview:self.eventDescLabel]; + [self.eventDescLabel mas_makeConstraints:^(MASConstraintMaker *make) { + make.leading.trailing.mas_equalTo(self.bgImageView).inset(12); + make.centerY.mas_equalTo(self.bgImageView); + }]; + + UIView *mask_2 = [self blackMask]; + [self.contentView addSubview:mask_2]; + [mask_2 mas_makeConstraints:^(MASConstraintMaker *make) { + make.bottom.leading.trailing.mas_equalTo(self.bgImageView); + make.height.mas_equalTo(32); + }]; + + [self.contentView addSubview:self.clockImageView]; + [self.clockImageView mas_makeConstraints:^(MASConstraintMaker *make) { + make.centerY.mas_equalTo(mask_2); + make.leading.mas_equalTo(mask_2).offset(13); + make.size.mas_equalTo(CGSizeMake(14, 14)); + }]; + + [self.contentView addSubview:self.timeLabel]; + [self.timeLabel mas_makeConstraints:^(MASConstraintMaker *make) { + make.leading.mas_equalTo(self.clockImageView.mas_trailing).offset(1); + make.centerY.mas_equalTo(mask_2); + }]; + + [self.contentView addSubview:self.subLabel]; + [self.subLabel mas_makeConstraints:^(MASConstraintMaker *make) { + make.trailing.mas_equalTo(mask_2).offset(-13); + make.centerY.mas_equalTo(mask_2); + }]; + + [self.contentView addSubview:self.ringImageView]; + [self.ringImageView mas_makeConstraints:^(MASConstraintMaker *make) { + make.centerY.mas_equalTo(mask_2); + make.trailing.mas_equalTo(self.subLabel.mas_leading).offset(-1); + make.size.mas_equalTo(CGSizeMake(14, 14)); + }]; + } + return self; +} + +- (void)updateCell:(EventItemModel *)model { + _model = model; + self.bgImageView.imageUrl = model.eventBanner; + self.avatarImageView.imageUrl = model.roomAvatar; + self.nameLabel.text = @"123"; + self.idLabel.text = [NSString stringWithFormat:@"ID:%@", @(model.roomErbanNo)]; + self.eventDescLabel.text = model.eventTopic; + self.timeLabel.text = @(model.eventStartTime).stringValue; + self.subLabel.text = @(model.subNum).stringValue; +} + +#pragma mark - +- (NetImageView *)bgImageView { + if (!_bgImageView) { + NetImageConfig *config = [[NetImageConfig alloc] init]; + config.placeHolder = [UIImageConstant defaultBannerPlaceholder]; + _bgImageView = [[NetImageView alloc] initWithConfig:config]; + [_bgImageView setCornerRadius:12]; + } + return _bgImageView; +} + +- (NetImageView *)avatarImageView { + if (!_avatarImageView) { + NetImageConfig *config = [[NetImageConfig alloc] init]; + config.placeHolder = [UIImageConstant defaultAvatarPlaceholder]; + _avatarImageView = [[NetImageView alloc] initWithConfig:config]; + [_avatarImageView setCornerRadius:35/2 + corners:kCALayerMaxXMaxYCorner | kCALayerMaxXMinYCorner | kCALayerMinXMaxYCorner | kCALayerMinXMinYCorner + borderWidth:1 + borderColor:UIColorFromRGB(0xfffff)]; + } + return _avatarImageView; +} + +- (UILabel *)nameLabel { + if (!_nameLabel) { + _nameLabel = [UILabel labelInitWithText:@"" + font:kFontRegular(14) + textColor:[UIColor whiteColor]]; + } + return _nameLabel; +} + +- (UILabel *)idLabel { + if (!_idLabel) { + _idLabel = [UILabel labelInitWithText:@"" + font:kFontRegular(12) + textColor:[UIColor colorWithWhite:1 alpha:0.6]]; + } + return _idLabel; +} + +- (UILabel *)eventDescLabel { + if (!_eventDescLabel) { + _eventDescLabel = [UILabel labelInitWithText:@"" + font:kFontMedium(14) + textColor:[UIColor colorWithWhite:1 alpha:1]]; + _eventDescLabel.numberOfLines = 0; + } + return _eventDescLabel; +} + +- (UILabel *)timeLabel { + if (!_timeLabel) { + _timeLabel = [UILabel labelInitWithText:@"" + font:kFontRegular(12) + textColor:[UIColor colorWithWhite:1 alpha:0.6]]; + } + return _timeLabel; +} + +- (UILabel *)subLabel { + if (!_subLabel) { + _subLabel = [UILabel labelInitWithText:@"" + font:kFontRegular(12) + textColor:[UIColor colorWithWhite:1 alpha:0.6]]; + } + return _subLabel; +} + +- (UIImageView *)sexImageView { + if (!_sexImageView) { + _sexImageView = [UIImageView new]; + } + return _sexImageView; +} + +- (UIImageView *)clockImageView { + if (!_clockImageView) { + _clockImageView = [[UIImageView alloc] initWithImage:kImage(@"event_clock")]; + } + return _clockImageView; +} + +- (UIImageView *)ringImageView { + if (!_ringImageView) { + _ringImageView = [[UIImageView alloc] initWithImage:kImage(@"event_ring")]; + } + return _ringImageView; +} + +- (UIView *)blackMask { + UIView *v = [[UIView alloc] init]; + v.backgroundColor = [UIColor colorWithWhite:0 alpha:0.6]; + return v; } @end diff --git a/YuMi/Modules/YMNewHome/View/Cell/EventCenterOfficialCell.h b/YuMi/Modules/YMNewHome/View/Cell/EventCenterOfficialCell.h index f0b54157..7b23232d 100644 --- a/YuMi/Modules/YMNewHome/View/Cell/EventCenterOfficialCell.h +++ b/YuMi/Modules/YMNewHome/View/Cell/EventCenterOfficialCell.h @@ -14,7 +14,7 @@ NS_ASSUME_NONNULL_BEGIN @property (nonatomic, strong) HomeBannerInfoModel *cellModel; // 更新倒计时天数 -- (void)updateCountdownWithDays:(NSInteger)days; +//- (void)updateCountdownWithDays:(NSInteger)days; @end diff --git a/YuMi/Modules/YMNewHome/View/Cell/EventCenterOfficialCell.m b/YuMi/Modules/YMNewHome/View/Cell/EventCenterOfficialCell.m index af174181..5bc7145a 100644 --- a/YuMi/Modules/YMNewHome/View/Cell/EventCenterOfficialCell.m +++ b/YuMi/Modules/YMNewHome/View/Cell/EventCenterOfficialCell.m @@ -12,16 +12,16 @@ @property (nonatomic, strong) NetImageView *coverImageView; @property (nonatomic, strong) UILabel *titleLabel; -@property (nonatomic, strong) UIStackView *countdownView; -@property (nonatomic, strong) UILabel *countdownPrefixLabel; // Countdown: 前缀标签 -@property (nonatomic, strong) UILabel *daysNumberLabel; // 天数数字标签 -@property (nonatomic, strong) UILabel *hourNumberLabel; // 天数数字标签 -@property (nonatomic, strong) UILabel *minuteNumberLabel; // 天数数字标签 -@property (nonatomic, strong) UILabel *secondNumberLabel; // 天数数字标签 -@property (nonatomic, strong) UILabel *daysSuffixLabel; // days 后缀标签 -@property (nonatomic, strong) UILabel *colonSuffixLabel_1; // ":" 标签 -@property (nonatomic, strong) UILabel *colonSuffixLabel_2; // ":" 后缀标签 -@property (nonatomic, strong) NSTimer *countdownTimer; // 倒计时定时器 +//@property (nonatomic, strong) UIStackView *countdownView; +//@property (nonatomic, strong) UILabel *countdownPrefixLabel; // Countdown: 前缀标签 +//@property (nonatomic, strong) UILabel *daysNumberLabel; // 天数数字标签 +//@property (nonatomic, strong) UILabel *hourNumberLabel; // 天数数字标签 +//@property (nonatomic, strong) UILabel *minuteNumberLabel; // 天数数字标签 +//@property (nonatomic, strong) UILabel *secondNumberLabel; // 天数数字标签 +//@property (nonatomic, strong) UILabel *daysSuffixLabel; // days 后缀标签 +//@property (nonatomic, strong) UILabel *colonSuffixLabel_1; // ":" 标签 +//@property (nonatomic, strong) UILabel *colonSuffixLabel_2; // ":" 后缀标签 +//@property (nonatomic, strong) NSTimer *countdownTimer; // 倒计时定时器 @end @@ -35,7 +35,7 @@ [self.contentView addSubview:self.coverImageView]; [self.contentView addSubview:self.titleLabel]; - [self.contentView addSubview:self.countdownView]; +// [self.contentView addSubview:self.countdownView]; [self.coverImageView mas_makeConstraints:^(MASConstraintMaker *make) { make.top.mas_equalTo(self.contentView).offset(6); @@ -49,11 +49,11 @@ make.height.mas_equalTo(26); }]; - [self.countdownView mas_makeConstraints:^(MASConstraintMaker *make) { - make.top.mas_equalTo(self.titleLabel.mas_bottom).offset(0); - make.leading.trailing.mas_equalTo(self.contentView).inset(15); - make.height.mas_equalTo(26); - }]; +// [self.countdownView mas_makeConstraints:^(MASConstraintMaker *make) { +// make.top.mas_equalTo(self.titleLabel.mas_bottom).offset(0); +// make.leading.trailing.mas_equalTo(self.contentView).inset(15); +// make.height.mas_equalTo(26); +// }]; } return self; } @@ -62,10 +62,6 @@ _cellModel = cellModel; self.coverImageView.imageUrl = cellModel.bannerPic; self.titleLabel.text = cellModel.bannerName; - - // 假设从模型中获取倒计时天数 - NSInteger days = 30; // 这里应该从cellModel中获取实际的倒计时天数 - [self updateCountdownWithDays:days]; } #pragma mark - @@ -86,154 +82,154 @@ return _titleLabel; } -- (UIStackView *)countdownView { - if (!_countdownView) { - _countdownView = [[UIStackView alloc] initWithArrangedSubviews:@[ - self.countdownPrefixLabel, - self.daysNumberLabel, - self.daysSuffixLabel, - self.hourNumberLabel, - self.colonSuffixLabel_1, - self.minuteNumberLabel, - self.colonSuffixLabel_2, - self.secondNumberLabel, - [UIView new] - ]]; - _countdownView.spacing = 6; - _countdownView.backgroundColor = [UIColor clearColor]; - - [self.daysNumberLabel mas_makeConstraints:^(MASConstraintMaker *make) { - make.width.greaterThanOrEqualTo(@30); - }]; - [self.hourNumberLabel mas_makeConstraints:^(MASConstraintMaker *make) { - make.width.greaterThanOrEqualTo(@30); - }]; - [self.minuteNumberLabel mas_makeConstraints:^(MASConstraintMaker *make) { - make.width.greaterThanOrEqualTo(@30); - }]; - [self.secondNumberLabel mas_makeConstraints:^(MASConstraintMaker *make) { - make.width.greaterThanOrEqualTo(@30); - }]; - } - return _countdownView; -} +//- (UIStackView *)countdownView { +// if (!_countdownView) { +// _countdownView = [[UIStackView alloc] initWithArrangedSubviews:@[ +// self.countdownPrefixLabel, +// self.daysNumberLabel, +// self.daysSuffixLabel, +// self.hourNumberLabel, +// self.colonSuffixLabel_1, +// self.minuteNumberLabel, +// self.colonSuffixLabel_2, +// self.secondNumberLabel, +// [UIView new] +// ]]; +// _countdownView.spacing = 6; +// _countdownView.backgroundColor = [UIColor clearColor]; +// +// [self.daysNumberLabel mas_makeConstraints:^(MASConstraintMaker *make) { +// make.width.greaterThanOrEqualTo(@30); +// }]; +// [self.hourNumberLabel mas_makeConstraints:^(MASConstraintMaker *make) { +// make.width.greaterThanOrEqualTo(@30); +// }]; +// [self.minuteNumberLabel mas_makeConstraints:^(MASConstraintMaker *make) { +// make.width.greaterThanOrEqualTo(@30); +// }]; +// [self.secondNumberLabel mas_makeConstraints:^(MASConstraintMaker *make) { +// make.width.greaterThanOrEqualTo(@30); +// }]; +// } +// return _countdownView; +//} +// +//- (UILabel *)countdownPrefixLabel { +// if (!_countdownPrefixLabel) { +// _countdownPrefixLabel = [UILabel labelInitWithText:@"Countdown: " font:kFontSemibold(16) textColor:UIColorFromRGB(0xff9900)]; +// } +// return _countdownPrefixLabel; +//} +// +//- (UILabel *)daysNumberLabel { +// if (!_daysNumberLabel) { +// _daysNumberLabel = [UILabel labelInitWithText:@"00" font:kFontSemibold(16) textColor:UIColorFromRGB(0xff9900)]; +// _daysNumberLabel.backgroundColor = [[UIColor orangeColor] colorWithAlphaComponent:0.15]; +// _daysNumberLabel.layer.cornerRadius = 6; +// _daysNumberLabel.layer.masksToBounds = YES; +// _daysNumberLabel.textAlignment = NSTextAlignmentCenter; +// } +// return _daysNumberLabel; +//} +// +//- (UILabel *)hourNumberLabel { +// if (!_hourNumberLabel) { +// _hourNumberLabel = [UILabel labelInitWithText:@"00" font:kFontSemibold(16) textColor:UIColorFromRGB(0xff9900)]; +// _hourNumberLabel.backgroundColor = [[UIColor orangeColor] colorWithAlphaComponent:0.15]; +// _hourNumberLabel.layer.cornerRadius = 6; +// _hourNumberLabel.layer.masksToBounds = YES; +// _hourNumberLabel.textAlignment = NSTextAlignmentCenter; +// } +// return _hourNumberLabel; +//} +// +//- (UILabel *)minuteNumberLabel { +// if (!_minuteNumberLabel) { +// _minuteNumberLabel = [UILabel labelInitWithText:@"00" font:kFontSemibold(16) textColor:UIColorFromRGB(0xff9900)]; +// _minuteNumberLabel.backgroundColor = [[UIColor orangeColor] colorWithAlphaComponent:0.15]; +// _minuteNumberLabel.layer.cornerRadius = 6; +// _minuteNumberLabel.layer.masksToBounds = YES; +// _minuteNumberLabel.textAlignment = NSTextAlignmentCenter; +// } +// return _minuteNumberLabel; +//} +// +//- (UILabel *)secondNumberLabel { +// if (!_secondNumberLabel) { +// _secondNumberLabel = [UILabel labelInitWithText:@"00" font:kFontSemibold(16) textColor:UIColorFromRGB(0xff9900)]; +// _secondNumberLabel.backgroundColor = [[UIColor orangeColor] colorWithAlphaComponent:0.15]; +// _secondNumberLabel.layer.cornerRadius = 6; +// _secondNumberLabel.layer.masksToBounds = YES; +// _secondNumberLabel.textAlignment = NSTextAlignmentCenter; +// } +// return _secondNumberLabel; +//} +// +//- (UILabel *)daysSuffixLabel { +// if (!_daysSuffixLabel) { +// _daysSuffixLabel = [UILabel labelInitWithText:@"days" font:kFontSemibold(16) textColor:UIColorFromRGB(0xff9900)]; +// } +// return _daysSuffixLabel; +//} +// +//- (UILabel *)colonSuffixLabel_1 { +// if (!_colonSuffixLabel_1) { +// _colonSuffixLabel_1 = [UILabel labelInitWithText:@":" font:kFontSemibold(16) textColor:UIColorFromRGB(0xff9900)]; +// } +// return _colonSuffixLabel_1; +//} +// +//- (UILabel *)colonSuffixLabel_2 { +// if (!_colonSuffixLabel_2) { +// _colonSuffixLabel_2 = [UILabel labelInitWithText:@":" font:kFontSemibold(16) textColor:UIColorFromRGB(0xff9900)]; +// } +// return _colonSuffixLabel_2; +//} -- (UILabel *)countdownPrefixLabel { - if (!_countdownPrefixLabel) { - _countdownPrefixLabel = [UILabel labelInitWithText:@"Countdown: " font:kFontSemibold(16) textColor:UIColorFromRGB(0xff9900)]; - } - return _countdownPrefixLabel; -} - -- (UILabel *)daysNumberLabel { - if (!_daysNumberLabel) { - _daysNumberLabel = [UILabel labelInitWithText:@"00" font:kFontSemibold(16) textColor:UIColorFromRGB(0xff9900)]; - _daysNumberLabel.backgroundColor = [[UIColor orangeColor] colorWithAlphaComponent:0.15]; - _daysNumberLabel.layer.cornerRadius = 6; - _daysNumberLabel.layer.masksToBounds = YES; - _daysNumberLabel.textAlignment = NSTextAlignmentCenter; - } - return _daysNumberLabel; -} - -- (UILabel *)hourNumberLabel { - if (!_hourNumberLabel) { - _hourNumberLabel = [UILabel labelInitWithText:@"00" font:kFontSemibold(16) textColor:UIColorFromRGB(0xff9900)]; - _hourNumberLabel.backgroundColor = [[UIColor orangeColor] colorWithAlphaComponent:0.15]; - _hourNumberLabel.layer.cornerRadius = 6; - _hourNumberLabel.layer.masksToBounds = YES; - _hourNumberLabel.textAlignment = NSTextAlignmentCenter; - } - return _hourNumberLabel; -} - -- (UILabel *)minuteNumberLabel { - if (!_minuteNumberLabel) { - _minuteNumberLabel = [UILabel labelInitWithText:@"00" font:kFontSemibold(16) textColor:UIColorFromRGB(0xff9900)]; - _minuteNumberLabel.backgroundColor = [[UIColor orangeColor] colorWithAlphaComponent:0.15]; - _minuteNumberLabel.layer.cornerRadius = 6; - _minuteNumberLabel.layer.masksToBounds = YES; - _minuteNumberLabel.textAlignment = NSTextAlignmentCenter; - } - return _minuteNumberLabel; -} - -- (UILabel *)secondNumberLabel { - if (!_secondNumberLabel) { - _secondNumberLabel = [UILabel labelInitWithText:@"00" font:kFontSemibold(16) textColor:UIColorFromRGB(0xff9900)]; - _secondNumberLabel.backgroundColor = [[UIColor orangeColor] colorWithAlphaComponent:0.15]; - _secondNumberLabel.layer.cornerRadius = 6; - _secondNumberLabel.layer.masksToBounds = YES; - _secondNumberLabel.textAlignment = NSTextAlignmentCenter; - } - return _secondNumberLabel; -} - -- (UILabel *)daysSuffixLabel { - if (!_daysSuffixLabel) { - _daysSuffixLabel = [UILabel labelInitWithText:@"days" font:kFontSemibold(16) textColor:UIColorFromRGB(0xff9900)]; - } - return _daysSuffixLabel; -} - -- (UILabel *)colonSuffixLabel_1 { - if (!_colonSuffixLabel_1) { - _colonSuffixLabel_1 = [UILabel labelInitWithText:@":" font:kFontSemibold(16) textColor:UIColorFromRGB(0xff9900)]; - } - return _colonSuffixLabel_1; -} - -- (UILabel *)colonSuffixLabel_2 { - if (!_colonSuffixLabel_2) { - _colonSuffixLabel_2 = [UILabel labelInitWithText:@":" font:kFontSemibold(16) textColor:UIColorFromRGB(0xff9900)]; - } - return _colonSuffixLabel_2; -} - -- (void)updateCountdownWithDays:(NSInteger)days { - // 更新天数标签 - self.daysNumberLabel.text = [NSString stringWithFormat:@"%02ld", (long)days]; - - // 如果有定时器,先停止 - [self stopCountdownTimer]; - - // 如果天数大于0,启动定时器进行倒计时 - if (days > 0) { - [self startCountdownTimerWithDays:days]; - } -} - -- (void)startCountdownTimerWithDays:(NSInteger)days { - // 创建一个每天触发一次的定时器 - // 注意:实际应用中,可能需要更精确的倒计时逻辑,这里仅作示例 - self.countdownTimer = [NSTimer scheduledTimerWithTimeInterval:86400 target:self selector:@selector(updateDaysCount) userInfo:nil repeats:YES]; -} - -- (void)updateDaysCount { - // 获取当前显示的天数 - NSInteger currentDays = [self.daysNumberLabel.text integerValue]; - - // 如果天数大于0,减少一天 - if (currentDays > 0) { - currentDays--; - self.daysNumberLabel.text = [NSString stringWithFormat:@"%02ld", (long)currentDays]; - } - - // 如果天数为0,停止定时器 - if (currentDays == 0) { - [self stopCountdownTimer]; - } -} - -- (void)stopCountdownTimer { - if (self.countdownTimer && [self.countdownTimer isValid]) { - [self.countdownTimer invalidate]; - self.countdownTimer = nil; - } -} +//- (void)updateCountdownWithDays:(NSInteger)days { +// // 更新天数标签 +// self.daysNumberLabel.text = [NSString stringWithFormat:@"%02ld", (long)days]; +// +// // 如果有定时器,先停止 +// [self stopCountdownTimer]; +// +// // 如果天数大于0,启动定时器进行倒计时 +// if (days > 0) { +// [self startCountdownTimerWithDays:days]; +// } +//} +// +//- (void)startCountdownTimerWithDays:(NSInteger)days { +// // 创建一个每天触发一次的定时器 +// // 注意:实际应用中,可能需要更精确的倒计时逻辑,这里仅作示例 +// self.countdownTimer = [NSTimer scheduledTimerWithTimeInterval:86400 target:self selector:@selector(updateDaysCount) userInfo:nil repeats:YES]; +//} +// +//- (void)updateDaysCount { +// // 获取当前显示的天数 +// NSInteger currentDays = [self.daysNumberLabel.text integerValue]; +// +// // 如果天数大于0,减少一天 +// if (currentDays > 0) { +// currentDays--; +// self.daysNumberLabel.text = [NSString stringWithFormat:@"%02ld", (long)currentDays]; +// } +// +// // 如果天数为0,停止定时器 +// if (currentDays == 0) { +// [self stopCountdownTimer]; +// } +//} +// +//- (void)stopCountdownTimer { +// if (self.countdownTimer && [self.countdownTimer isValid]) { +// [self.countdownTimer invalidate]; +// self.countdownTimer = nil; +// } +//} - (void)dealloc { // 确保在Cell被释放时停止定时器 - [self stopCountdownTimer]; +// [self stopCountdownTimer]; } @end diff --git a/YuMi/Modules/YMNewHome/View/CreateEventPickerContainerView.h b/YuMi/Modules/YMNewHome/View/CreateEventPickerContainerView.h new file mode 100644 index 00000000..72b0660e --- /dev/null +++ b/YuMi/Modules/YMNewHome/View/CreateEventPickerContainerView.h @@ -0,0 +1,12 @@ +#import "UIKit/UIKit.h" + +typedef NS_ENUM(NSInteger, CreateEventPickerType) { + CreateEventPickerTypeDuration = 0, + CreateEventPickerTypeStartTime = 1 +}; + +@interface CreateEventPickerContainerView : UIView +@property (nonatomic, assign) CreateEventPickerType pickerType; +@property (nonatomic, copy) void (^onConfirmDate)(NSDate *date, NSString *resultString); +- (void)showInView:(UIView *)parentView initialDate:(NSDate *)date pickerType:(CreateEventPickerType)type onConfirm:(void (^)(NSDate *date, NSString *resultString))onConfirm; +@end diff --git a/YuMi/Modules/YMNewHome/View/CreateEventPickerContainerView.m b/YuMi/Modules/YMNewHome/View/CreateEventPickerContainerView.m new file mode 100644 index 00000000..3d9eb086 --- /dev/null +++ b/YuMi/Modules/YMNewHome/View/CreateEventPickerContainerView.m @@ -0,0 +1,319 @@ +#import "CreateEventPickerContainerView.h" + +@interface CreateEventPickerContainerView () +@property (nonatomic, strong) UIPickerView *pickerView; +@property (nonatomic, strong) NSDate *minDate; +@property (nonatomic, strong) NSDate *maxDate; +@property (nonatomic, strong) NSArray *dateArray; +@property (nonatomic, strong) NSArray *monthArray; +@property (nonatomic, strong) NSArray *dayArray; +@property (nonatomic, strong) NSArray *hourArray; +@property (nonatomic, strong) NSDate *selectedDate; +// StartTime 相关 +@property (nonatomic, strong) NSArray *durationsOptions; +@end + +@implementation CreateEventPickerContainerView { + UIView *_pickerBg; + UILabel *_titleLabel; + UIButton *_okButton; +} + +- (instancetype)init { + self = [super init]; + if (self) { + [self setupUI]; + } + return self; +} + +- (void)setupUI { + self.backgroundColor = [[UIColor blackColor] colorWithAlphaComponent:0.3]; + + // 底部白色背景 + _pickerBg = [[UIView alloc] init]; + _pickerBg.backgroundColor = [UIColor whiteColor]; + _pickerBg.layer.cornerRadius = 16; + _pickerBg.clipsToBounds = YES; + [self addSubview:_pickerBg]; + + // 标题 + _titleLabel = [[UILabel alloc] init]; + _titleLabel.font = [UIFont systemFontOfSize:16 weight:UIFontWeightMedium]; + _titleLabel.textColor = [UIColor blackColor]; + _titleLabel.textAlignment = NSTextAlignmentCenter; + [_pickerBg addSubview:_titleLabel]; + + // OK 按钮 + _okButton = [UIButton buttonWithType:UIButtonTypeSystem]; + [_okButton setTitle:@"OK" forState:UIControlStateNormal]; + [_okButton setTitleColor:UIColorFromRGB(0xe29030) forState:UIControlStateNormal]; + _okButton.titleLabel.font = [UIFont systemFontOfSize:16 weight:UIFontWeightMedium]; + [_okButton addTarget:self action:@selector(okTapped) forControlEvents:UIControlEventTouchUpInside]; + [_pickerBg addSubview:_okButton]; + + // Picker View + self.pickerView = [[UIPickerView alloc] init]; + self.pickerView.dataSource = self; + self.pickerView.delegate = self; + [_pickerBg addSubview:self.pickerView]; + + // 点击背景关闭 + UITapGestureRecognizer *tap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(dismiss)]; + [self addGestureRecognizer:tap]; + tap.delegate = self; + + // 布局 + [_pickerBg mas_makeConstraints:^(MASConstraintMaker *make) { + make.left.right.bottom.equalTo(self); + make.height.mas_equalTo(300); + }]; + + [_titleLabel mas_makeConstraints:^(MASConstraintMaker *make) { + make.top.equalTo(_pickerBg).offset(16); + make.centerX.equalTo(_pickerBg); + }]; + + [_okButton mas_makeConstraints:^(MASConstraintMaker *make) { + make.centerY.equalTo(_titleLabel); + make.right.equalTo(_pickerBg).offset(-16); + }]; + + [self.pickerView mas_makeConstraints:^(MASConstraintMaker *make) { + make.top.equalTo(_titleLabel.mas_bottom).offset(8); + make.left.right.bottom.equalTo(_pickerBg); + }]; +} + +#pragma mark - UIGestureRecognizerDelegate +- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceiveTouch:(UITouch *)touch { + if ([touch.view isDescendantOfView:_pickerBg]) { + return NO; + } + return YES; +} + +#pragma mark - Public Methods +- (void)buildDurationDataSource { + self.durationsOptions = @[ + @{@"title": @"30分钟", @"minutes": @30}, + @{@"title": @"1小时", @"minutes": @60}, + @{@"title": @"2小时", @"minutes": @120}, + @{@"title": @"3小时", @"minutes": @180}, + @{@"title": @"4小时", @"minutes": @240}, + @{@"title": @"6小时", @"minutes": @360}, + @{@"title": @"12小时", @"minutes": @720}, + @{@"title": @"1天", @"minutes": @1440}, + @{@"title": @"2天", @"minutes": @2880}, + @{@"title": @"3天", @"minutes": @4320} + ]; +} + +- (void)buildStartTimeSourceWithInitialDate:(NSDate *)date { + NSCalendar *calendar = [NSCalendar currentCalendar]; + NSDate *now = [NSDate date]; + NSDate *start = [calendar dateByAddingUnit:NSCalendarUnitHour value:1 toDate:now options:0]; + NSDateComponents *comp = [calendar components:NSCalendarUnitYear|NSCalendarUnitMonth fromDate:start]; + comp.month += 1; + NSDate *end = [calendar dateFromComponents:comp]; + self.minDate = start; + self.maxDate = end; + NSMutableArray *months = [NSMutableArray array]; + NSMutableArray *days = [NSMutableArray array]; + NSMutableArray *hours = [NSMutableArray array]; + NSDate *iter = start; + while ([iter compare:end] == NSOrderedAscending) { + NSDateComponents *c = [calendar components:NSCalendarUnitMonth|NSCalendarUnitDay|NSCalendarUnitHour fromDate:iter]; + NSString *monthStr = [NSString stringWithFormat:@"%02ld", (long)c.month]; + NSString *dayStr = [NSString stringWithFormat:@"%02ld", (long)c.day]; + NSString *hourStr = [NSString stringWithFormat:@"%02ld:00", (long)c.hour]; + if (![months containsObject:monthStr]) [months addObject:monthStr]; + if (![days containsObject:dayStr]) [days addObject:dayStr]; + if (![hours containsObject:hourStr]) [hours addObject:hourStr]; + iter = [calendar dateByAddingUnit:NSCalendarUnitHour value:1 toDate:iter options:0]; + } + self.monthArray = months; + self.dayArray = days; + self.hourArray = hours; + self.selectedDate = start; +} + +- (void)showInView:(UIView *)parentView initialDate:(NSDate *)date pickerType:(CreateEventPickerType)type onConfirm:(void (^)(NSDate *date, NSString *resultString))onConfirm{ + self.pickerType = type; + self.onConfirmDate = onConfirm; + if (type == CreateEventPickerTypeStartTime) { + [self buildStartTimeSourceWithInitialDate:date]; + _titleLabel.text = @"Start Time"; + } else if (type == CreateEventPickerTypeDuration) { + [self buildDurationDataSource]; + _titleLabel.text = @"Duration"; + } + self.frame = parentView.bounds; + [parentView addSubview:self]; + self.alpha = 0; + [self.pickerView reloadAllComponents]; + [UIView animateWithDuration:0.25 animations:^{ + self.alpha = 1; + }]; +} + +#pragma mark - UIPickerViewDataSource & Delegate +- (NSInteger)numberOfComponentsInPickerView:(UIPickerView *)pickerView { + switch (self.pickerType) { + case CreateEventPickerTypeStartTime: + return 3; + break; + case CreateEventPickerTypeDuration: + default: + return 1; + break; + } +} + +- (NSInteger)pickerView:(UIPickerView *)pickerView numberOfRowsInComponent:(NSInteger)component { + switch (self.pickerType) { + case CreateEventPickerTypeStartTime: { + if (component == 0) return self.monthArray.count; + if (component == 1) return self.dayArray.count; + if (component == 2) return self.hourArray.count; + } + break; + case CreateEventPickerTypeDuration: + default: + return self.durationsOptions.count; + break; + } + return 0; +} + +- (void)pickerView:(UIPickerView *)pickerView didSelectRow:(NSInteger)row inComponent:(NSInteger)component { + switch (self.pickerType) { + case CreateEventPickerTypeStartTime: { + NSInteger monthIdx = [pickerView selectedRowInComponent:0]; + NSInteger dayIdx = [pickerView selectedRowInComponent:1]; + NSInteger hourIdx = [pickerView selectedRowInComponent:2]; + NSCalendar *calendar = [NSCalendar currentCalendar]; + NSDateComponents *nowComp = [calendar components:NSCalendarUnitYear fromDate:[NSDate date]]; + NSInteger year = nowComp.year; + NSInteger month = [self.monthArray[monthIdx] integerValue]; + NSInteger day = [self.dayArray[dayIdx] integerValue]; + NSInteger hour = [[self.hourArray[hourIdx] substringToIndex:2] integerValue]; + NSDateComponents *selComp = [[NSDateComponents alloc] init]; + selComp.year = year; + selComp.month = month; + selComp.day = day; + selComp.hour = hour; + selComp.minute = 0; + self.selectedDate = [calendar dateFromComponents:selComp]; + } + break; + case CreateEventPickerTypeDuration: { + NSInteger minutes = [self.durationsOptions[row][@"minutes"] integerValue]; + NSCalendar *calendar = [NSCalendar currentCalendar]; + self.selectedDate = [calendar dateByAddingUnit:NSCalendarUnitMinute value:minutes toDate:[NSDate date] options:0]; + } + break; + default: + break; + } + + dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(0 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{ + [pickerView reloadComponent:component]; + }); +} + +- (NSAttributedString *)pickerView:(UIPickerView *)pickerView attributedTitleForRow:(NSInteger)row forComponent:(NSInteger)component { + NSInteger selectedRow = [pickerView selectedRowInComponent:component]; + BOOL isSelectedRow = selectedRow == row; + NSString *content = @""; + switch (self.pickerType) { + case CreateEventPickerTypeStartTime: { + if (component == 0) content = self.monthArray[row]; + if (component == 1) content = self.dayArray[row]; + if (component == 2) content = self.hourArray[row]; + } + break; + case CreateEventPickerTypeDuration: + content = self.durationsOptions[row][@"title"]; + break; + default: + break; + } + + return [[NSAttributedString alloc] initWithString:content attributes:@{ + NSFontAttributeName: isSelectedRow ? kFontMedium(15) : kFontRegular(14), + NSForegroundColorAttributeName: isSelectedRow ? UIColorFromRGB(0x313131) : UIColorFromRGB(0x7b7b7d) + }]; +} + +//- (UIView *)pickerView:(UIPickerView *)pickerView viewForRow:(NSInteger)row forComponent:(NSInteger)component reusingView:(UIView *)view { +// __block UILabel *label = (UILabel *)view; +//// dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(0 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{ +// if (!label) { +// label = [[UILabel alloc] init]; +// label.textAlignment = NSTextAlignmentCenter; +// } +// +// NSString *content = @""; +// switch (self.pickerType) { +// case CreateEventPickerTypeStartTime: { +// if (component == 0) content = self.monthArray[row]; +// if (component == 1) content = self.dayArray[row]; +// if (component == 2) content = self.hourArray[row]; +// } +// break; +// case CreateEventPickerTypeDuration: +// content = self.durationsOptions[row][@"title"]; +// break; +// default: +// break; +// } +// +// label.text = content; +// +// // 设置选中和未选中状态的样式 +// NSInteger selectedRow = [pickerView selectedRowInComponent:component]; +// if (row == selectedRow) { +// label.textColor = UIColorFromRGB(0x313131); +// label.font = kFontMedium(15); +// } else { +// label.textColor = UIColorFromRGB(0x7b7b7d); +// label.font = kFontRegular(14); +// } +//// }); +// return label; +//} + +#pragma mark - Actions +- (void)okTapped { + if (self.onConfirmDate) { + NSString *resultString = @""; + switch (self.pickerType) { + case CreateEventPickerTypeStartTime: { + NSDateFormatter *formatter = [[NSDateFormatter alloc] init]; + formatter.dateFormat = @"yyyy-MM-dd-HH:mm"; + resultString = [formatter stringFromDate:self.selectedDate]; + } + break; + case CreateEventPickerTypeDuration: { + NSInteger selectedRow = [self.pickerView selectedRowInComponent:0]; + resultString = self.durationsOptions[selectedRow][@"title"]; + } + break; + default: + break; + } + self.onConfirmDate(self.selectedDate, resultString); + } + [self dismiss]; +} + +- (void)dismiss { + [UIView animateWithDuration:0.25 animations:^{ + self.alpha = 0; + } completion:^(BOOL finished) { + [self removeFromSuperview]; + }]; +} + +@end diff --git a/YuMi/Modules/YMNewHome/View/CreateEventSelectRoomViewController.m b/YuMi/Modules/YMNewHome/View/CreateEventSelectRoomViewController.m index 2771ad47..c496f433 100644 --- a/YuMi/Modules/YMNewHome/View/CreateEventSelectRoomViewController.m +++ b/YuMi/Modules/YMNewHome/View/CreateEventSelectRoomViewController.m @@ -7,7 +7,7 @@ #import "CreateEventSelectRoomViewController.h" #import "CreateEventPresenter.h" - +#import "EventCenterEmptyCell.h" @interface CreateEventSelectRoomEmptyCell : UITableViewCell + (CGFloat)cellHeight; @@ -159,7 +159,8 @@ tableView.separatorInset = UIEdgeInsetsZero; tableView.backgroundColor = [UIColor whiteColor]; [CreateEventSelectRoomCell registerTo:tableView]; - [CreateEventSelectRoomEmptyCell registerTo:tableView]; +// [CreateEventSelectRoomEmptyCell registerTo:tableView]; + [EventCenterEmptyCell registerTo:tableView]; [self.view addSubview:tableView]; } @@ -223,7 +224,7 @@ switch (indexPath.section) { case 0: { if (self.myRooms.count == 0) { - cell = [CreateEventSelectRoomEmptyCell cellFor:tableView atIndexPath:indexPath]; + cell = [EventCenterEmptyCell cellFor:tableView atIndexPath:indexPath]; } else { cell = [CreateEventSelectRoomCell cellFor:tableView atIndexPath:indexPath]; } @@ -231,7 +232,7 @@ break; case 1: { if (self.adminRooms.count == 0) { - cell = [CreateEventSelectRoomEmptyCell cellFor:tableView atIndexPath:indexPath]; + cell = [EventCenterEmptyCell cellFor:tableView atIndexPath:indexPath]; } else { cell = [CreateEventSelectRoomCell cellFor:tableView atIndexPath:indexPath]; } diff --git a/YuMi/Modules/YMNewHome/View/CreateEventViewControllerV2.m b/YuMi/Modules/YMNewHome/View/CreateEventViewControllerV2.m index 83bbbc44..a3663711 100644 --- a/YuMi/Modules/YMNewHome/View/CreateEventViewControllerV2.m +++ b/YuMi/Modules/YMNewHome/View/CreateEventViewControllerV2.m @@ -9,14 +9,120 @@ #import #import +#import "CreateEventPickerContainerView.h" #import "CreateEventSelectRoomViewController.h" #define MAX_EVENT_TITLE_LENGTH 20 #define MAX_EVENT_CONTENT_LENGTH 100 -@interface CreateEventViewControllerV2 () +//@interface CreateEventPickerContainerView : UIView +//@property (nonatomic, copy) void (^onConfirm)(NSInteger hour, NSInteger min); +//@property (nonatomic, assign) NSInteger selectedHour; +//@property (nonatomic, assign) NSInteger selectedMin; +//@property (nonatomic, strong) UIPickerView *pickerView; +//- (void)showInView:(UIView *)parentView initialHour:(NSInteger)hour initialMin:(NSInteger)min; +//- (void)dismiss; +//@end +// +//@implementation CreateEventPickerContainerView { +// UIView *_pickerBg; +// UILabel *_titleLabel; +// UIButton *_okButton; +//} +//- (instancetype)init { +// self = [super initWithFrame:CGRectZero]; +// if (self) { +// self.backgroundColor = [[UIColor blackColor] colorWithAlphaComponent:0.3]; +// _pickerBg = [[UIView alloc] init]; +// _pickerBg.backgroundColor = [UIColor whiteColor]; +// _pickerBg.layer.cornerRadius = 16; +// _pickerBg.clipsToBounds = YES; +// [self addSubview:_pickerBg]; +// [_pickerBg mas_makeConstraints:^(MASConstraintMaker *make) { +// make.left.right.equalTo(self); +// make.bottom.equalTo(self.mas_bottom); +// make.height.mas_equalTo(300); +// }]; +// _titleLabel = [[UILabel alloc] init]; +// _titleLabel.text = YMLocalizedString(@"20.20.59_text_16"); +// _titleLabel.font = kFontMedium(16); +// _titleLabel.textAlignment = NSTextAlignmentCenter; +// [_pickerBg addSubview:_titleLabel]; +// [_titleLabel mas_makeConstraints:^(MASConstraintMaker *make) { +// make.top.equalTo(_pickerBg.mas_top).offset(16); +// make.centerX.equalTo(_pickerBg); +// }]; +// _okButton = [UIButton buttonWithType:UIButtonTypeCustom]; +// [_okButton setTitle:@"OK" forState:UIControlStateNormal]; +// [_okButton setTitleColor:UIColorFromRGB(0xe29030) forState:UIControlStateNormal]; +// _okButton.titleLabel.font = kFontMedium(16); +// [_okButton addTarget:self action:@selector(okTapped) forControlEvents:UIControlEventTouchUpInside]; +// [_pickerBg addSubview:_okButton]; +// [_okButton mas_makeConstraints:^(MASConstraintMaker *make) { +// make.centerY.equalTo(_titleLabel); +// make.trailing.equalTo(_pickerBg.mas_trailing).offset(-20); +// }]; +// self.pickerView = [[UIPickerView alloc] init]; +// self.pickerView.dataSource = self; +// self.pickerView.delegate = self; +// [_pickerBg addSubview:self.pickerView]; +// [self.pickerView mas_makeConstraints:^(MASConstraintMaker *make) { +// make.left.right.bottom.equalTo(_pickerBg); +// make.top.equalTo(_titleLabel.mas_bottom).offset(8); +// }]; +// UITapGestureRecognizer *tap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(dismiss)]; +// [self addGestureRecognizer:tap]; +// tap.cancelsTouchesInView = NO; +// } +// return self; +//} +//- (void)showInView:(UIView *)parentView initialHour:(NSInteger)hour initialMin:(NSInteger)min { +// self.selectedHour = hour; +// self.selectedMin = min; +// self.frame = parentView.bounds; +// [parentView addSubview:self]; +// self.alpha = 0; +// [self.pickerView selectRow:hour inComponent:0 animated:NO]; +// [self.pickerView selectRow:min/30 inComponent:1 animated:NO]; +// [UIView animateWithDuration:0.25 animations:^{ +// self.alpha = 1; +// }]; +//} +//- (void)dismiss { +// [UIView animateWithDuration:0.25 animations:^{ +// self.alpha = 0; +// } completion:^(BOOL finished) { +// [self removeFromSuperview]; +// }]; +//} +//- (void)okTapped { +// if (self.onConfirm) self.onConfirm(self.selectedHour, self.selectedMin); +// [self dismiss]; +//} +//// UIPickerViewDataSource +//- (NSInteger)numberOfComponentsInPickerView:(UIPickerView *)pickerView { return 2; } +//- (NSInteger)pickerView:(UIPickerView *)pickerView numberOfRowsInComponent:(NSInteger)component { +// if (component == 0) return 7; +// return 2; +//} +//// UIPickerViewDelegate + +//- (void)pickerView:(UIPickerView *)pickerView didSelectRow:(NSInteger)row inComponent:(NSInteger)component { +// if (component == 0) self.selectedHour = row; +// else self.selectedMin = row * 30; +// [pickerView reloadComponent:component]; +//} +//@end + +@interface CreateEventViewControllerV2 () @property (nonatomic, strong) UIImage *selectedImage; +//@property (nonatomic, strong) UIView *durationPickerContainerView; +@property (nonatomic, strong) CreateEventPickerContainerView *durationPickerView; +@property (nonatomic, strong) UILabel *durationPickerTitleLabel; +@property (nonatomic, strong) UIButton *durationPickerOkButton; +@property (nonatomic, assign) NSInteger selectedHour; +@property (nonatomic, assign) NSInteger selectedMin; // 添加私有方法声明 - (UIButton *)createUploadBannerButtonWithTitle:(NSString *)title imageName:(NSString *)imageName selectedImageName:(NSString *)selectedImageName tag:(NSInteger)tag; @@ -30,8 +136,7 @@ - (void)setupDurationPicker; - (void)showDurationPicker; - (void)hideDurationPicker; -- (void)durationPickerDoneTapped; -- (void)durationPickerCancelTapped; +- (void)durationPickerOkTapped; @end @implementation CreateEventViewControllerV2 @@ -46,7 +151,7 @@ static const CGFloat kSectionSpacing = 20.0; self.title = @"Create Event"; [self setupUI]; - [self setupDatePicker]; // 新增:调用日期选择器设置方法 +// [self setupDatePicker]; // 新增:调用日期选择器设置方法 // [self setupDurationPicker]; // 新增:调用时长选择器设置方法 [self updateEventTitleCharCount]; [self updateEventContentCharCount]; @@ -280,24 +385,21 @@ static const CGFloat kSectionSpacing = 20.0; } - (void)selectStartTimeTapped { - NSLog(@"Select Start Time Tapped"); - - - NSDateFormatter *formatter = [[NSDateFormatter alloc] init]; - formatter.dateFormat = @"yyyy-MM-dd HH:mm"; - self.startTimePlaceholderLabel.text = [formatter stringFromDate:[NSDate date]]; - self.startTimePlaceholderLabel.textColor = [UIColor blackColor]; - [self checkCreateEventButtonState]; + CreateEventPickerContainerView *view = [CreateEventPickerContainerView new]; + __weak typeof(self) weakSelf = self; + [view showInView:self.view initialDate:[NSDate date] pickerType:CreateEventPickerTypeStartTime onConfirm:^(NSDate *date, NSString *resultString) { + weakSelf.startTimePlaceholderLabel.text = resultString; + [weakSelf checkCreateEventButtonState]; + }]; } - (void)selectDurationTapped { - NSLog(@"Select Duration Tapped"); - // Placeholder: Show a duration picker -// self.durationPlaceholderLabel.text = @"2 hours"; -// self.durationPlaceholderLabel.textColor = [UIColor blackColor]; - - self.datePickerContainerView.hidden = NO; - [self checkCreateEventButtonState]; + CreateEventPickerContainerView *view = [CreateEventPickerContainerView new]; + __weak typeof(self) weakSelf = self; + [view showInView:self.view initialDate:[NSDate date] pickerType:CreateEventPickerTypeDuration onConfirm:^(NSDate *date, NSString *resultString) { + weakSelf.durationPlaceholderLabel.text = resultString; + [weakSelf checkCreateEventButtonState]; + }]; } - (void)createEventButtonTapped { @@ -490,12 +592,21 @@ static const CGFloat kSectionSpacing = 20.0; } - (void)showDatePicker { - [self.view bringSubviewToFront:self.datePickerContainerView]; - self.datePickerContainerView.hidden = NO; - self.datePickerContainerView.alpha = 0; - [UIView animateWithDuration:0.3 animations:^{ - self.datePickerContainerView.alpha = 1; + CreateEventPickerContainerView *picker = [[CreateEventPickerContainerView alloc] init]; + [picker showInView:self.view initialDate:[NSDate date] pickerType:CreateEventPickerTypeStartTime onConfirm:^(NSDate *date, NSString *resultString) { + }]; + + +// if (!_datePickerContainerView) { +// [self setupDatePicker]; +// } +// [self.view bringSubviewToFront:self.datePickerContainerView]; +// self.datePickerContainerView.hidden = NO; +// self.datePickerContainerView.alpha = 0; +// [UIView animateWithDuration:0.3 animations:^{ +// self.datePickerContainerView.alpha = 1; +// }]; } - (void)hideDatePicker { @@ -542,39 +653,6 @@ static const CGFloat kSectionSpacing = 20.0; } } -#pragma mark - UIPickerViewDataSource - -- (NSInteger)numberOfComponentsInPickerView:(UIPickerView *)pickerView { - if (pickerView == self.durationPicker) { - return 2; // Hours and Minutes - } - return 0; -} - -- (NSInteger)pickerView:(UIPickerView *)pickerView numberOfRowsInComponent:(NSInteger)component { - if (pickerView == self.durationPicker) { - if (component == 0) { // Hours component - return 24; // 1 to 24 hours - } else if (component == 1) { // Minutes component - return 12; // 0, 5, 10, ..., 55 minutes (12 options) - } - } - return 0; -} - -#pragma mark - UIPickerViewDelegate - -- (NSString *)pickerView:(UIPickerView *)pickerView titleForRow:(NSInteger)row forComponent:(NSInteger)component { - if (pickerView == self.durationPicker) { - if (component == 0) { // Hours component - return [NSString stringWithFormat:@"%ld h", (long)row + 1]; - } else if (component == 1) { // Minutes component - return [NSString stringWithFormat:@"%02ld m", (long)row * 5]; - } - } - return nil; -} - #pragma mark - Event Title Section - (void)setupEventTitleSection { self.eventTitleLabel = [self createLabelWithText:YMLocalizedString(@"20.20.59_text_9")]; @@ -761,10 +839,10 @@ static const CGFloat kSectionSpacing = 20.0; [self.notifyFansSwitch mas_makeConstraints:^(MASConstraintMaker *make) { make.centerY.equalTo(self.notifyFansLabel); make.trailing.equalTo(self.contentView).offset(-kHorizontalPadding); - make.bottom.equalTo(self.contentView).offset(-kSectionSpacing); + make.bottom.equalTo(self.contentView).offset(-kSectionSpacing*5); }]; [self.contentView mas_makeConstraints:^(MASConstraintMaker *make) { - make.bottom.greaterThanOrEqualTo(self.notifyFansSwitch.mas_bottom).offset(20 + 60); + make.bottom.greaterThanOrEqualTo(self.notifyFansSwitch.mas_bottom).offset(kSectionSpacing*5); }]; } @@ -790,4 +868,55 @@ static const CGFloat kSectionSpacing = 20.0; } } +#pragma mark - Duration Picker Methods + +- (void)setupDurationPicker { + if (!self.durationPickerView) { + self.durationPickerView = [[CreateEventPickerContainerView alloc] init]; + } + __weak typeof(self) weakSelf = self; + [self.durationPickerView showInView:self.view + initialDate:[NSDate date] + pickerType:CreateEventPickerTypeDuration + onConfirm:^(NSDate *date, NSString *resultString) { + weakSelf.durationPlaceholderLabel.text = resultString; + [weakSelf checkCreateEventButtonState]; + }]; +} + +- (void)showDurationPicker { + [self setupDurationPicker]; + [self.view bringSubviewToFront:self.durationPickerView]; + self.durationPickerView.hidden = NO; + self.durationPickerView.alpha = 0; + [UIView animateWithDuration:0.25 animations:^{ + self.durationPickerView.alpha = 1; + }]; +} + +- (void)hideDurationPicker { + [UIView animateWithDuration:0.25 animations:^{ + self.durationPickerView.alpha = 0; + } completion:^(BOOL finished) { + self.durationPickerView.hidden = YES; + }]; +} + +- (void)durationPickerOkTapped { + [self hideDurationPicker]; + // 更新 label + NSString *hourStr = [NSString stringWithFormat:@"%ldHours", (long)self.selectedHour]; + NSString *minStr = [NSString stringWithFormat:@"%ldMins", (long)self.selectedMin]; + if (self.selectedHour == 0 && self.selectedMin == 0) { + self.durationPlaceholderLabel.text = YMLocalizedString(@"XPAnchorPKTableViewCell2"); + } else if (self.selectedMin == 0) { + self.durationPlaceholderLabel.text = hourStr; + } else if (self.selectedHour == 0) { + self.durationPlaceholderLabel.text = minStr; + } else { + self.durationPlaceholderLabel.text = [NSString stringWithFormat:@"%@ & %@", hourStr, minStr]; + } + [self checkCreateEventButtonState]; +} + @end diff --git a/YuMi/Modules/YMNewHome/View/CustomView/XPNewHomeHeadView.h b/YuMi/Modules/YMNewHome/View/CustomView/XPNewHomeHeadView.h index 196af968..f7cd58b5 100644 --- a/YuMi/Modules/YMNewHome/View/CustomView/XPNewHomeHeadView.h +++ b/YuMi/Modules/YMNewHome/View/CustomView/XPNewHomeHeadView.h @@ -11,14 +11,14 @@ NS_ASSUME_NONNULL_BEGIN @class PIHomeItemModel; @protocol XPNewHomeHeadViewDelegate ///选择 --(void)selectItemWithModel:(PIHomeItemModel *)model; +-(void)selectItemAtIndexPath:(NSIndexPath *)indexPath; -(void)selectBannerListWithModel:(HomeBannerInfoModel *)model; @end @interface XPNewHomeHeadView : UIView @property (nonatomic,copy) NSArray *bannerList; -@property(nonatomic,copy) NSArray *itemList; + @property (nonatomic,copy) NSArray *rankAvatars; @property(nonatomic,weak) iddelegate; @end diff --git a/YuMi/Modules/YMNewHome/View/CustomView/XPNewHomeHeadView.m b/YuMi/Modules/YMNewHome/View/CustomView/XPNewHomeHeadView.m index 01728155..d93c3eff 100644 --- a/YuMi/Modules/YMNewHome/View/CustomView/XPNewHomeHeadView.m +++ b/YuMi/Modules/YMNewHome/View/CustomView/XPNewHomeHeadView.m @@ -210,23 +210,6 @@ _pi_BannerView.hidden = YES; } } -- (void)setItemList:(NSArray *)itemList{ - _itemList = itemList; - self.collectionView.scrollEnabled = _itemList.count > 2; - self.collectionView.hidden = _itemList.count == 0; - dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(0.1 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{ - [self.collectionView reloadData]; - }); - - if (_itemList.count == 0){ - [self.collectionView mas_remakeConstraints:^(MASConstraintMaker *make) { - make.leading.mas_equalTo(0); - make.trailing.mas_equalTo(0); - make.top.mas_equalTo(kGetScaleWidth(0)); - make.height.mas_equalTo(kGetScaleWidth(0)); - }]; - } -} - (void)setRankAvatars:(NSArray *)rankAvatars { _rankAvatars = rankAvatars; @@ -234,34 +217,29 @@ } - (NSInteger)collectionView:(UICollectionView *)collectionView numberOfItemsInSection:(NSInteger)section { - return self.itemList.count > 0 ? self.itemList.count : 2; + return 2; } - (__kindof UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath { XPNewHomeItemCell *cell = [collectionView dequeueReusableCellWithReuseIdentifier:NSStringFromClass([XPNewHomeItemCell class]) forIndexPath:indexPath]; - if(indexPath.row < self.itemList.count){ - if (indexPath.row == 0) { - cell.rankAvatarsModelArray = self.rankAvatars; - cell.itemModel = [self.itemList xpSafeObjectAtIndex:indexPath.row]; - } else { - cell.itemModel = [self.itemList xpSafeObjectAtIndex:indexPath.row]; - } + if (indexPath.row == 0) { + cell.rankAvatarsModelArray = self.rankAvatars; } + [cell setCellWith:indexPath]; + @kWeakify(self); cell.didTapRankArea = ^{ @kStrongify(self); - PIHomeItemModel *model = [self.itemList xpSafeObjectAtIndex:indexPath.row]; - if(model != nil && self.delegate && [self.delegate respondsToSelector:@selector(selectItemWithModel:)]){ - [self.delegate selectItemWithModel:model]; + if(self.delegate && [self.delegate respondsToSelector:@selector(selectItemAtIndexPath:)]){ + [self.delegate selectItemAtIndexPath:indexPath]; } }; return cell; } - (void)collectionView:(UICollectionView *)collectionView didSelectItemAtIndexPath:(NSIndexPath *)indexPath{ - PIHomeItemModel *model = [self.itemList xpSafeObjectAtIndex:indexPath.row]; - if(model != nil && self.delegate && [self.delegate respondsToSelector:@selector(selectItemWithModel:)]){ - [self.delegate selectItemWithModel:model]; + if(self.delegate && [self.delegate respondsToSelector:@selector(selectItemAtIndexPath:)]){ + [self.delegate selectItemAtIndexPath:indexPath]; } } @@ -277,9 +255,7 @@ _collectionView.dataSource = self; _collectionView.delegate = self; _collectionView.pagingEnabled = NO; - _collectionView.hidden = YES; _collectionView.scrollEnabled = NO; -// _collectionView.userInteractionEnabled = NO; _collectionView.backgroundColor = [UIColor clearColor]; [_collectionView registerClass:[XPNewHomeItemCell class] forCellWithReuseIdentifier:NSStringFromClass([XPNewHomeItemCell class])]; _collectionView.showsVerticalScrollIndicator = NO; diff --git a/YuMi/Modules/YMNewHome/View/CustomView/XPNewHomeItemCell.h b/YuMi/Modules/YMNewHome/View/CustomView/XPNewHomeItemCell.h index 5f500e9d..09c4a03e 100644 --- a/YuMi/Modules/YMNewHome/View/CustomView/XPNewHomeItemCell.h +++ b/YuMi/Modules/YMNewHome/View/CustomView/XPNewHomeItemCell.h @@ -14,6 +14,7 @@ NS_ASSUME_NONNULL_BEGIN @property(nonatomic, strong) PIHomeItemModel *itemModel; @property (nonatomic, copy) NSArray *rankAvatarsModelArray; @property (nonatomic, copy) void(^didTapRankArea)(void); +- (void)setCellWith:(NSIndexPath *)indexPath; @end NS_ASSUME_NONNULL_END diff --git a/YuMi/Modules/YMNewHome/View/CustomView/XPNewHomeItemCell.m b/YuMi/Modules/YMNewHome/View/CustomView/XPNewHomeItemCell.m index 638aede4..eec68d1a 100644 --- a/YuMi/Modules/YMNewHome/View/CustomView/XPNewHomeItemCell.m +++ b/YuMi/Modules/YMNewHome/View/CustomView/XPNewHomeItemCell.m @@ -145,6 +145,7 @@ @property (nonatomic,strong) NSArray *avatarsList; @end + @implementation XPNewHomeItemCell -(instancetype)initWithFrame:(CGRect)frame{ self = [super initWithFrame:frame]; @@ -186,6 +187,14 @@ } } +- (void)setCellWith:(NSIndexPath *)indexPath { + if (indexPath.row == 0) { + self.bgImageView.image = [UIImage imageNamed:@"home_rank_Heads_bg"]; + } else { + self.bgImageView.image = [UIImage getLanguageImage:@"entrance_activities"]; + } +} + - (void)setRankAvatarsModelArray:(NSArray *)rankAvatarsModelArray { // if (![self.itemModel.ID isEqualToString:@"3"]) { // return; diff --git a/YuMi/Modules/YMNewHome/View/EventCenterEmptyCell.h b/YuMi/Modules/YMNewHome/View/EventCenterEmptyCell.h new file mode 100644 index 00000000..157f9ce1 --- /dev/null +++ b/YuMi/Modules/YMNewHome/View/EventCenterEmptyCell.h @@ -0,0 +1,7 @@ +@interface EventCenterEmptyCell : UITableViewCell + ++ (CGFloat)cellHeight; ++ (void)registerTo:(UITableView *)tableView; ++ (EventCenterEmptyCell *)cellFor:(UITableView *)tableView atIndexPath:(NSIndexPath *)indexPath; + +@end \ No newline at end of file diff --git a/YuMi/Modules/YMNewHome/View/EventCenterEmptyCell.m b/YuMi/Modules/YMNewHome/View/EventCenterEmptyCell.m new file mode 100644 index 00000000..7f168ed4 --- /dev/null +++ b/YuMi/Modules/YMNewHome/View/EventCenterEmptyCell.m @@ -0,0 +1,44 @@ +#import "EventCenterEmptyCell.h" + +@implementation EventCenterEmptyCell +{ + UILabel *titleLabel; + UIImageView *ufoImageView; +} + ++ (CGFloat)cellHeight { + return 170; +} + ++ (void)registerTo:(UITableView *)tableView { + [tableView registerClass:[self class] + forCellReuseIdentifier:NSStringFromClass([self class])]; +} + ++ (EventCenterEmptyCell *)cellFor:(UITableView *)tableView atIndexPath:(NSIndexPath *)indexPath { + return [tableView dequeueReusableCellWithIdentifier:NSStringFromClass([self class]) forIndexPath:indexPath]; +} + +- (instancetype)initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(NSString *)reuseIdentifier { + if (self = [super initWithStyle:style reuseIdentifier:reuseIdentifier]) { + titleLabel = [UILabel labelInitWithText:YMLocalizedString(@"20.20.59_text_19") + font:kFontRegular(14) + textColor:UIColorFromRGB(0xafb1b3)]; + ufoImageView = [[UIImageView alloc] initWithImage:kImage(@"common_empty_UFO")]; + [self.contentView addSubview:ufoImageView]; + [self.contentView addSubview:titleLabel]; + [ufoImageView mas_makeConstraints:^(MASConstraintMaker *make) { + make.centerX.mas_equalTo(self.contentView); + make.top.mas_equalTo(16); + make.size.mas_equalTo(CGSizeMake(110, 110)); + }]; + [titleLabel mas_makeConstraints:^(MASConstraintMaker *make) { + make.centerX.mas_equalTo(self.contentView); + make.top.mas_equalTo(ufoImageView.mas_bottom).offset(16); + make.height.mas_equalTo(20); + }]; + } + return self; +} + +@end \ No newline at end of file diff --git a/YuMi/Modules/YMNewHome/View/EventCenterViewController.m b/YuMi/Modules/YMNewHome/View/EventCenterViewController.m index eb68c298..85e5bee1 100644 --- a/YuMi/Modules/YMNewHome/View/EventCenterViewController.m +++ b/YuMi/Modules/YMNewHome/View/EventCenterViewController.m @@ -9,17 +9,26 @@ #import "EventCenterPresenter.h" #import "EventCenterEventCell.h" #import "EventCenterOfficialCell.h" +#import "EventCenterEmptyCell.h" #import "CreateEventViewControllerV2.h" +#import "HomeBannerInfoModel.h" +#import "CreateEventPresenter.h" +#import "EventCenterEventCell.h" +#import "XPWebViewController.h" +#import "XPRoomViewController.h" -@interface EventCenterViewController () +@interface EventCenterViewController () -@property (nonatomic, strong) NSMutableArray *officialDatasource; -@property (nonatomic, strong) NSMutableArray *eventSquareDatasource; -@property (nonatomic, strong) NSMutableArray *myEventDatasource; +@property (nonatomic, strong) NSMutableArray *officialDatasource; +@property (nonatomic, strong) NSMutableArray *eventSquareDatasource; +@property (nonatomic, strong) NSMutableArray *myCreateEventDatasource; +@property (nonatomic, strong) NSMutableArray *mySubEventDatasource; @property (nonatomic, strong) UITableView *officialTableView; @property (nonatomic, strong) UITableView *myEventTableView; @property (nonatomic, strong) UITableView *eventSquareTableView; +@property (nonatomic, assign) NSInteger myEventTableViewPage; +@property (nonatomic, assign) NSInteger eventSquareTableViewPage; @property (nonatomic, strong) UIView *tabView; @property (nonatomic, strong) UIImageView *indicatorImageView; @@ -36,8 +45,8 @@ @implementation EventCenterViewController -- (__kindof id)presenter { - return [[EventCenterPresenter alloc] init]; +- (CreateEventPresenter *)createPresenter { + return [[CreateEventPresenter alloc] init]; } - (void)viewDidLoad { @@ -100,6 +109,9 @@ } - (void)setupPageViewController { + self.myEventTableViewPage = 1; + self.eventSquareTableViewPage = 1; + // 创建内容页面控制器 NSMutableArray *viewControllers = [NSMutableArray array]; @@ -152,6 +164,18 @@ #pragma mark - Setup Data - (void)setOfficialEventModels:(NSArray *)officialEventModels { _officialDatasource = officialEventModels.mutableCopy; +// NSPredicate *predicate = [NSPredicate predicateWithFormat:@"activityShow == %@", @(1)]; +// [_officialDatasource filterUsingPredicate:predicate]; + + // 处理空数据状态 + if (_officialDatasource.count == 0) { + self.officialTableView.mj_header.hidden = YES; + self.officialTableView.mj_footer.hidden = YES; + } else { + self.officialTableView.mj_header.hidden = NO; + self.officialTableView.mj_footer.hidden = NO; + } + [self.officialTableView reloadData]; } @@ -205,31 +229,47 @@ - (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section { if (tableView == self.officialTableView) { - return self.officialDatasource.count > 0 ? self.officialDatasource.count : 0; + return self.officialDatasource.count > 0 ? self.officialDatasource.count : 1; } else if (tableView == self.eventSquareTableView) { - return self.eventSquareDatasource.count > 0 ? self.eventSquareDatasource.count : 0; + return self.eventSquareDatasource.count > 0 ? self.eventSquareDatasource.count : 1; } else { - return self.myEventDatasource.count > 0 ? self.myEventDatasource.count : 0; + switch (section) { + case 0: + return self.myCreateEventDatasource.count > 0 ? self.myCreateEventDatasource.count : 1; + break; + case 1: + return self.mySubEventDatasource.count > 0 ? self.mySubEventDatasource.count : 1; + break; + default: + return 0; + break; + } } } - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { if (tableView == self.officialTableView) { - EventCenterOfficialCell *cell = [tableView dequeueReusableCellWithIdentifier:NSStringFromClass([EventCenterOfficialCell class])]; + if (self.officialDatasource.count == 0) { + return [EventCenterEmptyCell cellFor:tableView atIndexPath:indexPath]; + } + EventCenterOfficialCell *cell = [tableView dequeueReusableCellWithIdentifier:NSStringFromClass([EventCenterOfficialCell class])]; if (!cell) { cell = [[EventCenterOfficialCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:NSStringFromClass([EventCenterOfficialCell class])]; } - // 配置官方活动cell cell.cellModel = [self.officialDatasource xpSafeObjectAtIndex:indexPath.row]; return cell; } else { - EventCenterEventCell *cell = [tableView dequeueReusableCellWithIdentifier:NSStringFromClass([EventCenterEventCell class])]; - if (!cell) { - cell = [[EventCenterEventCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:NSStringFromClass([EventCenterEventCell class])]; + if ((tableView == self.eventSquareTableView && self.eventSquareDatasource.count == 0) || + (tableView == self.myEventTableView && self.myCreateEventDatasource.count == 0)) { + return [EventCenterEmptyCell cellFor:tableView atIndexPath:indexPath]; + } + EventCenterEventCell *cell = [EventCenterEventCell cellFor:tableView atIndexPath:indexPath]; + if (tableView == self.eventSquareTableView) { + EventItemModel *model = [self.eventSquareDatasource xpSafeObjectAtIndex:indexPath.row]; + [cell updateCell:model]; } - // 配置活动广场和我的活动cell if ((tableView == self.eventSquareTableView && self.eventSquareDatasource.count > indexPath.row) || - (tableView == self.myEventTableView && self.myEventDatasource.count > indexPath.row)) { + (tableView == self.myEventTableView && self.myCreateEventDatasource.count > indexPath.row)) { // cell.model = tableView == self.eventSquareTableView ? self.eventSquareDatasource[indexPath.row] : self.myEventDatasource[indexPath.row]; } return cell; @@ -239,21 +279,79 @@ #pragma mark - UITableViewDelegate - (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath { - return 150; + if (tableView == self.officialTableView) { + return self.officialDatasource.count == 0 ? [EventCenterEmptyCell cellHeight] : 120; + } + + if (tableView == self.eventSquareTableView) { + return self.eventSquareDatasource.count == 0 ? [EventCenterEmptyCell cellHeight] : 150; + } + + if (tableView == self.myEventTableView) { + switch (indexPath.section) { + case 0: + return self.myCreateEventDatasource.count == 0 ? [EventCenterEmptyCell cellHeight] : 150; + break; + case 1: + return self.mySubEventDatasource.count == 0 ? [EventCenterEmptyCell cellHeight] : 150; + break; + default: + return 0; + break; + } + } + + return 0; } - (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath { [tableView deselectRowAtIndexPath:indexPath animated:YES]; // 处理cell点击事件 - if (tableView == self.officialTableView && self.officialDatasource.count > indexPath.row) { - // 处理官方活动点击 - } else if (tableView == self.eventSquareTableView && self.eventSquareDatasource.count > indexPath.row) { - // 处理活动广场点击 - } else if (tableView == self.myEventTableView && self.myEventDatasource.count > indexPath.row) { + if (tableView == self.officialTableView) { + HomeBannerInfoModel *model = [self.officialDatasource xpSafeObjectAtIndex:indexPath.row]; + if (model) { + switch (model.skipType) { + case HomeBannerInfoSkipType_Room: + { + if (model.skipUri.length > 0) { + [XPRoomViewController openRoom:model.skipUri viewController:self]; + } + } + break; + case HomeBannerInfoSkipType_Web: + case HomeBannerInfoSkipType_Web_CP: + case HomeBannerInfoSkipType_Web_Custom: + case HomeBannerInfoSkipType_Web_WeekStar: + { + XPWebViewController *vc = [[XPWebViewController alloc]initWithRoomUID:nil]; + vc.url = model.skipUri; + [self.navigationController pushViewController:vc animated:YES]; + } + break; + case HomeBannerInfoSkipType_APP: + case HomeBannerInfoSkipType_None: + default: + break; + } + } + } else if (tableView == self.eventSquareTableView) { + EventItemModel *model = [self.eventSquareDatasource xpSafeObjectAtIndex:indexPath.row]; + if (model) { + [self toEventDetail:model.id]; + } + } else if (tableView == self.myEventTableView && self.myCreateEventDatasource.count > indexPath.row) { // 处理我的活动点击 } } +- (void)toEventDetail:(NSInteger)eventId { + XPWebViewController * webVC = [[XPWebViewController alloc] initWithRoomUID:nil]; + webVC.url = [NSString stringWithFormat:@"%@%@", + URLWithType(kEventDetailPath), + @(eventId)]; + [self.navigationController pushViewController:webVC animated:YES]; +} + #pragma mark - UIPageViewControllerDataSource - (UIViewController *)pageViewController:(UIPageViewController *)pageViewController viewControllerBeforeViewController:(UIViewController *)viewController { @@ -276,9 +374,65 @@ NSInteger index = [self.contentViewControllers indexOfObject:pageViewController.viewControllers.firstObject]; if (index != NSNotFound) { [self switchToIndex:index animated:YES]; + + // 首次切换到活动广场,加载数据 + if (index == 1 && self.eventSquareDatasource.count == 0) { + [self.presenter loadEventSquare:self.eventSquareTableViewPage]; + } } } +#pragma mark - CreateEventPresenterProcotol + +- (void)eventSquareListSuccess:(NSArray *)list { + if (self.eventSquareTableViewPage == 1) { + [self.eventSquareDatasource removeAllObjects]; + } + if (list.count > 0) { + [self.eventSquareDatasource addObjectsFromArray:list]; + self.eventSquareTableViewPage++; + self.eventSquareTableView.mj_footer.hidden = NO; + } else { + if (self.eventSquareTableViewPage == 1) { + self.eventSquareTableView.mj_footer.hidden = YES; + } else { + // 没有更多数据了 + [self.eventSquareTableView.mj_footer endRefreshingWithNoMoreData]; + } + } + [self.eventSquareTableView reloadData]; + [self.eventSquareTableView.mj_header endRefreshing]; + + if (list.count < 20) { + [self.eventSquareTableView.mj_footer endRefreshingWithNoMoreData]; + } else { + [self.eventSquareTableView.mj_footer endRefreshing]; + } +} + +- (void)eventSquareListFailure:(NSString *)errorMsg { + [self.eventSquareTableView.mj_header endRefreshing]; + [self.eventSquareTableView.mj_footer setHidden:YES]; +} + +- (void)myCreateEventListSuccess:(NSArray *)list { + +} + +- (void)myCreateEventListFailure:(NSString *)msg { + [self.eventSquareTableView.mj_header endRefreshing]; + [self.eventSquareTableView.mj_footer setHidden:YES]; +} + +- (void)mySubEventListSuccess:(NSArray *)list { + +} + +- (void)mySubEventListFailure:(NSString *)msg { + [self.eventSquareTableView.mj_header endRefreshing]; + [self.eventSquareTableView.mj_footer setHidden:YES]; +} + #pragma mark - Lazy Loading - (UITableView *)officialTableView { @@ -292,6 +446,8 @@ _officialTableView.contentInsetAdjustmentBehavior = UIScrollViewContentInsetAdjustmentNever; } [_officialTableView registerClass:[EventCenterOfficialCell class] forCellReuseIdentifier:NSStringFromClass([EventCenterOfficialCell class])]; + [EventCenterEmptyCell registerTo:_officialTableView]; + _officialTableView.mj_header = [MJRefreshNormalHeader headerWithRefreshingBlock:^{ // 下拉刷新 dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(1.0 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{ @@ -319,17 +475,18 @@ _eventSquareTableView.contentInsetAdjustmentBehavior = UIScrollViewContentInsetAdjustmentNever; } [_eventSquareTableView registerClass:[EventCenterEventCell class] forCellReuseIdentifier:NSStringFromClass([EventCenterEventCell class])]; + [EventCenterEmptyCell registerTo:_eventSquareTableView]; + [EventCenterEventCell registerTo:_eventSquareTableView]; + + __weak typeof(self) weakSelf = self; _eventSquareTableView.mj_header = [MJRefreshNormalHeader headerWithRefreshingBlock:^{ - // 下拉刷新 - dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(1.0 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{ - [self.eventSquareTableView.mj_header endRefreshing]; - }); + // 下拉刷新,重置页码 + weakSelf.eventSquareTableViewPage = 1; + [(CreateEventPresenter *)weakSelf.presenter loadEventSquare:weakSelf.eventSquareTableViewPage]; }]; _eventSquareTableView.mj_footer = [MJRefreshAutoNormalFooter footerWithRefreshingBlock:^{ // 上拉加载更多 - dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(1.0 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{ - [self.eventSquareTableView.mj_footer endRefreshing]; - }); + [(CreateEventPresenter *)weakSelf.presenter loadEventSquare:weakSelf.eventSquareTableViewPage]; }]; } return _eventSquareTableView; @@ -346,10 +503,16 @@ _myEventTableView.contentInsetAdjustmentBehavior = UIScrollViewContentInsetAdjustmentNever; } [_myEventTableView registerClass:[EventCenterEventCell class] forCellReuseIdentifier:NSStringFromClass([EventCenterEventCell class])]; + [EventCenterEmptyCell registerTo:_myEventTableView]; + [EventCenterEventCell registerTo:_myEventTableView]; + _myEventTableView.mj_header = [MJRefreshNormalHeader headerWithRefreshingBlock:^{ // 下拉刷新 dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(1.0 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{ [self.myEventTableView.mj_header endRefreshing]; + if (self.myCreateEventDatasource.count == 0) { + self.myEventTableView.mj_footer.hidden = YES; + } }); }]; _myEventTableView.mj_footer = [MJRefreshAutoNormalFooter footerWithRefreshingBlock:^{ @@ -376,4 +539,11 @@ return _createButton; } +- (NSMutableArray *)eventSquareDatasource { + if (!_eventSquareDatasource) { + _eventSquareDatasource = [NSMutableArray array]; + } + return _eventSquareDatasource; +} + @end diff --git a/YuMi/Modules/YMNewHome/View/XPNewHomeViewController.m b/YuMi/Modules/YMNewHome/View/XPNewHomeViewController.m index 359c381f..a3914616 100644 --- a/YuMi/Modules/YMNewHome/View/XPNewHomeViewController.m +++ b/YuMi/Modules/YMNewHome/View/XPNewHomeViewController.m @@ -604,12 +604,8 @@ XPHomeRecommendOtherRoomViewDelegate> #pragma mark - JXCategoryViewDelegate - (NSUInteger)tableHeaderViewHeightInPagerView:(JXPagerView *)pagerView { - if (self.headView.itemList.count == 0 && self.headView.bannerList.count == 0){ - return 0; - }else if (self.headView.itemList.count > 0 && self.headView.bannerList.count == 0){ + if (self.headView.bannerList.count == 0){ return kGetScaleWidth(80); - }else if (self.headView.itemList.count == 0 && self.headView.bannerList.count > 0){ - return kGetScaleWidth(90); } return kGetScaleWidth(170); } @@ -686,7 +682,6 @@ XPHomeRecommendOtherRoomViewDelegate> } #pragma mark - XPHomeContainerProtocol - (void)getHomeTopDataSuccess:(NSArray*)list menuList:(NSArray *)memuList{ - self.headView.itemList = memuList; self.headView.bannerList = list; self.bannerInfoList = list; [self.pagingView reloadData]; @@ -696,7 +691,6 @@ XPHomeRecommendOtherRoomViewDelegate> - (void)getHomeTopDataSuccess:(NSArray *)resourceList banners:(NSArray *)banners rankAvatars:(NSArray *)rankAvatars { - self.headView.itemList = resourceList; self.headView.bannerList = banners; self.headView.rankAvatars = rankAvatars; [self.pagingView reloadData]; @@ -792,18 +786,37 @@ XPHomeRecommendOtherRoomViewDelegate> } } ///选择 --(void)selectItemWithModel:(PIHomeItemModel *)model{ - switch (model.resourceType) { - case HomeMenuResourceType_H5: { - XPWebViewController * webVC = [[ XPWebViewController alloc] initWithRoomUID:nil]; - webVC.url = model.resourceContent; +- (void)selectItemAtIndexPath:(NSIndexPath *)indexPath { + switch (indexPath.row) { + case 0: { + XPWebViewController * webVC =[[XPWebViewController alloc] initWithRoomUID:nil]; + webVC.url = URLWithType(kHomeRankURL); [self.navigationController pushViewController:webVC animated:YES]; } break; - case HomeMenuResourceType_Match: - [self.presenter homeChatPick]; + case 1: { + EventCenterViewController *vc = [[EventCenterViewController alloc] init]; + [self.navigationController pushViewController:vc animated:YES]; + vc.officialEventModels = self.headView.bannerList; + } break; - case HomeMenuResourceType_Room_Game: { + default: + break; + } +} + +//-(void)selectItemWithModel:(PIHomeItemModel *)model{ +// switch (model.resourceType) { +// case HomeMenuResourceType_H5: { +// XPWebViewController * webVC = [[ XPWebViewController alloc] initWithRoomUID:nil]; +// webVC.url = model.resourceContent; +// [self.navigationController pushViewController:webVC animated:YES]; +// } +// break; +// case HomeMenuResourceType_Match: +// [self.presenter homeChatPick]; +// break; +// case HomeMenuResourceType_Room_Game: { // @kWeakify(self); // [Api homePickResource:^(BaseModel * _Nullable data, NSInteger code, NSString * _Nullable msg) { // @kStrongify(self); @@ -823,16 +836,17 @@ XPHomeRecommendOtherRoomViewDelegate> // [XNDJTDDLoadingTool showErrorWithMessage:msg]; // } // } uid:uid rid:model.ID]; - } - default: - { - EventCenterViewController *vc = [[EventCenterViewController alloc] init]; - [self.navigationController pushViewController:vc animated:YES]; - vc.officialEventModels = self.headView.bannerList; - } - break; - } -} +// } +// default: +// { +// EventCenterViewController *vc = [[EventCenterViewController alloc] init]; +// [self.navigationController pushViewController:vc animated:YES]; +// vc.officialEventModels = self.headView.bannerList; +// } +// break; +// } +//} + -(void)selectBannerListWithModel:(HomeBannerInfoModel *)model{ [self handleTapBannerItem:model]; } diff --git a/YuMi/Modules/YMRoom/View/SendGiftView/GiftComboManager.m b/YuMi/Modules/YMRoom/View/SendGiftView/GiftComboManager.m index a8b98f23..a6764e51 100644 --- a/YuMi/Modules/YMRoom/View/SendGiftView/GiftComboManager.m +++ b/YuMi/Modules/YMRoom/View/SendGiftView/GiftComboManager.m @@ -332,8 +332,13 @@ // 创建 GCD 定时器 self.timer = dispatch_source_create(DISPATCH_SOURCE_TYPE_TIMER, 0, 0, dispatch_get_main_queue()); - // 设置定时器时间间隔:每 0.3 秒执行一次 +//#if DEBUG +// dispatch_source_set_timer(self.timer, DISPATCH_TIME_NOW, 0.01 * NSEC_PER_SEC, 0.01 * NSEC_PER_SEC); +//#else + // 设置定时器时间间隔:每 0.25 秒执行一次 dispatch_source_set_timer(self.timer, DISPATCH_TIME_NOW, 0.25 * NSEC_PER_SEC, 0.01 * NSEC_PER_SEC); +//#endif + // 定时器触发的事件处理 dispatch_source_set_event_handler(self.timer, ^{ @@ -502,15 +507,20 @@ @"Price": @(receive.gift.goldPrice * receive.giftNum * array.count), @"isFromWinning":@(NO)}]; } else { - if (code > 500) { - self.errorMessage = @"Over Heat!"; + if (code >= 500 && code < 600) { + NSLog(@" ----------------------------------------------------------- error here"); +#if DEBUG + self.errorMessage = [NSString stringWithFormat:@"Over Heat! - %@ ", msg]; +#else + self.errorMessage = @"Over Heat & try later"; +#endif } else { self.errorMessage = msg; + [self forceRemove]; } if (self.actionCallback) { self.actionCallback(ComboAction_Error); } -// [self forceRemove]; } } targetUids:allUIDs diff --git a/YuMi/Modules/YMRoom/View/SendGiftView/View/GiftComboView.m b/YuMi/Modules/YMRoom/View/SendGiftView/View/GiftComboView.m index 496c5704..079bdaa2 100644 --- a/YuMi/Modules/YMRoom/View/SendGiftView/View/GiftComboView.m +++ b/YuMi/Modules/YMRoom/View/SendGiftView/View/GiftComboView.m @@ -28,6 +28,8 @@ @property(nonatomic, strong) UIImpactFeedbackGenerator *feedbackGenerator; +@property (nonatomic, strong) NSTimer *longPressTimer; + //@property (nonatomic, strong) dispatch_queue_t animationQueue; // 串行队列,确保线程安全 @@ -44,6 +46,8 @@ [self.playImageView clear]; self.playImageView.delegate = nil; [[NSNotificationCenter defaultCenter] removeObserver:self]; + [self.longPressTimer invalidate]; + self.longPressTimer = nil; } - (instancetype)init { @@ -214,7 +218,9 @@ // NSLog(@"点击间隔过短,忽略此次点击"); return; } +#if RELEASE isHandlingTap = YES; +#endif [self.feedbackGenerator impactOccurred]; [[GiftComboManager sharedManager] sendGift]; @@ -432,8 +438,8 @@ duration:5]; _countdownRingView.userInteractionEnabled = YES; //#if DEBUG -// UILongPressGestureRecognizer *longPress = [[UILongPressGestureRecognizer alloc] initWithTarget:self action:@selector(handleTap)]; -// longPress.minimumPressDuration = 0.2; +// UILongPressGestureRecognizer *longPress = [[UILongPressGestureRecognizer alloc] initWithTarget:self action:@selector(handleLongPress:)]; +// longPress.minimumPressDuration = 0.1; // [_countdownRingView addGestureRecognizer:longPress]; //#else UITapGestureRecognizer *tap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(handleTap)]; @@ -443,4 +449,23 @@ return _countdownRingView; } +- (void)handleLongPress:(UILongPressGestureRecognizer *)gesture { + if (gesture.state == UIGestureRecognizerStateBegan) { + // 开始长按时创建定时器 + [self.longPressTimer invalidate]; + self.longPressTimer = [NSTimer scheduledTimerWithTimeInterval:0.1 + target:self + selector:@selector(handleTap) + userInfo:nil + repeats:YES]; + [self handleTap]; + } else if (gesture.state == UIGestureRecognizerStateEnded || + gesture.state == UIGestureRecognizerStateCancelled || + gesture.state == UIGestureRecognizerStateFailed) { + // 长按结束时销毁定时器 + [self.longPressTimer invalidate]; + self.longPressTimer = nil; + } +} + @end diff --git a/YuMi/Modules/YMRoom/View/SendGiftView/View/XPSendGiftView.m b/YuMi/Modules/YMRoom/View/SendGiftView/View/XPSendGiftView.m index 80d6a2dc..249cb982 100644 --- a/YuMi/Modules/YMRoom/View/SendGiftView/View/XPSendGiftView.m +++ b/YuMi/Modules/YMRoom/View/SendGiftView/View/XPSendGiftView.m @@ -206,7 +206,6 @@ UIKIT_EXTERN NSString * kShowFirstRechargeView; if (![NSString isEmpty:message]) { [self showErrorToast:message]; } - } break; case ComboAction_Update_After_Send_Success: {