diff --git a/YuMi.xcodeproj/project.pbxproj b/YuMi.xcodeproj/project.pbxproj index d6826a8e..eaafaa8e 100644 --- a/YuMi.xcodeproj/project.pbxproj +++ b/YuMi.xcodeproj/project.pbxproj @@ -501,6 +501,10 @@ 5412E0F42C4E460300FDD668 /* XPMineCenterAgencyView.m in Sources */ = {isa = PBXBuildFile; fileRef = 5412E0F32C4E460300FDD668 /* XPMineCenterAgencyView.m */; }; 5412E0FD2C52512100FDD668 /* RoomBottomEntranceModel.m in Sources */ = {isa = PBXBuildFile; fileRef = 5412E0FC2C52512100FDD668 /* RoomBottomEntranceModel.m */; }; 541DD9552C1EDEFB00B616C4 /* XPHomePagingViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 541DD9542C1EDEFB00B616C4 /* XPHomePagingViewController.m */; }; + 54283CE52CE48A69009729B5 /* ShoppingMallViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 54283CE42CE48A69009729B5 /* ShoppingMallViewController.m */; }; + 54283CE82CE48ABB009729B5 /* MyDressingViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 54283CE72CE48ABB009729B5 /* MyDressingViewController.m */; }; + 54283CEB2CE48B71009729B5 /* ShoppingMallCategoryListView.m in Sources */ = {isa = PBXBuildFile; fileRef = 54283CEA2CE48B71009729B5 /* ShoppingMallCategoryListView.m */; }; + 54283CEE2CE48B97009729B5 /* ShoppingMallDataPresent.m in Sources */ = {isa = PBXBuildFile; fileRef = 54283CED2CE48B97009729B5 /* ShoppingMallDataPresent.m */; }; 544879EA2CD215F400D58DC1 /* CustomRoomBGCell.m in Sources */ = {isa = PBXBuildFile; fileRef = 544879E92CD215F400D58DC1 /* CustomRoomBGCell.m */; }; 544879ED2CD22A6B00D58DC1 /* CustomRoomBGPresenter.m in Sources */ = {isa = PBXBuildFile; fileRef = 544879EC2CD22A6B00D58DC1 /* CustomRoomBGPresenter.m */; }; 544879F02CD22D4B00D58DC1 /* CustomRoomBGItemModel.m in Sources */ = {isa = PBXBuildFile; fileRef = 544879EF2CD22D4B00D58DC1 /* CustomRoomBGItemModel.m */; }; @@ -2581,6 +2585,14 @@ 5412E0FC2C52512100FDD668 /* RoomBottomEntranceModel.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = RoomBottomEntranceModel.m; sourceTree = ""; }; 541DD9532C1EDEFB00B616C4 /* XPHomePagingViewController.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = XPHomePagingViewController.h; sourceTree = ""; }; 541DD9542C1EDEFB00B616C4 /* XPHomePagingViewController.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = XPHomePagingViewController.m; sourceTree = ""; }; + 54283CE32CE48A69009729B5 /* ShoppingMallViewController.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = ShoppingMallViewController.h; sourceTree = ""; }; + 54283CE42CE48A69009729B5 /* ShoppingMallViewController.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = ShoppingMallViewController.m; sourceTree = ""; }; + 54283CE62CE48ABB009729B5 /* MyDressingViewController.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = MyDressingViewController.h; sourceTree = ""; }; + 54283CE72CE48ABB009729B5 /* MyDressingViewController.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = MyDressingViewController.m; sourceTree = ""; }; + 54283CE92CE48B71009729B5 /* ShoppingMallCategoryListView.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = ShoppingMallCategoryListView.h; sourceTree = ""; }; + 54283CEA2CE48B71009729B5 /* ShoppingMallCategoryListView.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = ShoppingMallCategoryListView.m; sourceTree = ""; }; + 54283CEC2CE48B97009729B5 /* ShoppingMallDataPresent.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = ShoppingMallDataPresent.h; sourceTree = ""; }; + 54283CED2CE48B97009729B5 /* ShoppingMallDataPresent.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = ShoppingMallDataPresent.m; sourceTree = ""; }; 54435F2C2CC89D4600F4884B /* tr */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = tr; path = tr.lproj/InfoPlist.strings; sourceTree = ""; }; 54435F2D2CC89D4600F4884B /* tr */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = tr; path = tr.lproj/Localizable.strings; sourceTree = ""; }; 544879E82CD215F400D58DC1 /* CustomRoomBGCell.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = CustomRoomBGCell.h; sourceTree = ""; }; @@ -5106,6 +5118,7 @@ 189DD56126DE45F800AB55B1 /* Modules */ = { isa = PBXGroup; children = ( + 54283CE22CE48884009729B5 /* ShoppingMall */, E87E624F2A3F54B5002F68C9 /* YMNewHome */, 18E7B1B426E8B2960064BC9B /* YMTabbar */, E81DCCC4282B620A0039E5C5 /* YMMonents */, @@ -6565,6 +6578,21 @@ path = SubViews; sourceTree = ""; }; + 54283CE22CE48884009729B5 /* ShoppingMall */ = { + isa = PBXGroup; + children = ( + 54283CEC2CE48B97009729B5 /* ShoppingMallDataPresent.h */, + 54283CED2CE48B97009729B5 /* ShoppingMallDataPresent.m */, + 54283CE32CE48A69009729B5 /* ShoppingMallViewController.h */, + 54283CE42CE48A69009729B5 /* ShoppingMallViewController.m */, + 54283CE62CE48ABB009729B5 /* MyDressingViewController.h */, + 54283CE72CE48ABB009729B5 /* MyDressingViewController.m */, + 54283CE92CE48B71009729B5 /* ShoppingMallCategoryListView.h */, + 54283CEA2CE48B71009729B5 /* ShoppingMallCategoryListView.m */, + ); + path = ShoppingMall; + sourceTree = ""; + }; 5461040A2CD4B3CB00066B21 /* banner */ = { isa = PBXGroup; children = ( @@ -11679,6 +11707,7 @@ 9BD9A18027A0EFC7004186FE /* XPMineVisitorTableViewCell.m in Sources */, 233423D02AAEFBC300B1253F /* PICandyTreeSetModel.m in Sources */, E85E7B112A4EB0D200B6D00A /* GuildPersonIncomeRecordModel.m in Sources */, + 54283CEB2CE48B71009729B5 /* ShoppingMallCategoryListView.m in Sources */, 548E01CC2C3FB1C70071C83D /* i18nGiftNameMap.m in Sources */, 9BD2ECD2288F833B00F5CD9A /* XPMineFootPrintModel.m in Sources */, E824546626F5FF6000BE8163 /* XPMineResetPayPasswordProtocol.h in Sources */, @@ -12113,6 +12142,7 @@ E8778AE72988C1E000CF139B /* XPSessionHelloEnterView.m in Sources */, 18A61BD7274F7F6900A09A54 /* NetImageConfig.m in Sources */, E8C21501274B76F60079E6BF /* XPRoomAnimationHitView.m in Sources */, + 54283CE82CE48ABB009729B5 /* MyDressingViewController.m in Sources */, E84A2E9F2A5287D200D6AF8A /* XPIncomeRecordGoldDetailsView.m in Sources */, 233423C72AAEE5C600B1253F /* XPCandyTreeBuySuccessView.m in Sources */, E873EB0F28098D500071030D /* MessageContentGiftView.m in Sources */, @@ -12694,6 +12724,7 @@ E85E7BA92A4EC99300B6D00A /* XPMineConfirmGiveDiamondView.m in Sources */, 54C9A1102C3D3E1700C6D970 /* XPMineGameMateOrderView.m in Sources */, E85E7BA72A4EC99300B6D00A /* XPMineGiveDiamondPasswordView.m in Sources */, + 54283CEE2CE48B97009729B5 /* ShoppingMallDataPresent.m in Sources */, 2331C1742A5EB71000E1D940 /* XPNobleCenterResidueView.m in Sources */, E80E2377299A47F60013FD40 /* AESUtils.m in Sources */, E81060E229876E9100B772F0 /* MessageImageModel.m in Sources */, @@ -12701,6 +12732,7 @@ E80E09AE2A41336500CD2BE7 /* XPWebViewNavView.m in Sources */, E85E7B2D2A4EB0D300B6D00A /* XPGuildHeaderView.m in Sources */, E85E7B542A4EB4AD00B6D00A /* XPMineGuildListModel.m in Sources */, + 54283CE52CE48A69009729B5 /* ShoppingMallViewController.m in Sources */, 9BCE6144277D657600CC0358 /* XPReleaseRadioTableViewCell.m in Sources */, 186A534D26FC6ED900D67B2C /* TTActionSheetView.m in Sources */, E81060E529876FF300B772F0 /* MessageAudioModel.m in Sources */, diff --git a/YuMi/Assets.xcassets/1.0.30/Contents.json b/YuMi/Assets.xcassets/1.0.30/Contents.json new file mode 100644 index 00000000..73c00596 --- /dev/null +++ b/YuMi/Assets.xcassets/1.0.30/Contents.json @@ -0,0 +1,6 @@ +{ + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/YuMi/Assets.xcassets/1.0.30/mall_category_bubble.imageset/1@3x.png b/YuMi/Assets.xcassets/1.0.30/mall_category_bubble.imageset/1@3x.png new file mode 100644 index 00000000..bd1dd0e1 Binary files /dev/null and b/YuMi/Assets.xcassets/1.0.30/mall_category_bubble.imageset/1@3x.png differ diff --git a/YuMi/Assets.xcassets/1.0.30/mall_category_bubble.imageset/Contents.json b/YuMi/Assets.xcassets/1.0.30/mall_category_bubble.imageset/Contents.json new file mode 100644 index 00000000..6e1d814b --- /dev/null +++ b/YuMi/Assets.xcassets/1.0.30/mall_category_bubble.imageset/Contents.json @@ -0,0 +1,21 @@ +{ + "images" : [ + { + "idiom" : "universal", + "scale" : "1x" + }, + { + "idiom" : "universal", + "scale" : "2x" + }, + { + "filename" : "1@3x.png", + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/YuMi/Assets.xcassets/1.0.30/mall_category_headdress.imageset/1@3x (3).png b/YuMi/Assets.xcassets/1.0.30/mall_category_headdress.imageset/1@3x (3).png new file mode 100644 index 00000000..45a2241f Binary files /dev/null and b/YuMi/Assets.xcassets/1.0.30/mall_category_headdress.imageset/1@3x (3).png differ diff --git a/YuMi/Assets.xcassets/1.0.30/mall_category_headdress.imageset/Contents.json b/YuMi/Assets.xcassets/1.0.30/mall_category_headdress.imageset/Contents.json new file mode 100644 index 00000000..aa897b35 --- /dev/null +++ b/YuMi/Assets.xcassets/1.0.30/mall_category_headdress.imageset/Contents.json @@ -0,0 +1,21 @@ +{ + "images" : [ + { + "idiom" : "universal", + "scale" : "1x" + }, + { + "idiom" : "universal", + "scale" : "2x" + }, + { + "filename" : "1@3x (3).png", + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/YuMi/Assets.xcassets/1.0.30/mall_category_nameplate.imageset/1@3x (2).png b/YuMi/Assets.xcassets/1.0.30/mall_category_nameplate.imageset/1@3x (2).png new file mode 100644 index 00000000..be221f4a Binary files /dev/null and b/YuMi/Assets.xcassets/1.0.30/mall_category_nameplate.imageset/1@3x (2).png differ diff --git a/YuMi/Assets.xcassets/1.0.30/mall_category_nameplate.imageset/Contents.json b/YuMi/Assets.xcassets/1.0.30/mall_category_nameplate.imageset/Contents.json new file mode 100644 index 00000000..8f10bc0c --- /dev/null +++ b/YuMi/Assets.xcassets/1.0.30/mall_category_nameplate.imageset/Contents.json @@ -0,0 +1,21 @@ +{ + "images" : [ + { + "idiom" : "universal", + "scale" : "1x" + }, + { + "idiom" : "universal", + "scale" : "2x" + }, + { + "filename" : "1@3x (2).png", + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/YuMi/Assets.xcassets/1.0.30/mall_category_normal_bg.imageset/Contents.json b/YuMi/Assets.xcassets/1.0.30/mall_category_normal_bg.imageset/Contents.json new file mode 100644 index 00000000..afa6fd50 --- /dev/null +++ b/YuMi/Assets.xcassets/1.0.30/mall_category_normal_bg.imageset/Contents.json @@ -0,0 +1,21 @@ +{ + "images" : [ + { + "idiom" : "universal", + "scale" : "1x" + }, + { + "idiom" : "universal", + "scale" : "2x" + }, + { + "filename" : "矩形 2941@3x.png", + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/YuMi/Assets.xcassets/1.0.30/mall_category_normal_bg.imageset/矩形 2941@3x.png b/YuMi/Assets.xcassets/1.0.30/mall_category_normal_bg.imageset/矩形 2941@3x.png new file mode 100644 index 00000000..9061c8f5 Binary files /dev/null and b/YuMi/Assets.xcassets/1.0.30/mall_category_normal_bg.imageset/矩形 2941@3x.png differ diff --git a/YuMi/Assets.xcassets/1.0.30/mall_category_room_card.imageset/1@3x (1).png b/YuMi/Assets.xcassets/1.0.30/mall_category_room_card.imageset/1@3x (1).png new file mode 100644 index 00000000..f2e60d4e Binary files /dev/null and b/YuMi/Assets.xcassets/1.0.30/mall_category_room_card.imageset/1@3x (1).png differ diff --git a/YuMi/Assets.xcassets/1.0.30/mall_category_room_card.imageset/Contents.json b/YuMi/Assets.xcassets/1.0.30/mall_category_room_card.imageset/Contents.json new file mode 100644 index 00000000..89d6af5f --- /dev/null +++ b/YuMi/Assets.xcassets/1.0.30/mall_category_room_card.imageset/Contents.json @@ -0,0 +1,21 @@ +{ + "images" : [ + { + "idiom" : "universal", + "scale" : "1x" + }, + { + "idiom" : "universal", + "scale" : "2x" + }, + { + "filename" : "1@3x (1).png", + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/YuMi/Assets.xcassets/1.0.30/mall_category_selected_bg.imageset/Contents.json b/YuMi/Assets.xcassets/1.0.30/mall_category_selected_bg.imageset/Contents.json new file mode 100644 index 00000000..6dafe856 --- /dev/null +++ b/YuMi/Assets.xcassets/1.0.30/mall_category_selected_bg.imageset/Contents.json @@ -0,0 +1,21 @@ +{ + "images" : [ + { + "idiom" : "universal", + "scale" : "1x" + }, + { + "idiom" : "universal", + "scale" : "2x" + }, + { + "filename" : "矩形 2941@3x (1).png", + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/YuMi/Assets.xcassets/1.0.30/mall_category_selected_bg.imageset/矩形 2941@3x (1).png b/YuMi/Assets.xcassets/1.0.30/mall_category_selected_bg.imageset/矩形 2941@3x (1).png new file mode 100644 index 00000000..285c8728 Binary files /dev/null and b/YuMi/Assets.xcassets/1.0.30/mall_category_selected_bg.imageset/矩形 2941@3x (1).png differ diff --git a/YuMi/Assets.xcassets/1.0.30/mall_category_vehicle.imageset/1@3x (4).png b/YuMi/Assets.xcassets/1.0.30/mall_category_vehicle.imageset/1@3x (4).png new file mode 100644 index 00000000..29408db8 Binary files /dev/null and b/YuMi/Assets.xcassets/1.0.30/mall_category_vehicle.imageset/1@3x (4).png differ diff --git a/YuMi/Assets.xcassets/1.0.30/mall_category_vehicle.imageset/Contents.json b/YuMi/Assets.xcassets/1.0.30/mall_category_vehicle.imageset/Contents.json new file mode 100644 index 00000000..a6b1b75e --- /dev/null +++ b/YuMi/Assets.xcassets/1.0.30/mall_category_vehicle.imageset/Contents.json @@ -0,0 +1,21 @@ +{ + "images" : [ + { + "idiom" : "universal", + "scale" : "1x" + }, + { + "idiom" : "universal", + "scale" : "2x" + }, + { + "filename" : "1@3x (4).png", + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/YuMi/Assets.xcassets/1.0.30/mall_my_icon.imageset/Contents.json b/YuMi/Assets.xcassets/1.0.30/mall_my_icon.imageset/Contents.json new file mode 100644 index 00000000..14c05429 --- /dev/null +++ b/YuMi/Assets.xcassets/1.0.30/mall_my_icon.imageset/Contents.json @@ -0,0 +1,21 @@ +{ + "images" : [ + { + "idiom" : "universal", + "scale" : "1x" + }, + { + "idiom" : "universal", + "scale" : "2x" + }, + { + "filename" : "切图 56@3x.png", + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/YuMi/Assets.xcassets/1.0.30/mall_my_icon.imageset/切图 56@3x.png b/YuMi/Assets.xcassets/1.0.30/mall_my_icon.imageset/切图 56@3x.png new file mode 100644 index 00000000..cd25a761 Binary files /dev/null and b/YuMi/Assets.xcassets/1.0.30/mall_my_icon.imageset/切图 56@3x.png differ diff --git a/YuMi/Assets.xcassets/1.0.30/mall_play_icon.imageset/Contents.json b/YuMi/Assets.xcassets/1.0.30/mall_play_icon.imageset/Contents.json new file mode 100644 index 00000000..a0465a9b --- /dev/null +++ b/YuMi/Assets.xcassets/1.0.30/mall_play_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/1.0.30/mall_play_icon.imageset/播放@3x.png b/YuMi/Assets.xcassets/1.0.30/mall_play_icon.imageset/播放@3x.png new file mode 100644 index 00000000..4de23f13 Binary files /dev/null and b/YuMi/Assets.xcassets/1.0.30/mall_play_icon.imageset/播放@3x.png differ diff --git a/YuMi/Assets.xcassets/1.0.30/mall_top_bg.imageset/4@3x.png b/YuMi/Assets.xcassets/1.0.30/mall_top_bg.imageset/4@3x.png new file mode 100644 index 00000000..c9550cf8 Binary files /dev/null and b/YuMi/Assets.xcassets/1.0.30/mall_top_bg.imageset/4@3x.png differ diff --git a/YuMi/Assets.xcassets/1.0.30/mall_top_bg.imageset/Contents.json b/YuMi/Assets.xcassets/1.0.30/mall_top_bg.imageset/Contents.json new file mode 100644 index 00000000..ed396281 --- /dev/null +++ b/YuMi/Assets.xcassets/1.0.30/mall_top_bg.imageset/Contents.json @@ -0,0 +1,21 @@ +{ + "images" : [ + { + "idiom" : "universal", + "scale" : "1x" + }, + { + "idiom" : "universal", + "scale" : "2x" + }, + { + "filename" : "4@3x.png", + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/YuMi/Modules/ShoppingMall/MyDressingViewController.h b/YuMi/Modules/ShoppingMall/MyDressingViewController.h new file mode 100644 index 00000000..6e2a90de --- /dev/null +++ b/YuMi/Modules/ShoppingMall/MyDressingViewController.h @@ -0,0 +1,16 @@ +// +// MyDressingViewController.h +// YuMi +// +// Created by P on 2024/11/13. +// + +#import "MvpViewController.h" + +NS_ASSUME_NONNULL_BEGIN + +@interface MyDressingViewController : MvpViewController + +@end + +NS_ASSUME_NONNULL_END diff --git a/YuMi/Modules/ShoppingMall/MyDressingViewController.m b/YuMi/Modules/ShoppingMall/MyDressingViewController.m new file mode 100644 index 00000000..ee9d4e4d --- /dev/null +++ b/YuMi/Modules/ShoppingMall/MyDressingViewController.m @@ -0,0 +1,31 @@ +// +// MyDressingViewController.m +// YuMi +// +// Created by P on 2024/11/13. +// + +#import "MyDressingViewController.h" + +@interface MyDressingViewController () + +@end + +@implementation MyDressingViewController + +- (void)viewDidLoad { + [super viewDidLoad]; + // Do any additional setup after loading the view. +} + +/* +#pragma mark - Navigation + +// In a storyboard-based application, you will often want to do a little preparation before navigation +- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender { + // Get the new view controller using [segue destinationViewController]. + // Pass the selected object to the new view controller. +} +*/ + +@end diff --git a/YuMi/Modules/ShoppingMall/ShoppingMallCategoryListView.h b/YuMi/Modules/ShoppingMall/ShoppingMallCategoryListView.h new file mode 100644 index 00000000..9ce6a425 --- /dev/null +++ b/YuMi/Modules/ShoppingMall/ShoppingMallCategoryListView.h @@ -0,0 +1,26 @@ +// +// ShoppingMallCategoryListView.h +// YuMi +// +// Created by P on 2024/11/13. +// + +#import + +NS_ASSUME_NONNULL_BEGIN + +typedef void (^FetchDataCompletion)(NSArray *data); +typedef void (^FetchDataForPage)(NSInteger pageIndex, FetchDataCompletion completion); + + +@interface ShoppingMallCategoryListView : UIView + +// 名称:类型 +@property (nonatomic, copy) NSArray *> *items; +@property (nonatomic, copy) FetchDataForPage fetchDataForPage; + + + +@end + +NS_ASSUME_NONNULL_END diff --git a/YuMi/Modules/ShoppingMall/ShoppingMallCategoryListView.m b/YuMi/Modules/ShoppingMall/ShoppingMallCategoryListView.m new file mode 100644 index 00000000..2ce783c0 --- /dev/null +++ b/YuMi/Modules/ShoppingMall/ShoppingMallCategoryListView.m @@ -0,0 +1,293 @@ +// +// ShoppingMallCategoryListView.m +// YuMi +// +// Created by P on 2024/11/13. +// + +#import "ShoppingMallCategoryListView.h" + +@interface ShoppingMallItemCard : UICollectionViewCell + +@end + +@implementation ShoppingMallItemCard + +- (instancetype)initWithFrame:(CGRect)frame { + if (self = [super initWithFrame:frame]) { + // TODO: 补完内容 + // MARK: 逻辑比较复杂,需要新建文件处理 + } + return self; +} + +@end + +@interface ShoppingMallCategoryCard : UIView +@property (nonatomic, strong) UIImageView *selectedStatusView; +@property (nonatomic, strong) UIImageView *icon; +@property (nonatomic, strong) UILabel *title; +@property (nonatomic, assign) BOOL isSelected; + ++ (ShoppingMallCategoryCard *)initCard:(NSDictionary *)dic + frame:(CGRect)frame; +@end + +@implementation ShoppingMallCategoryCard + ++ (ShoppingMallCategoryCard *)initCard:(NSDictionary *)dic + frame:(CGRect)frame { + ShoppingMallCategoryCard *card = [[ShoppingMallCategoryCard alloc] initWithFrame:frame]; + [card update:dic]; + card.isSelected = NO; + return card; +} + +- (instancetype)initWithFrame:(CGRect)frame { + if (self = [super initWithFrame:frame]) { + [self setCornerRadius:8]; + + self.selectedStatusView = [[UIImageView alloc] initWithFrame:self.bounds]; + self.selectedStatusView.image = kImage(@"mall_category_normal_bg"); + [self addSubview:self.selectedStatusView]; + + self.icon = [[UIImageView alloc] init]; + [self addSubview:self.icon]; + [self.icon mas_makeConstraints:^(MASConstraintMaker *make) { + make.centerX.mas_equalTo(self); + make.top.mas_equalTo(8); + make.size.mas_equalTo(CGSizeMake(38, 38)); + }]; + + self.title = [UILabel labelInitWithText:@"" + font:kFontRegular(11) + textColor:UIColorFromRGB(0xD9E7F7)]; + self.title.textAlignment = NSTextAlignmentCenter; + [self addSubview:self.title]; + [self.title mas_makeConstraints:^(MASConstraintMaker *make) { + make.bottom.mas_equalTo(-11); + make.leading.trailing.mas_equalTo(self); + make.height.mas_equalTo(14); + }]; + } + return self; +} + +- (void)update:(NSDictionary *)dic { + NSNumber *type = [dic.allValues firstObject]; + NSString *key = [dic.allKeys firstObject]; + self.title.text = key; + switch (type.integerValue) { + case 0: + self.icon.image = kImage(@"mall_category_headdress"); + break; + case 1: + self.icon.image = kImage(@"mall_category_vehicle"); + break; + case 2: + self.icon.image = kImage(@"mall_category_nameplate"); + break; + case 3: + self.icon.image = kImage(@"mall_category_room_card"); + break; + case 4: + self.icon.image = kImage(@"mall_category_bubble"); + break; + default: + break; + } +} + +- (void)setIsSelected:(BOOL)isSelected { + _isSelected = isSelected; + self.selectedStatusView.image = isSelected ? kImage(@"mall_category_selected_bg") : kImage(@"mall_category_normal_bg"); + self.title.alpha = isSelected ? 1 : 0.5; +} + +@end + +@interface ShoppingMallCategoryListView () +@property (nonatomic, strong) UIScrollView *container1ScrollView; +@property (nonatomic, strong) UIScrollView *container2ScrollView; +@property (nonatomic, strong) NSMutableArray *itemViews1; +@property (nonatomic, strong) NSMutableArray *itemViews2; +@property (nonatomic, strong) NSMutableDictionary *dataCache; // 缓存每页数据 +@property (nonatomic, strong) NSMutableSet *requestedPages; // 记录已经请求的数据页 + +@end + +@implementation ShoppingMallCategoryListView + +- (instancetype)initWithFrame:(CGRect)frame { + if (self = [super initWithFrame:frame]) { + [self setupUI]; + +// [self loadDataForPageAtIndex:0]; + } + return self; +} + +- (instancetype)init { + if (self = [super init]) { + [self setupUI]; + } + return self; +} + +- (void)setupUI { + self.backgroundColor = [UIColor clearColor]; + self.dataCache = @{}.mutableCopy; + self.requestedPages = [NSMutableSet set]; // 初始化请求记录 + self.container2ScrollView.delegate = self; // 设置代理 + + CGFloat screenWidth = KScreenWidth; + CGFloat screenHeight = self.bounds.size.height; + + // 容器-1 (顶部) + self.container1ScrollView = [[UIScrollView alloc] initWithFrame:CGRectMake(15, 0, screenWidth-15, 90)]; + self.container1ScrollView.contentInset = UIEdgeInsetsMake(0, 15, 0, 15); + self.container1ScrollView.showsHorizontalScrollIndicator = NO; + self.container1ScrollView.clipsToBounds = NO; + [self addSubview:self.container1ScrollView]; + + // 容器-2 (底部) + self.container2ScrollView = [[UIScrollView alloc] initWithFrame:CGRectMake(0, 100, screenWidth, screenHeight - 100)]; + self.container2ScrollView.pagingEnabled = YES; + self.container2ScrollView.delegate = self; + self.container2ScrollView.showsHorizontalScrollIndicator = NO; + [self addSubview:self.container2ScrollView]; + + self.itemViews1 = [NSMutableArray array]; + self.itemViews2 = [NSMutableArray array]; +} + +- (void)setItems:(NSArray *)items { + _items = items; + + CGFloat screenWidth = [UIScreen mainScreen].bounds.size.width; + CGFloat container1ItemWidth = kGetScaleWidth(70); + CGFloat container1ItemHeight = 84; + CGFloat container1ItemSpacing = 12; + + // 设置 container1 和 container2 的内容大小 + self.container1ScrollView.contentSize = CGSizeMake(items.count * (container1ItemWidth + container1ItemSpacing), 90); + self.container2ScrollView.contentSize = CGSizeMake(items.count * screenWidth, self.container2ScrollView.frame.size.height); + + // 添加 item view-1 到 container1ScrollView + for (int i = 0; i < items.count; i++) { + ShoppingMallCategoryCard *itemView1 = [ShoppingMallCategoryCard initCard:[items xpSafeObjectAtIndex:i] + frame:CGRectMake(i * (container1ItemWidth + container1ItemSpacing), + 3, + container1ItemWidth, + container1ItemHeight)]; + itemView1.tag = i; + + UITapGestureRecognizer *tapGesture = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(handleItemTap:)]; + [itemView1 addGestureRecognizer:tapGesture]; + [self.container1ScrollView addSubview:itemView1]; + [self.itemViews1 addObject:itemView1]; + } + + // 添加 item view-2 到 container2ScrollView + for (int i = 0; i < items.count; i++) { +// UIView *itemView2 = [[UIView alloc] initWithFrame:CGRectMake(i * screenWidth, 0, screenWidth, self.container2ScrollView.frame.size.height)]; +// itemView2.backgroundColor = [UIColor colorWithWhite:0.9 alpha:1]; + + UICollectionViewFlowLayout *layout = [[UICollectionViewFlowLayout alloc] init]; + layout.itemSize = CGSizeMake((screenWidth-30) / 2 - 10, kGetScaleWidth(244)); + layout.minimumInteritemSpacing = 10; + layout.minimumLineSpacing = 10; + layout.sectionInset = UIEdgeInsetsMake(0, 15, 10, 15); + + UICollectionView *collectionView = [[UICollectionView alloc] initWithFrame:CGRectMake(i * screenWidth, 0, screenWidth, self.container2ScrollView.frame.size.height) + collectionViewLayout:layout]; + collectionView.delegate = self; + collectionView.dataSource = self; + collectionView.backgroundColor = [UIColor clearColor]; + collectionView.tag = i; + [collectionView registerClass:[UICollectionViewCell class] forCellWithReuseIdentifier:@"cell"]; + [self.container2ScrollView addSubview:collectionView]; + [self.itemViews2 addObject:collectionView]; + } + + [self updateSelectionForItemAtIndex:0]; + [self loadDataForPageAtIndex:0]; +} + +// 点击 item view-1 时切换到相应的 item view-2 +- (void)handleItemTap:(UITapGestureRecognizer *)gesture { + NSInteger index = gesture.view.tag; + CGFloat screenWidth = [UIScreen mainScreen].bounds.size.width; + [self.container2ScrollView setContentOffset:CGPointMake(index * screenWidth, 0) animated:YES]; + [self updateSelectionForItemAtIndex:index]; + [self loadDataForPageAtIndex:index]; +} + +// 加载指定页数据的方法 +- (void)loadDataForPageAtIndex:(NSInteger)pageIndex { + // 检查该页是否已经请求过数据,避免重复请求 + if (![self.requestedPages containsObject:@(pageIndex)]) { + [self.requestedPages addObject:@(pageIndex)]; // 标记该页已请求 + + // 使用外部提供的回调或代理来请求数据 + if (self.fetchDataForPage) { + @kWeakify(self); + self.fetchDataForPage(pageIndex, ^(NSArray *data) { + @kStrongify(self); + if (self) { + // 更新数据到对应的 itemView-2 + [self updateContainer2WithData:data atIndex:pageIndex]; + self.dataCache[@(pageIndex)] = data; // 缓存数据 + UICollectionView *collectionView = self.itemViews2[pageIndex]; + [collectionView reloadData]; + } + }); + } + } +} + +// 更新选中的 item view-1 +- (void)updateSelectionForItemAtIndex:(NSInteger)index { + for (ShoppingMallCategoryCard *view in self.itemViews1) { + view.isSelected = (view.tag == index); + } +} + +- (void)updateContainer2WithData:(NSArray *)data atIndex:(NSInteger)index { + if (index < self.itemViews2.count) { + UIView *itemView = self.itemViews2[index]; + + // 在这里更新 itemView-2 的内容 + // 可以将 data 传递到 itemView-2 中,更新其内部的 collection view 或其他 UI + } +} + +#pragma mark - UIScrollView Delegate +// 根据 container2ScrollView 的滑动位置更新 item view-1 的选中状态 +- (void)scrollViewDidEndDecelerating:(UIScrollView *)scrollView { + if (scrollView == self.container2ScrollView) { + NSInteger pageIndex = round(scrollView.contentOffset.x / scrollView.frame.size.width); + [self updateSelectionForItemAtIndex:pageIndex]; + [self loadDataForPageAtIndex:pageIndex]; + + // 更新 pageControl 和 container1ScrollView 的选中状态 +// [self updateContainer1SelectionForPage:pageIndex]; + + } +} + + +#pragma mark - UICollectionView Delegate & DataSource +- (NSInteger)collectionView:(UICollectionView *)collectionView numberOfItemsInSection:(NSInteger)section { + NSArray *data = self.dataCache[@(collectionView.tag)]; + return data.count; // 数据项数量 +} + +- (UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath { + UICollectionViewCell *cell = [collectionView dequeueReusableCellWithReuseIdentifier:@"cell" forIndexPath:indexPath]; + cell.backgroundColor = [UIColor colorWithRed:arc4random()%255/255.0f green:arc4random()%255/255.0f blue:arc4random()%255/255.0f alpha:1]; // Placeholder color + return cell; +} + + +@end diff --git a/YuMi/Modules/ShoppingMall/ShoppingMallDataPresent.h b/YuMi/Modules/ShoppingMall/ShoppingMallDataPresent.h new file mode 100644 index 00000000..4a5f0ba5 --- /dev/null +++ b/YuMi/Modules/ShoppingMall/ShoppingMallDataPresent.h @@ -0,0 +1,26 @@ +// +// ShoppingMallDataPresent.h +// YuMi +// +// Created by P on 2024/11/13. +// + +#import "BaseMvpPresenter.h" + +NS_ASSUME_NONNULL_BEGIN + +@interface ShoppingMallDataPresent : BaseMvpPresenter +/// 获取装扮商城列表 +/// @param type 类型 0:铭牌,1:头饰,2:座驾,3:资料卡,4:聊天气泡 +- (void)loadCategoryItems:(NSInteger)type + success:(void(^)(id obj))success + failure:(void(^)(NSError *error))failure; + +- (void)buyItem:(NSString *)itemID + type:(NSInteger)type + success:(void(^)(id obj))success + failure:(void(^)(NSError *error))failure; + +@end + +NS_ASSUME_NONNULL_END diff --git a/YuMi/Modules/ShoppingMall/ShoppingMallDataPresent.m b/YuMi/Modules/ShoppingMall/ShoppingMallDataPresent.m new file mode 100644 index 00000000..d9678a23 --- /dev/null +++ b/YuMi/Modules/ShoppingMall/ShoppingMallDataPresent.m @@ -0,0 +1,45 @@ +// +// ShoppingMallDataPresent.m +// YuMi +// +// Created by P on 2024/11/13. +// + +#import "ShoppingMallDataPresent.h" +#import "Api+DressUp.h" + +@implementation ShoppingMallDataPresent + +- (void)loadCategoryItems:(NSInteger)type + success:(nonnull void (^)(id _Nonnull))success + failure:(nonnull void (^)(NSError * _Nonnull))failure{ + + [Api requestDressUpShopList:[self createHttpCompletion:^(BaseModel * _Nonnull data) { + if (success) { + success(data.data); + } + } fail:^(NSInteger code, NSString * _Nullable msg) { + if (failure) { + failure([NSError errorWithDomain:msg code:code userInfo:nil]); + } + } showLoading:YES errorToast:YES] + dressType:@(type).stringValue]; +} + +- (void)buyItem:(NSString *)itemID + type:(NSInteger)type + success:(void(^)(id obj))success + failure:(void(^)(NSError *error))failure { + [Api requestDressUpShopBuy:[self createHttpCompletion:^(BaseModel * _Nonnull data) { + if (success) { + success(data.data); + } + } fail:^(NSInteger code, NSString * _Nullable msg) { + if (failure) { + failure([NSError errorWithDomain:msg code:code userInfo:nil]); + } + } showLoading:YES errorToast:YES] + id:itemID]; +} + +@end diff --git a/YuMi/Modules/ShoppingMall/ShoppingMallViewController.h b/YuMi/Modules/ShoppingMall/ShoppingMallViewController.h new file mode 100644 index 00000000..1e4dc4db --- /dev/null +++ b/YuMi/Modules/ShoppingMall/ShoppingMallViewController.h @@ -0,0 +1,16 @@ +// +// ShoppingMallViewController.h +// YuMi +// +// Created by P on 2024/11/13. +// + +#import "MvpViewController.h" + +NS_ASSUME_NONNULL_BEGIN + +@interface ShoppingMallViewController : MvpViewController + +@end + +NS_ASSUME_NONNULL_END diff --git a/YuMi/Modules/ShoppingMall/ShoppingMallViewController.m b/YuMi/Modules/ShoppingMall/ShoppingMallViewController.m new file mode 100644 index 00000000..8e1aaa02 --- /dev/null +++ b/YuMi/Modules/ShoppingMall/ShoppingMallViewController.m @@ -0,0 +1,70 @@ +// +// ShoppingMallViewController.m +// YuMi +// +// Created by P on 2024/11/13. +// + +#import "ShoppingMallViewController.h" + +#import "ShoppingMallDataPresent.h" +#import "ShoppingMallCategoryListView.h" + +@interface ShoppingMallViewController () + +@end + +@implementation ShoppingMallViewController + +- (ShoppingMallDataPresent *)createPresenter { + return [[ShoppingMallDataPresent alloc] init]; +} + +- (BOOL)isHiddenNavBar { + return YES; +} + +- (void)viewDidLoad { + [super viewDidLoad]; + + self.view.backgroundColor = UIColorFromRGB(0x02061D); + UIImageView *topBG = [[UIImageView alloc] initWithImage:kImage(@"mall_top_bg")]; + [self.view addSubview:topBG]; + [topBG mas_makeConstraints:^(MASConstraintMaker *make) { + make.top.leading.trailing.mas_equalTo(self.view); + make.height.mas_equalTo(kGetScaleWidth(200)); + }]; + + NSInteger top = kNavigationHeight + 56; + ShoppingMallCategoryListView *listView = [[ShoppingMallCategoryListView alloc] initWithFrame:CGRectMake(0, top, KScreenWidth, KScreenHeight - top)]; + // 设置数据请求回调 + @kWeakify(self); + listView.fetchDataForPage = ^(NSInteger pageIndex, FetchDataCompletion completion) { + // 模拟网络请求或 API 数据请求 + @kStrongify(self); + [self fetchDataForPage:pageIndex completion:completion]; + }; + [self.view addSubview:listView]; + + listView.items = @[@{YMLocalizedString(@"XPMineDressUpViewController2") : @1}, // 座驾 + @{YMLocalizedString(@"XPMineDressUpViewController1") : @0}, // 头饰 + @{YMLocalizedString(@"XPMineDressUpViewController3") : @2}, // 铭牌 + @{YMLocalizedString(@"XPMineDressUpViewController4") : @3}, // 资料卡 + @{YMLocalizedString(@"XPMineDressUpViewController5") : @4} // 聊天气泡 + ]; +} + +- (void)fetchDataForPage:(NSInteger)pageIndex completion:(FetchDataCompletion)completion { + // 模拟异步数据请求,并在获取到数据后调用 completion + dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(1 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{ + NSMutableArray *data = [NSMutableArray array]; + for (int i = 0; i < 20; i++) { + [data addObject:@(i + arc4random()%100 * 20)]; + } + if (completion) { + completion(data); + } + }); +} + +@end diff --git a/YuMi/Modules/YMMine/View/DressUp/Api/Api+DressUp.h b/YuMi/Modules/YMMine/View/DressUp/Api/Api+DressUp.h index fb29a3da..39c1722a 100644 --- a/YuMi/Modules/YMMine/View/DressUp/Api/Api+DressUp.h +++ b/YuMi/Modules/YMMine/View/DressUp/Api/Api+DressUp.h @@ -76,7 +76,7 @@ NS_ASSUME_NONNULL_BEGIN /// 活动 /// @param completion 完成 /// @param type 类型 2 房间的 1 首页的 3 我的装扮 -+ (void)dressupBannerList:(HttpRequestHelperCompletion)completion type:(NSString *)type; ++ (void)dressUpBannerList:(HttpRequestHelperCompletion)completion type:(NSString *)type; #pragma mark - 装扮商城 diff --git a/YuMi/Modules/YMMine/View/DressUp/Api/Api+DressUp.m b/YuMi/Modules/YMMine/View/DressUp/Api/Api+DressUp.m index 2b87b15d..709421eb 100644 --- a/YuMi/Modules/YMMine/View/DressUp/Api/Api+DressUp.m +++ b/YuMi/Modules/YMMine/View/DressUp/Api/Api+DressUp.m @@ -112,7 +112,7 @@ /// 活动 /// @param completion 完成 /// @param type 类型 2 房间的 1 首页的 3 我的装扮 -+ (void)dressupBannerList:(HttpRequestHelperCompletion)completion type:(NSString *)type { ++ (void)dressUpBannerList:(HttpRequestHelperCompletion)completion type:(NSString *)type { NSString * fang = [NSString stringFromBase64String:@"aG9tZS9iYW5uZXI="];/// home/banner [self makeRequest:fang method:HttpRequestHelperMethodGET completion:completion, __FUNCTION__, type, nil]; } diff --git a/YuMi/Modules/YMMine/View/DressUp/View/XPDressUpShopViewController.m b/YuMi/Modules/YMMine/View/DressUp/View/XPDressUpShopViewController.m index 88aff9cf..d476c8f9 100644 --- a/YuMi/Modules/YMMine/View/DressUp/View/XPDressUpShopViewController.m +++ b/YuMi/Modules/YMMine/View/DressUp/View/XPDressUpShopViewController.m @@ -161,7 +161,7 @@ - (void)requestActivityList { @kWeakify(self); - [Api dressupBannerList:^(BaseModel * _Nullable data, NSInteger code, NSString * _Nullable msg) { + [Api dressUpBannerList:^(BaseModel * _Nullable data, NSInteger code, NSString * _Nullable msg) { @kStrongify(self); if (code == 200) { NSArray * array = [ActivityInfoModel modelsWithArray:data.data]; @@ -283,7 +283,11 @@ } - (NSArray *)titles { - return @[YMLocalizedString(@"XPMineDressUpViewController1"), YMLocalizedString(@"XPMineDressUpViewController2"), YMLocalizedString(@"XPMineDressUpViewController3"), YMLocalizedString(@"XPMineDressUpViewController4"), YMLocalizedString(@"XPDressUpShopViewController6")]; + return @[YMLocalizedString(@"XPMineDressUpViewController1"), + YMLocalizedString(@"XPMineDressUpViewController2"), + YMLocalizedString(@"XPMineDressUpViewController3"), + YMLocalizedString(@"XPMineDressUpViewController4"), + YMLocalizedString(@"XPDressUpShopViewController6")]; } - (XPDressUpShopListViewController *)headwearView { diff --git a/YuMi/Modules/YMMine/View/DressUp/View/XPMineDressUpViewController.m b/YuMi/Modules/YMMine/View/DressUp/View/XPMineDressUpViewController.m index 7ae4c7ed..63f5c22d 100644 --- a/YuMi/Modules/YMMine/View/DressUp/View/XPMineDressUpViewController.m +++ b/YuMi/Modules/YMMine/View/DressUp/View/XPMineDressUpViewController.m @@ -84,7 +84,7 @@ } - (void)requestActivityList { - [Api dressupBannerList:^(BaseModel * _Nullable data, NSInteger code, NSString * _Nullable msg) { + [Api dressUpBannerList:^(BaseModel * _Nullable data, NSInteger code, NSString * _Nullable msg) { if (code == 200) { NSArray * array = [ActivityInfoModel modelsWithArray:data.data]; if (array.count <= 0) { diff --git a/YuMi/Modules/YMNewHome/View/XPHomePagingViewController.m b/YuMi/Modules/YMNewHome/View/XPHomePagingViewController.m index f1e561ea..2d69b05d 100644 --- a/YuMi/Modules/YMNewHome/View/XPHomePagingViewController.m +++ b/YuMi/Modules/YMNewHome/View/XPHomePagingViewController.m @@ -14,6 +14,8 @@ #import "Api+Gift.h" #import "XPGiftStorage.h" +#import "ShoppingMallViewController.h" + @interface XPHomePagingViewController () @property (nonatomic, strong) UIView *topControlView; @@ -164,6 +166,11 @@ #pragma mark - - (void)didTapMineButton { + ShoppingMallViewController *vc = [[ShoppingMallViewController alloc] init]; + [self.navigationController pushViewController:vc animated:YES]; + return; + + [self.pageContainer setViewControllers:@[self.viewControllers[1]] direction:UIPageViewControllerNavigationDirectionReverse animated:NO diff --git a/YuMi/Modules/YMTabbar/View/TabbarViewController.m b/YuMi/Modules/YMTabbar/View/TabbarViewController.m index 1bd36fdf..facc7174 100644 --- a/YuMi/Modules/YMTabbar/View/TabbarViewController.m +++ b/YuMi/Modules/YMTabbar/View/TabbarViewController.m @@ -794,7 +794,6 @@ UIKIT_EXTERN NSString *kTabShowAnchorCardKey; self.viewControllers = [viewControllers copy]; self.selectedIndex = 0; - if (isLogin) { for (int i = 0; i < self.viewControllers.count; i++) { UIViewController *itemVc = self.viewControllers[i]; diff --git a/YuMi/en.lproj/Localizable.strings b/YuMi/en.lproj/Localizable.strings index 1dd415f9..f6067810 100644 --- a/YuMi/en.lproj/Localizable.strings +++ b/YuMi/en.lproj/Localizable.strings @@ -676,7 +676,7 @@ "XPMineDressUpViewController0" = "My Item"; "XPMineDressUpViewController1" = "Avatar Frame"; -"XPMineDressUpViewController2" = "Mount"; +"XPMineDressUpViewController2" = "Vehicle"; "XPMineDressUpViewController3" = "Nameplate"; "XPMineDressUpViewController4" = "Profile Card"; "XPMineDressUpViewController5" = "Chat Bubble"; diff --git a/YuMi/zh-Hant.lproj/Localizable.strings b/YuMi/zh-Hant.lproj/Localizable.strings index c5c6bbcf..fd05d869 100644 --- a/YuMi/zh-Hant.lproj/Localizable.strings +++ b/YuMi/zh-Hant.lproj/Localizable.strings @@ -12,6 +12,7 @@ ///XPCandyTreeMoreView.m "XPCandyTreeMoreView0" = "更多"; +"XPCandyTreeMoreView0" = "更多"; "XPCandyTreeMoreView2" = "獲獎記錄"; "XPCandyTreeMoreView3" = "玩法規則"; "XPCandyTreeMoreView4" = "允許將中獎消息對外展示";