Commit f44bbd4b00a90381185a7ee601f28cf64c1c2c87

Authored by liushiyu
2 parents c297edd8 81b032f8

Merge branch 'master' of http://bj.gitlab.cnlive.com/ios-team/CNLiveMateCode

# Conflicts:
#	metaCode.xcodeproj/project.pbxproj
#	metaCode/Classes/Other/AppDelegate.swift
Showing 69 changed files with 3031 additions and 95 deletions
@@ -42,10 +42,10 @@ target 'metaCode' do @@ -42,10 +42,10 @@ target 'metaCode' do
42 #分类滚动切换视图 42 #分类滚动切换视图
43 pod 'JXSegmentedView', :git => 'https://gitee.com/mirrors/JXSegmentedView.git' 43 pod 'JXSegmentedView', :git => 'https://gitee.com/mirrors/JXSegmentedView.git'
44 pod 'JXPagingView/Paging' 44 pod 'JXPagingView/Paging'
45 -  
46 - 45 + #轮播图
  46 + pod 'FSPagerView', '~> 0.8.3'
47 #应用调试工具 47 #应用调试工具
48 - pod 'FWDebug', :configurations => ['Debug'] 48 +# pod 'FWDebug', :configurations => ['Debug']
49 49
50 target 'metaCodeTests' do 50 target 'metaCodeTests' do
51 inherit! :search_paths 51 inherit! :search_paths
metaCode.xcodeproj/project.pbxproj
@@ -9,7 +9,32 @@ @@ -9,7 +9,32 @@
9 /* Begin PBXBuildFile section */ 9 /* Begin PBXBuildFile section */
10 0D39E93D7229931C86EB1161 /* Pods_metaCode_metaCodeUITests.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 63D879B49B1E42F1584DD75E /* Pods_metaCode_metaCodeUITests.framework */; }; 10 0D39E93D7229931C86EB1161 /* Pods_metaCode_metaCodeUITests.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 63D879B49B1E42F1584DD75E /* Pods_metaCode_metaCodeUITests.framework */; };
11 19123FC12ABC11170075C883 /* CNWebViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 19123FC02ABC11170075C883 /* CNWebViewController.swift */; }; 11 19123FC12ABC11170075C883 /* CNWebViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 19123FC02ABC11170075C883 /* CNWebViewController.swift */; };
  12 + 192336EB2AD9224300D47CD4 /* CNUpSlideViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 192336EA2AD9224300D47CD4 /* CNUpSlideViewController.swift */; };
  13 + 1926C28F2AE0D76C00C71DC3 /* CNLiveDownSlideViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1926C28E2AE0D76C00C71DC3 /* CNLiveDownSlideViewModel.swift */; };
  14 + 1926C2912AE0FD4500C71DC3 /* CNLiveDownSlideModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1926C2902AE0FD4500C71DC3 /* CNLiveDownSlideModel.swift */; };
  15 + 19BB1FDF2AEA3A450094D962 /* CNSlideBaseNavigationController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 19BB1FDE2AEA3A450094D962 /* CNSlideBaseNavigationController.swift */; };
  16 + 19BB1FE12AEB5C220094D962 /* CNLiveShopConsoleController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 19BB1FE02AEB5C220094D962 /* CNLiveShopConsoleController.swift */; };
  17 + 19BB1FE32AEB8B7C0094D962 /* CNLiveShopConsoleViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 19BB1FE22AEB8B7C0094D962 /* CNLiveShopConsoleViewModel.swift */; };
  18 + 19BB1FE62AEB93B80094D962 /* CNLiveShopUserInfoModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 19BB1FE52AEB93B80094D962 /* CNLiveShopUserInfoModel.swift */; };
  19 + 19BB1FE82AECAD060094D962 /* CNLiveShopConsoleModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 19BB1FE72AECAD060094D962 /* CNLiveShopConsoleModel.swift */; };
  20 + 19BB1FEA2AEF7B4A0094D962 /* CNLiveShopConsoleCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 19BB1FE92AEF7B4A0094D962 /* CNLiveShopConsoleCell.swift */; };
  21 + 19BB1FEC2AF0AB8E0094D962 /* CNLiveDownShopDetailController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 19BB1FEB2AF0AB8E0094D962 /* CNLiveDownShopDetailController.swift */; };
  22 + 19BB1FEE2AF0E1EC0094D962 /* CNLiveShopDetailViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 19BB1FED2AF0E1EC0094D962 /* CNLiveShopDetailViewModel.swift */; };
  23 + 19BB1FF02AF0E5B30094D962 /* CNLiveShopDetailModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 19BB1FEF2AF0E5B30094D962 /* CNLiveShopDetailModel.swift */; };
  24 + 19BB1FF22AF21A950094D962 /* CNLliveShopDetailBannerCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 19BB1FF12AF21A950094D962 /* CNLliveShopDetailBannerCell.swift */; };
  25 + 19BB202B2AF382150094D962 /* CNLiveAdaptTool.swift in Sources */ = {isa = PBXBuildFile; fileRef = 19BB202A2AF382150094D962 /* CNLiveAdaptTool.swift */; };
  26 + 19CC4D472ADD006600308E2A /* CNDownSlideSingleCourseCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 19CC4D462ADD006600308E2A /* CNDownSlideSingleCourseCell.swift */; };
  27 + 19CC4D492ADD06C500308E2A /* UITableView+Extension.swift in Sources */ = {isa = PBXBuildFile; fileRef = 19CC4D482ADD06C500308E2A /* UITableView+Extension.swift */; };
  28 + 19CC4D4B2ADD086F00308E2A /* CNUpSlideDetailViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 19CC4D4A2ADD086F00308E2A /* CNUpSlideDetailViewController.swift */; };
  29 + 19CC4D4F2ADD0FC200308E2A /* CNUpSlideDetailScrollView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 19CC4D4E2ADD0FC200308E2A /* CNUpSlideDetailScrollView.swift */; };
  30 + 19CC4D522ADD129800308E2A /* CNUpSlideAnimationTransition.swift in Sources */ = {isa = PBXBuildFile; fileRef = 19CC4D512ADD129800308E2A /* CNUpSlideAnimationTransition.swift */; };
  31 + 19CC4D542ADD163D00308E2A /* CNUpSlideCardPresentationController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 19CC4D532ADD163D00308E2A /* CNUpSlideCardPresentationController.swift */; };
  32 + 19CC4D562ADD19C200308E2A /* String+Extension.swift in Sources */ = {isa = PBXBuildFile; fileRef = 19CC4D552ADD19C200308E2A /* String+Extension.swift */; };
  33 + 19D2CE632AE8B65D00691757 /* CNLiveDownSlideTool.swift in Sources */ = {isa = PBXBuildFile; fileRef = 19D2CE622AE8B65D00691757 /* CNLiveDownSlideTool.swift */; };
12 19F1C2332AB5728B0083D06C /* CNIDCardView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 19F1C2322AB5728B0083D06C /* CNIDCardView.swift */; }; 34 19F1C2332AB5728B0083D06C /* CNIDCardView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 19F1C2322AB5728B0083D06C /* CNIDCardView.swift */; };
  35 + 19FA20172AE22D3C001F7186 /* CNLiveDownSlideRecommendCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 19FA20162AE22D3C001F7186 /* CNLiveDownSlideRecommendCell.swift */; };
  36 + 19FA20192AE22D98001F7186 /* CNLiveDownSlideTodayRecommendCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 19FA20182AE22D98001F7186 /* CNLiveDownSlideTodayRecommendCell.swift */; };
  37 + 19FA201B2AE60423001F7186 /* CNLiveDownSlideModelLayout.swift in Sources */ = {isa = PBXBuildFile; fileRef = 19FA201A2AE60423001F7186 /* CNLiveDownSlideModelLayout.swift */; };
13 1DD2808DF02C120276F99F4D /* Pods_metaCode.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = F1C55A719CFEE073C06D37CE /* Pods_metaCode.framework */; }; 38 1DD2808DF02C120276F99F4D /* Pods_metaCode.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = F1C55A719CFEE073C06D37CE /* Pods_metaCode.framework */; };
14 7905BB492AB0588B0089BC50 /* CNLiveMineAuthResultViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7905BB482AB0588B0089BC50 /* CNLiveMineAuthResultViewController.swift */; }; 39 7905BB492AB0588B0089BC50 /* CNLiveMineAuthResultViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7905BB482AB0588B0089BC50 /* CNLiveMineAuthResultViewController.swift */; };
15 790B1FB42A4153E90074CF00 /* CNLiveMineBaseModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 790B1FB32A4153E90074CF00 /* CNLiveMineBaseModel.swift */; }; 40 790B1FB42A4153E90074CF00 /* CNLiveMineBaseModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 790B1FB32A4153E90074CF00 /* CNLiveMineBaseModel.swift */; };
@@ -127,7 +152,32 @@ @@ -127,7 +152,32 @@
127 0EC910AB9EBD717B04432BC4 /* Pods-metaCode-metaCodeUITests.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-metaCode-metaCodeUITests.debug.xcconfig"; path = "Target Support Files/Pods-metaCode-metaCodeUITests/Pods-metaCode-metaCodeUITests.debug.xcconfig"; sourceTree = "<group>"; }; 152 0EC910AB9EBD717B04432BC4 /* Pods-metaCode-metaCodeUITests.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-metaCode-metaCodeUITests.debug.xcconfig"; path = "Target Support Files/Pods-metaCode-metaCodeUITests/Pods-metaCode-metaCodeUITests.debug.xcconfig"; sourceTree = "<group>"; };
128 170BC5D0622EA2969D110A3B /* Pods-metaCode.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-metaCode.release.xcconfig"; path = "Target Support Files/Pods-metaCode/Pods-metaCode.release.xcconfig"; sourceTree = "<group>"; }; 153 170BC5D0622EA2969D110A3B /* Pods-metaCode.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-metaCode.release.xcconfig"; path = "Target Support Files/Pods-metaCode/Pods-metaCode.release.xcconfig"; sourceTree = "<group>"; };
129 19123FC02ABC11170075C883 /* CNWebViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CNWebViewController.swift; sourceTree = "<group>"; }; 154 19123FC02ABC11170075C883 /* CNWebViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CNWebViewController.swift; sourceTree = "<group>"; };
  155 + 192336EA2AD9224300D47CD4 /* CNUpSlideViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CNUpSlideViewController.swift; sourceTree = "<group>"; };
  156 + 1926C28E2AE0D76C00C71DC3 /* CNLiveDownSlideViewModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CNLiveDownSlideViewModel.swift; sourceTree = "<group>"; };
  157 + 1926C2902AE0FD4500C71DC3 /* CNLiveDownSlideModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CNLiveDownSlideModel.swift; sourceTree = "<group>"; };
  158 + 19BB1FDE2AEA3A450094D962 /* CNSlideBaseNavigationController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CNSlideBaseNavigationController.swift; sourceTree = "<group>"; };
  159 + 19BB1FE02AEB5C220094D962 /* CNLiveShopConsoleController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CNLiveShopConsoleController.swift; sourceTree = "<group>"; };
  160 + 19BB1FE22AEB8B7C0094D962 /* CNLiveShopConsoleViewModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CNLiveShopConsoleViewModel.swift; sourceTree = "<group>"; };
  161 + 19BB1FE52AEB93B80094D962 /* CNLiveShopUserInfoModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CNLiveShopUserInfoModel.swift; sourceTree = "<group>"; };
  162 + 19BB1FE72AECAD060094D962 /* CNLiveShopConsoleModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CNLiveShopConsoleModel.swift; sourceTree = "<group>"; };
  163 + 19BB1FE92AEF7B4A0094D962 /* CNLiveShopConsoleCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CNLiveShopConsoleCell.swift; sourceTree = "<group>"; };
  164 + 19BB1FEB2AF0AB8E0094D962 /* CNLiveDownShopDetailController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CNLiveDownShopDetailController.swift; sourceTree = "<group>"; };
  165 + 19BB1FED2AF0E1EC0094D962 /* CNLiveShopDetailViewModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CNLiveShopDetailViewModel.swift; sourceTree = "<group>"; };
  166 + 19BB1FEF2AF0E5B30094D962 /* CNLiveShopDetailModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CNLiveShopDetailModel.swift; sourceTree = "<group>"; };
  167 + 19BB1FF12AF21A950094D962 /* CNLliveShopDetailBannerCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CNLliveShopDetailBannerCell.swift; sourceTree = "<group>"; };
  168 + 19BB202A2AF382150094D962 /* CNLiveAdaptTool.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CNLiveAdaptTool.swift; sourceTree = "<group>"; };
  169 + 19CC4D462ADD006600308E2A /* CNDownSlideSingleCourseCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CNDownSlideSingleCourseCell.swift; sourceTree = "<group>"; };
  170 + 19CC4D482ADD06C500308E2A /* UITableView+Extension.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "UITableView+Extension.swift"; sourceTree = "<group>"; };
  171 + 19CC4D4A2ADD086F00308E2A /* CNUpSlideDetailViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CNUpSlideDetailViewController.swift; sourceTree = "<group>"; };
  172 + 19CC4D4E2ADD0FC200308E2A /* CNUpSlideDetailScrollView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CNUpSlideDetailScrollView.swift; sourceTree = "<group>"; };
  173 + 19CC4D512ADD129800308E2A /* CNUpSlideAnimationTransition.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CNUpSlideAnimationTransition.swift; sourceTree = "<group>"; };
  174 + 19CC4D532ADD163D00308E2A /* CNUpSlideCardPresentationController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CNUpSlideCardPresentationController.swift; sourceTree = "<group>"; };
  175 + 19CC4D552ADD19C200308E2A /* String+Extension.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "String+Extension.swift"; sourceTree = "<group>"; };
  176 + 19D2CE622AE8B65D00691757 /* CNLiveDownSlideTool.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CNLiveDownSlideTool.swift; sourceTree = "<group>"; };
130 19F1C2322AB5728B0083D06C /* CNIDCardView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CNIDCardView.swift; sourceTree = "<group>"; }; 177 19F1C2322AB5728B0083D06C /* CNIDCardView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CNIDCardView.swift; sourceTree = "<group>"; };
  178 + 19FA20162AE22D3C001F7186 /* CNLiveDownSlideRecommendCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CNLiveDownSlideRecommendCell.swift; sourceTree = "<group>"; };
  179 + 19FA20182AE22D98001F7186 /* CNLiveDownSlideTodayRecommendCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CNLiveDownSlideTodayRecommendCell.swift; sourceTree = "<group>"; };
  180 + 19FA201A2AE60423001F7186 /* CNLiveDownSlideModelLayout.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CNLiveDownSlideModelLayout.swift; sourceTree = "<group>"; };
131 54E09C540E13D78166D71395 /* Pods_metaCodeTests.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_metaCodeTests.framework; sourceTree = BUILT_PRODUCTS_DIR; }; 181 54E09C540E13D78166D71395 /* Pods_metaCodeTests.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_metaCodeTests.framework; sourceTree = BUILT_PRODUCTS_DIR; };
132 63D879B49B1E42F1584DD75E /* Pods_metaCode_metaCodeUITests.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_metaCode_metaCodeUITests.framework; sourceTree = BUILT_PRODUCTS_DIR; }; 182 63D879B49B1E42F1584DD75E /* Pods_metaCode_metaCodeUITests.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_metaCode_metaCodeUITests.framework; sourceTree = BUILT_PRODUCTS_DIR; };
133 67F8190701D1AB7F7724E8BA /* Pods-metaCodeTests.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-metaCodeTests.release.xcconfig"; path = "Target Support Files/Pods-metaCodeTests/Pods-metaCodeTests.release.xcconfig"; sourceTree = "<group>"; }; 183 67F8190701D1AB7F7724E8BA /* Pods-metaCodeTests.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-metaCodeTests.release.xcconfig"; path = "Target Support Files/Pods-metaCodeTests/Pods-metaCodeTests.release.xcconfig"; sourceTree = "<group>"; };
@@ -263,6 +313,28 @@ @@ -263,6 +313,28 @@
263 /* End PBXFrameworksBuildPhase section */ 313 /* End PBXFrameworksBuildPhase section */
264 314
265 /* Begin PBXGroup section */ 315 /* Begin PBXGroup section */
  316 + 19BB1FE42AEB93850094D962 /* Model */ = {
  317 + isa = PBXGroup;
  318 + children = (
  319 + 1926C2902AE0FD4500C71DC3 /* CNLiveDownSlideModel.swift */,
  320 + 19BB1FE52AEB93B80094D962 /* CNLiveShopUserInfoModel.swift */,
  321 + 19BB1FE72AECAD060094D962 /* CNLiveShopConsoleModel.swift */,
  322 + 19BB1FEF2AF0E5B30094D962 /* CNLiveShopDetailModel.swift */,
  323 + );
  324 + path = Model;
  325 + sourceTree = "<group>";
  326 + };
  327 + 19CC4D502ADD126D00308E2A /* Util */ = {
  328 + isa = PBXGroup;
  329 + children = (
  330 + 19CC4D512ADD129800308E2A /* CNUpSlideAnimationTransition.swift */,
  331 + 19FA201A2AE60423001F7186 /* CNLiveDownSlideModelLayout.swift */,
  332 + 19D2CE622AE8B65D00691757 /* CNLiveDownSlideTool.swift */,
  333 + 19BB202A2AF382150094D962 /* CNLiveAdaptTool.swift */,
  334 + );
  335 + path = Util;
  336 + sourceTree = "<group>";
  337 + };
266 20238A324E444EF8C813D9FA /* Pods */ = { 338 20238A324E444EF8C813D9FA /* Pods */ = {
267 isa = PBXGroup; 339 isa = PBXGroup;
268 children = ( 340 children = (
@@ -290,6 +362,8 @@ @@ -290,6 +362,8 @@
290 7C83B4432A541F36004BF4A4 /* NSDate+CNLiveExtensions.swift */, 362 7C83B4432A541F36004BF4A4 /* NSDate+CNLiveExtensions.swift */,
291 79E496E22AB9357000127BF8 /* UITableViewCell+CNLiveExtension.swift */, 363 79E496E22AB9357000127BF8 /* UITableViewCell+CNLiveExtension.swift */,
292 79E496E72AB9674300127BF8 /* NSMutableAttributedString+CNLiveExtensions.swift */, 364 79E496E72AB9674300127BF8 /* NSMutableAttributedString+CNLiveExtensions.swift */,
  365 + 19CC4D482ADD06C500308E2A /* UITableView+Extension.swift */,
  366 + 19CC4D552ADD19C200308E2A /* String+Extension.swift */,
293 ); 367 );
294 path = Extensions; 368 path = Extensions;
295 sourceTree = "<group>"; 369 sourceTree = "<group>";
@@ -599,6 +673,9 @@ @@ -599,6 +673,9 @@
599 isa = PBXGroup; 673 isa = PBXGroup;
600 children = ( 674 children = (
601 7C83B43D2A52B8BA004BF4A4 /* CNHomePageViewModel.swift */, 675 7C83B43D2A52B8BA004BF4A4 /* CNHomePageViewModel.swift */,
  676 + 1926C28E2AE0D76C00C71DC3 /* CNLiveDownSlideViewModel.swift */,
  677 + 19BB1FE22AEB8B7C0094D962 /* CNLiveShopConsoleViewModel.swift */,
  678 + 19BB1FED2AF0E1EC0094D962 /* CNLiveShopDetailViewModel.swift */,
602 ); 679 );
603 name = ViewModel; 680 name = ViewModel;
604 path = HomePage/ViewModel; 681 path = HomePage/ViewModel;
@@ -607,6 +684,8 @@ @@ -607,6 +684,8 @@
607 7CD675212A26F844008354C1 /* HomePage */ = { 684 7CD675212A26F844008354C1 /* HomePage */ = {
608 isa = PBXGroup; 685 isa = PBXGroup;
609 children = ( 686 children = (
  687 + 19CC4D502ADD126D00308E2A /* Util */,
  688 + 19BB1FE42AEB93850094D962 /* Model */,
610 7C83B43C2A52B899004BF4A4 /* ViewModel */, 689 7C83B43C2A52B899004BF4A4 /* ViewModel */,
611 7CD6754D2A2840B9008354C1 /* Controller */, 690 7CD6754D2A2840B9008354C1 /* Controller */,
612 7CD675232A26F8F8008354C1 /* View */, 691 7CD675232A26F8F8008354C1 /* View */,
@@ -627,6 +706,12 @@ @@ -627,6 +706,12 @@
627 7C4931372A307BDB000E44B4 /* CNHomePageGuideView.swift */, 706 7C4931372A307BDB000E44B4 /* CNHomePageGuideView.swift */,
628 7C27032F2A36CBE30061EC50 /* CNCertificationView.swift */, 707 7C27032F2A36CBE30061EC50 /* CNCertificationView.swift */,
629 19F1C2322AB5728B0083D06C /* CNIDCardView.swift */, 708 19F1C2322AB5728B0083D06C /* CNIDCardView.swift */,
  709 + 19FA20162AE22D3C001F7186 /* CNLiveDownSlideRecommendCell.swift */,
  710 + 19FA20182AE22D98001F7186 /* CNLiveDownSlideTodayRecommendCell.swift */,
  711 + 19CC4D462ADD006600308E2A /* CNDownSlideSingleCourseCell.swift */,
  712 + 19CC4D4E2ADD0FC200308E2A /* CNUpSlideDetailScrollView.swift */,
  713 + 19BB1FE92AEF7B4A0094D962 /* CNLiveShopConsoleCell.swift */,
  714 + 19BB1FF12AF21A950094D962 /* CNLliveShopDetailBannerCell.swift */,
630 ); 715 );
631 name = View; 716 name = View;
632 path = HomePage/View; 717 path = HomePage/View;
@@ -635,8 +720,14 @@ @@ -635,8 +720,14 @@
635 7CD6754D2A2840B9008354C1 /* Controller */ = { 720 7CD6754D2A2840B9008354C1 /* Controller */ = {
636 isa = PBXGroup; 721 isa = PBXGroup;
637 children = ( 722 children = (
  723 + 19BB1FDE2AEA3A450094D962 /* CNSlideBaseNavigationController.swift */,
638 7CD6754E2A2840B9008354C1 /* CNMetaCodeHomePageController.swift */, 724 7CD6754E2A2840B9008354C1 /* CNMetaCodeHomePageController.swift */,
639 19123FC02ABC11170075C883 /* CNWebViewController.swift */, 725 19123FC02ABC11170075C883 /* CNWebViewController.swift */,
  726 + 192336EA2AD9224300D47CD4 /* CNUpSlideViewController.swift */,
  727 + 19CC4D4A2ADD086F00308E2A /* CNUpSlideDetailViewController.swift */,
  728 + 19CC4D532ADD163D00308E2A /* CNUpSlideCardPresentationController.swift */,
  729 + 19BB1FE02AEB5C220094D962 /* CNLiveShopConsoleController.swift */,
  730 + 19BB1FEB2AF0AB8E0094D962 /* CNLiveDownShopDetailController.swift */,
640 ); 731 );
641 name = Controller; 732 name = Controller;
642 path = HomePage/Controller; 733 path = HomePage/Controller;
@@ -944,32 +1035,44 @@ @@ -944,32 +1035,44 @@
944 isa = PBXSourcesBuildPhase; 1035 isa = PBXSourcesBuildPhase;
945 buildActionMask = 2147483647; 1036 buildActionMask = 2147483647;
946 files = ( 1037 files = (
  1038 + 19BB1FE82AECAD060094D962 /* CNLiveShopConsoleModel.swift in Sources */,
  1039 + 19BB1FEE2AF0E1EC0094D962 /* CNLiveShopDetailViewModel.swift in Sources */,
947 19F1C2332AB5728B0083D06C /* CNIDCardView.swift in Sources */, 1040 19F1C2332AB5728B0083D06C /* CNIDCardView.swift in Sources */,
948 7CD675292A270F6A008354C1 /* WJColorChange.m in Sources */, 1041 7CD675292A270F6A008354C1 /* WJColorChange.m in Sources */,
949 79F4B11C2A33036E00993C03 /* CNLiveMineInfoAlertView.swift in Sources */, 1042 79F4B11C2A33036E00993C03 /* CNLiveMineInfoAlertView.swift in Sources */,
950 79BB96A82AF223FB00AEA4AC /* CNLiveConfigAlertManager.swift in Sources */, 1043 79BB96A82AF223FB00AEA4AC /* CNLiveConfigAlertManager.swift in Sources */,
  1044 + 19BB1FF02AF0E5B30094D962 /* CNLiveShopDetailModel.swift in Sources */,
951 796398942A260C0100D045EB /* AppDelegate.swift in Sources */, 1045 796398942A260C0100D045EB /* AppDelegate.swift in Sources */,
952 7989B5C72A4BDC7200A19B10 /* CNLiveMineEarnListViewController.swift in Sources */, 1046 7989B5C72A4BDC7200A19B10 /* CNLiveMineEarnListViewController.swift in Sources */,
953 79396EF12A31C21B0053E1AF /* CNLiveInfoShowViewController.swift in Sources */, 1047 79396EF12A31C21B0053E1AF /* CNLiveInfoShowViewController.swift in Sources */,
  1048 + 192336EB2AD9224300D47CD4 /* CNUpSlideViewController.swift in Sources */,
954 7963989D2A260E6200D045EB /* CNLiveBaseViewController.swift in Sources */, 1049 7963989D2A260E6200D045EB /* CNLiveBaseViewController.swift in Sources */,
955 798A44FB2A30999900815935 /* CNLiveAlertTool.swift in Sources */, 1050 798A44FB2A30999900815935 /* CNLiveAlertTool.swift in Sources */,
956 790D01A52A2DF65E00C5978D /* CNLiveLoginPickerView.swift in Sources */, 1051 790D01A52A2DF65E00C5978D /* CNLiveLoginPickerView.swift in Sources */,
957 79BA085D2AB18E8300D01875 /* CNLiveSaveAuthDB.swift in Sources */, 1052 79BA085D2AB18E8300D01875 /* CNLiveSaveAuthDB.swift in Sources */,
958 79282A3C2A2EDC2500B5F8CF /* NSString+CNLiveExtensions.swift in Sources */, 1053 79282A3C2A2EDC2500B5F8CF /* NSString+CNLiveExtensions.swift in Sources */,
  1054 + 19D2CE632AE8B65D00691757 /* CNLiveDownSlideTool.swift in Sources */,
959 790B1FB82A41B6A60074CF00 /* CNLiveMineMessageViewController.swift in Sources */, 1055 790B1FB82A41B6A60074CF00 /* CNLiveMineMessageViewController.swift in Sources */,
  1056 + 19BB202B2AF382150094D962 /* CNLiveAdaptTool.swift in Sources */,
960 798A44F22A30674200815935 /* CNLiveMineSubBodyListView.swift in Sources */, 1057 798A44F22A30674200815935 /* CNLiveMineSubBodyListView.swift in Sources */,
961 799172382AF090CD00DC01A8 /* CNLiveShopBodyListView.swift in Sources */, 1058 799172382AF090CD00DC01A8 /* CNLiveShopBodyListView.swift in Sources */,
962 790D01822A2D88FC00C5978D /* CNLiveConfigMacro.swift in Sources */, 1059 790D01822A2D88FC00C5978D /* CNLiveConfigMacro.swift in Sources */,
  1060 + 19CC4D4B2ADD086F00308E2A /* CNUpSlideDetailViewController.swift in Sources */,
963 7C83B4402A52BB2B004BF4A4 /* CNGlobalEnum.swift in Sources */, 1061 7C83B4402A52BB2B004BF4A4 /* CNGlobalEnum.swift in Sources */,
964 7C83B4442A541F36004BF4A4 /* NSDate+CNLiveExtensions.swift in Sources */, 1062 7C83B4442A541F36004BF4A4 /* NSDate+CNLiveExtensions.swift in Sources */,
965 7CD675482A274167008354C1 /* PGIndexBannerSubiew.m in Sources */, 1063 7CD675482A274167008354C1 /* PGIndexBannerSubiew.m in Sources */,
966 790D019F2A2DD66E00C5978D /* CNLiveLoginViewModel.swift in Sources */, 1064 790D019F2A2DD66E00C5978D /* CNLiveLoginViewModel.swift in Sources */,
  1065 + 1926C2912AE0FD4500C71DC3 /* CNLiveDownSlideModel.swift in Sources */,
967 7C7C62F62A4D72E9007A912E /* CNLiveIdentityDB.swift in Sources */, 1066 7C7C62F62A4D72E9007A912E /* CNLiveIdentityDB.swift in Sources */,
  1067 + 19CC4D4F2ADD0FC200308E2A /* CNUpSlideDetailScrollView.swift in Sources */,
968 79EABB892AB4497700F3A4E2 /* CNLiveSaveStandDB.swift in Sources */, 1068 79EABB892AB4497700F3A4E2 /* CNLiveSaveStandDB.swift in Sources */,
969 790B1FB62A41938F0074CF00 /* UIImage+CNLiveExtensions.swift in Sources */, 1069 790B1FB62A41938F0074CF00 /* UIImage+CNLiveExtensions.swift in Sources */,
  1070 + 19BB1FEA2AEF7B4A0094D962 /* CNLiveShopConsoleCell.swift in Sources */,
970 790D019D2A2DCBD000C5978D /* UIView+CNLiveExtensions.swift in Sources */, 1071 790D019D2A2DCBD000C5978D /* UIView+CNLiveExtensions.swift in Sources */,
971 790B1FB62A41938F0074CF00 /* UIImage+CNLiveExtensions.swift in Sources */, 1072 790B1FB62A41938F0074CF00 /* UIImage+CNLiveExtensions.swift in Sources */,
  1073 + 19FA20172AE22D3C001F7186 /* CNLiveDownSlideRecommendCell.swift in Sources */,
972 19123FC12ABC11170075C883 /* CNWebViewController.swift in Sources */, 1074 19123FC12ABC11170075C883 /* CNWebViewController.swift in Sources */,
  1075 + 1926C28F2AE0D76C00C71DC3 /* CNLiveDownSlideViewModel.swift in Sources */,
973 790D019D2A2DCBD000C5978D /* UIView+CNLiveExtensions.swift in Sources */, 1076 790D019D2A2DCBD000C5978D /* UIView+CNLiveExtensions.swift in Sources */,
974 7C7C62F62A4D72E9007A912E /* CNLiveIdentityDB.swift in Sources */, 1077 7C7C62F62A4D72E9007A912E /* CNLiveIdentityDB.swift in Sources */,
975 799172342AF08D3200DC01A8 /* CNLiveShopViewModel.swift in Sources */, 1078 799172342AF08D3200DC01A8 /* CNLiveShopViewModel.swift in Sources */,
@@ -977,6 +1080,7 @@ @@ -977,6 +1080,7 @@
977 790B1FB62A41938F0074CF00 /* UIImage+CNLiveExtensions.swift in Sources */, 1080 790B1FB62A41938F0074CF00 /* UIImage+CNLiveExtensions.swift in Sources */,
978 790D019D2A2DCBD000C5978D /* UIView+CNLiveExtensions.swift in Sources */, 1081 790D019D2A2DCBD000C5978D /* UIView+CNLiveExtensions.swift in Sources */,
979 79E496E82AB9674300127BF8 /* NSMutableAttributedString+CNLiveExtensions.swift in Sources */, 1082 79E496E82AB9674300127BF8 /* NSMutableAttributedString+CNLiveExtensions.swift in Sources */,
  1083 + 19CC4D472ADD006600308E2A /* CNDownSlideSingleCourseCell.swift in Sources */,
980 79E496E32AB9357000127BF8 /* UITableViewCell+CNLiveExtension.swift in Sources */, 1084 79E496E32AB9357000127BF8 /* UITableViewCell+CNLiveExtension.swift in Sources */,
981 7C83B4422A541EBF004BF4A4 /* CALayer+CNLiveExtensions.swift in Sources */, 1085 7C83B4422A541EBF004BF4A4 /* CALayer+CNLiveExtensions.swift in Sources */,
982 798A44F72A3077ED00815935 /* CNLiveHotButton.swift in Sources */, 1086 798A44F72A3077ED00815935 /* CNLiveHotButton.swift in Sources */,
@@ -985,9 +1089,12 @@ @@ -985,9 +1089,12 @@
985 7CD675522A29C04B008354C1 /* CNLiveConfigstant.swift in Sources */, 1089 7CD675522A29C04B008354C1 /* CNLiveConfigstant.swift in Sources */,
986 79282A402A2F055100B5F8CF /* CNLiveConfigUserInfo.swift in Sources */, 1090 79282A402A2F055100B5F8CF /* CNLiveConfigUserInfo.swift in Sources */,
987 7C83B43E2A52B8BA004BF4A4 /* CNHomePageViewModel.swift in Sources */, 1091 7C83B43E2A52B8BA004BF4A4 /* CNHomePageViewModel.swift in Sources */,
  1092 + 19BB1FDF2AEA3A450094D962 /* CNSlideBaseNavigationController.swift in Sources */,
  1093 + 19BB1FE12AEB5C220094D962 /* CNLiveShopConsoleController.swift in Sources */,
988 7C4931382A307BDB000E44B4 /* CNHomePageGuideView.swift in Sources */, 1094 7C4931382A307BDB000E44B4 /* CNHomePageGuideView.swift in Sources */,
989 7CD6753E2A2740B0008354C1 /* CNUpSlideView.swift in Sources */, 1095 7CD6753E2A2740B0008354C1 /* CNUpSlideView.swift in Sources */,
990 7CD675402A2740B0008354C1 /* CNDownSlideView.swift in Sources */, 1096 7CD675402A2740B0008354C1 /* CNDownSlideView.swift in Sources */,
  1097 + 19BB1FE32AEB8B7C0094D962 /* CNLiveShopConsoleViewModel.swift in Sources */,
991 792E57D92A3AA2F2005834DB /* CNLiveCommonBaseModel.swift in Sources */, 1098 792E57D92A3AA2F2005834DB /* CNLiveCommonBaseModel.swift in Sources */,
992 7CD6753E2A2740B0008354C1 /* CNUpSlideView.swift in Sources */, 1099 7CD6753E2A2740B0008354C1 /* CNUpSlideView.swift in Sources */,
993 7CD675402A2740B0008354C1 /* CNDownSlideView.swift in Sources */, 1100 7CD675402A2740B0008354C1 /* CNDownSlideView.swift in Sources */,
@@ -995,16 +1102,20 @@ @@ -995,16 +1102,20 @@
995 7C2703362A3AFD3A0061EC50 /* CNLiveEnvironment.swift in Sources */, 1102 7C2703362A3AFD3A0061EC50 /* CNLiveEnvironment.swift in Sources */,
996 798A44FD2A309EBA00815935 /* CNLiveTypeFeedBackViewController.swift in Sources */, 1103 798A44FD2A309EBA00815935 /* CNLiveTypeFeedBackViewController.swift in Sources */,
997 79656E382AAEBA8E00119A61 /* CNLiveMineInputViewController.swift in Sources */, 1104 79656E382AAEBA8E00119A61 /* CNLiveMineInputViewController.swift in Sources */,
  1105 + 19CC4D522ADD129800308E2A /* CNUpSlideAnimationTransition.swift in Sources */,
998 7CD6754F2A2840B9008354C1 /* CNMetaCodeHomePageController.swift in Sources */, 1106 7CD6754F2A2840B9008354C1 /* CNMetaCodeHomePageController.swift in Sources */,
999 7989B5C52A4BDC6000A19B10 /* CNLiveMineEarnViewController.swift in Sources */, 1107 7989B5C52A4BDC6000A19B10 /* CNLiveMineEarnViewController.swift in Sources */,
1000 792E57DB2A3AE9F4005834DB /* CNLiveCommonQiniuTool.swift in Sources */, 1108 792E57DB2A3AE9F4005834DB /* CNLiveCommonQiniuTool.swift in Sources */,
  1109 + 19BB1FE62AEB93B80094D962 /* CNLiveShopUserInfoModel.swift in Sources */,
1001 7CD675472A274167008354C1 /* NewPagedFlowView.m in Sources */, 1110 7CD675472A274167008354C1 /* NewPagedFlowView.m in Sources */,
1002 79F4B11A2A32F21400993C03 /* CNLiveMineNickViewController.swift in Sources */, 1111 79F4B11A2A32F21400993C03 /* CNLiveMineNickViewController.swift in Sources */,
1003 798A44FF2A30A0A800815935 /* CNLiveInputFeedBackViewController.swift in Sources */, 1112 798A44FF2A30A0A800815935 /* CNLiveInputFeedBackViewController.swift in Sources */,
1004 79282A442A2F1C1E00B5F8CF /* CNLiveLoginAuthView.swift in Sources */, 1113 79282A442A2F1C1E00B5F8CF /* CNLiveLoginAuthView.swift in Sources */,
1005 79BB96A62AF21E2800AEA4AC /* CNLiveShopOrderDetailViewController.swift in Sources */, 1114 79BB96A62AF21E2800AEA4AC /* CNLiveShopOrderDetailViewController.swift in Sources */,
1006 7C2703302A36CBE30061EC50 /* CNCertificationView.swift in Sources */, 1115 7C2703302A36CBE30061EC50 /* CNCertificationView.swift in Sources */,
  1116 + 19CC4D542ADD163D00308E2A /* CNUpSlideCardPresentationController.swift in Sources */,
1007 790D01A32A2DDBA300C5978D /* CNLiveConfigManager.swift in Sources */, 1117 790D01A32A2DDBA300C5978D /* CNLiveConfigManager.swift in Sources */,
  1118 + 19CC4D492ADD06C500308E2A /* UITableView+Extension.swift in Sources */,
1008 7C2703332A36CC660061EC50 /* CNLiveGlobalBlock.swift in Sources */, 1119 7C2703332A36CC660061EC50 /* CNLiveGlobalBlock.swift in Sources */,
1009 7987BF3D2A497644000A1ABC /* CNLiveMineQuestViewController.swift in Sources */, 1120 7987BF3D2A497644000A1ABC /* CNLiveMineQuestViewController.swift in Sources */,
1010 798A44EA2A30135D00815935 /* CNLiveMineBodyListView.swift in Sources */, 1121 798A44EA2A30135D00815935 /* CNLiveMineBodyListView.swift in Sources */,
@@ -1013,14 +1124,18 @@ @@ -1013,14 +1124,18 @@
1013 79A68C4A2A26E6CE00DC3B43 /* (null) in Sources */, 1124 79A68C4A2A26E6CE00DC3B43 /* (null) in Sources */,
1014 790D01852A2D89E100C5978D /* UIColor+CNLiveExtensions.swift in Sources */, 1125 790D01852A2D89E100C5978D /* UIColor+CNLiveExtensions.swift in Sources */,
1015 79396EED2A319F220053E1AF /* NSObject+CNLiveExtensions.swift in Sources */, 1126 79396EED2A319F220053E1AF /* NSObject+CNLiveExtensions.swift in Sources */,
  1127 + 19FA201B2AE60423001F7186 /* CNLiveDownSlideModelLayout.swift in Sources */,
1016 7C4931312A2F142F000E44B4 /* CNHomePageBackgroupView.swift in Sources */, 1128 7C4931312A2F142F000E44B4 /* CNHomePageBackgroupView.swift in Sources */,
  1129 + 19BB1FF22AF21A950094D962 /* CNLliveShopDetailBannerCell.swift in Sources */,
1017 790D018B2A2D8B3300C5978D /* CNLiveLoginViewController.swift in Sources */, 1130 790D018B2A2D8B3300C5978D /* CNLiveLoginViewController.swift in Sources */,
  1131 + 19CC4D562ADD19C200308E2A /* String+Extension.swift in Sources */,
1018 7905BB492AB0588B0089BC50 /* CNLiveMineAuthResultViewController.swift in Sources */, 1132 7905BB492AB0588B0089BC50 /* CNLiveMineAuthResultViewController.swift in Sources */,
1019 798A44EC2A302DBE00815935 /* CNLiveMineAddInfoViewController.swift in Sources */, 1133 798A44EC2A302DBE00815935 /* CNLiveMineAddInfoViewController.swift in Sources */,
1020 7CD675422A2740F8008354C1 /* CNCustomIndexView.swift in Sources */, 1134 7CD675422A2740F8008354C1 /* CNCustomIndexView.swift in Sources */,
1021 79BB96AA2AF2330900AEA4AC /* CNLiveShopBodyDetailView.swift in Sources */, 1135 79BB96AA2AF2330900AEA4AC /* CNLiveShopBodyDetailView.swift in Sources */,
1022 790D01912A2DAC5E00C5978D /* CNLiveConfigFontMacro.swift in Sources */, 1136 790D01912A2DAC5E00C5978D /* CNLiveConfigFontMacro.swift in Sources */,
1023 790D01852A2D89E100C5978D /* UIColor+CNLiveExtensions.swift in Sources */, 1137 790D01852A2D89E100C5978D /* UIColor+CNLiveExtensions.swift in Sources */,
  1138 + 19FA20192AE22D98001F7186 /* CNLiveDownSlideTodayRecommendCell.swift in Sources */,
1024 790B1FB42A4153E90074CF00 /* CNLiveMineBaseModel.swift in Sources */, 1139 790B1FB42A4153E90074CF00 /* CNLiveMineBaseModel.swift in Sources */,
1025 7978A8432A396632007C86B8 /* CNLiveMineViewModel.swift in Sources */, 1140 7978A8432A396632007C86B8 /* CNLiveMineViewModel.swift in Sources */,
1026 798A44EE2A305AAC00815935 /* CNLiveBaseNavigationController.swift in Sources */, 1141 798A44EE2A305AAC00815935 /* CNLiveBaseNavigationController.swift in Sources */,
@@ -1029,6 +1144,7 @@ @@ -1029,6 +1144,7 @@
1029 79F4B1162A32B96B00993C03 /* CNLiveMineInfoViewController.swift in Sources */, 1144 79F4B1162A32B96B00993C03 /* CNLiveMineInfoViewController.swift in Sources */,
1030 7CD6753F2A2740B0008354C1 /* CNDownSlideViewRemindView.swift in Sources */, 1145 7CD6753F2A2740B0008354C1 /* CNDownSlideViewRemindView.swift in Sources */,
1031 7CD6753C2A2740B0008354C1 /* CNUpSlideViewRemindView.swift in Sources */, 1146 7CD6753C2A2740B0008354C1 /* CNUpSlideViewRemindView.swift in Sources */,
  1147 + 19BB1FEC2AF0AB8E0094D962 /* CNLiveDownShopDetailController.swift in Sources */,
1032 798A44E82A30134400815935 /* CNLiveMineHeaderView.swift in Sources */, 1148 798A44E82A30134400815935 /* CNLiveMineHeaderView.swift in Sources */,
1033 7C49312D2A2DB9FA000E44B4 /* UITabBar+CNLiveExtensions.swift in Sources */, 1149 7C49312D2A2DB9FA000E44B4 /* UITabBar+CNLiveExtensions.swift in Sources */,
1034 790D019A2A2DCAE400C5978D /* CNLiveViewController.swift in Sources */, 1150 790D019A2A2DCAE400C5978D /* CNLiveViewController.swift in Sources */,
metaCode/Classes/Common/Base/CNLiveBaseNavigationController.swift
@@ -11,7 +11,6 @@ class CNLiveBaseNavigationController : UINavigationController, UIGestureRecogniz @@ -11,7 +11,6 @@ class CNLiveBaseNavigationController : UINavigationController, UIGestureRecogniz
11 11
12 override func viewDidLoad() { 12 override func viewDidLoad() {
13 super.viewDidLoad() 13 super.viewDidLoad()
14 -  
15 guard let targets = interactivePopGestureRecognizer?.value(forKey: "_targets") as? [NSObject] else {return} 14 guard let targets = interactivePopGestureRecognizer?.value(forKey: "_targets") as? [NSObject] else {return}
16 let targetObjc = targets[0] 15 let targetObjc = targets[0]
17 let target = targetObjc.value(forKey: "target") 16 let target = targetObjc.value(forKey: "target")
metaCode/Classes/Common/Base/CNLiveBaseTabBarViewController.swift
@@ -36,12 +36,12 @@ class CNLiveBaseTabBarViewController: UITabBarController @@ -36,12 +36,12 @@ class CNLiveBaseTabBarViewController: UITabBarController
36 self.setupBackgroup() 36 self.setupBackgroup()
37 } 37 }
38 38
39 - override func viewWillAppear(_ animated: Bool) {  
40 - super.viewWillAppear(animated)  
41 -  
42 - self.selectedIndex = 1  
43 -  
44 - } 39 +// override func viewWillAppear(_ animated: Bool) {
  40 +// super.viewWillAppear(animated)
  41 +//
  42 +// self.selectedIndex = 1
  43 +//
  44 +// }
45 override func viewDidAppear(_ animated: Bool) { 45 override func viewDidAppear(_ animated: Bool) {
46 super.viewDidAppear(animated) 46 super.viewDidAppear(animated)
47 print("获取用户用户数据=====>\(UserInfoManager.shared.userInfo.uid)") 47 print("获取用户用户数据=====>\(UserInfoManager.shared.userInfo.uid)")
metaCode/Classes/Common/Base/CNLiveBaseViewController.swift
@@ -8,7 +8,7 @@ @@ -8,7 +8,7 @@
8 import UIKit 8 import UIKit
9 import Foundation 9 import Foundation
10 10
11 -class CNLiveBaseViewController: UIViewController { 11 +class CNLiveBaseViewController: UIViewController {
12 12
13 static let kTopNavLeftRightOffset = 6.0 13 static let kTopNavLeftRightOffset = 6.0
14 /// topNavView的高度 默认高度为 get_system_nav_height() 14 /// topNavView的高度 默认高度为 get_system_nav_height()
@@ -215,12 +215,23 @@ class CNLiveBaseViewController: UIViewController { @@ -215,12 +215,23 @@ class CNLiveBaseViewController: UIViewController {
215 leftBtnWhite = false 215 leftBtnWhite = false
216 } 216 }
217 217
  218 +
218 @objc func ClickBackBtn() { 219 @objc func ClickBackBtn() {
219 - if (self.presentingViewController != nil) {  
220 - self.dismiss(animated: true) 220 + let viewControllers = self.navigationController?.viewControllers
  221 + if viewControllers!.count > 1 {
  222 + if viewControllers?.last == self {
  223 + self.navigationController!.popViewController(animated: true)
  224 + }
221 }else{ 225 }else{
222 - self.navigationController!.popViewController(animated: true) 226 + if (self.presentingViewController != nil) {
  227 + self.dismiss(animated: true)
  228 + }
223 } 229 }
  230 +// if (self.presentingViewController != nil) {
  231 +// self.dismiss(animated: true)
  232 +// }else{
  233 +// self.navigationController!.popViewController(animated: true)
  234 +// }
224 } 235 }
225 236
226 @objc func topNavViewTap() { 237 @objc func topNavViewTap() {
metaCode/Classes/Config/CNLiveConfigFontMacro.swift
@@ -61,6 +61,7 @@ let Font_17 = Font(17) @@ -61,6 +61,7 @@ let Font_17 = Font(17)
61 let Font_18 = Font(18) 61 let Font_18 = Font(18)
62 let Font_19 = Font(19) 62 let Font_19 = Font(19)
63 let Font_20 = Font(20) 63 let Font_20 = Font(20)
  64 +let Font_21 = Font(21)
64 let Font_25 = Font(25) 65 let Font_25 = Font(25)
65 let Font_30 = Font(30) 66 let Font_30 = Font(30)
66 67
@@ -77,6 +78,7 @@ let Font_17_Fit = Font(17 * FontFit) @@ -77,6 +78,7 @@ let Font_17_Fit = Font(17 * FontFit)
77 let Font_18_Fit = Font(18 * FontFit) 78 let Font_18_Fit = Font(18 * FontFit)
78 let Font_19_Fit = Font(19 * FontFit) 79 let Font_19_Fit = Font(19 * FontFit)
79 let Font_20_Fit = Font(20 * FontFit) 80 let Font_20_Fit = Font(20 * FontFit)
  81 +let Font_21_Fit = Font(21 * FontFit)
80 let Font_25_Fit = Font(25 * FontFit) 82 let Font_25_Fit = Font(25 * FontFit)
81 let Font_30_Fit = Font(30 * FontFit) 83 let Font_30_Fit = Font(30 * FontFit)
82 84
@@ -93,6 +95,8 @@ let BoldFont_17 = BoldFont(17) @@ -93,6 +95,8 @@ let BoldFont_17 = BoldFont(17)
93 let BoldFont_18 = BoldFont(18) 95 let BoldFont_18 = BoldFont(18)
94 let BoldFont_19 = BoldFont(19) 96 let BoldFont_19 = BoldFont(19)
95 let BoldFont_20 = BoldFont(20) 97 let BoldFont_20 = BoldFont(20)
  98 +let BoldFont_21 = BoldFont(21)
  99 +let BoldFont_24 = BoldFont(24)
96 let BoldFont_25 = BoldFont(25) 100 let BoldFont_25 = BoldFont(25)
97 let BoldFont_30 = BoldFont(30) 101 let BoldFont_30 = BoldFont(30)
98 102
metaCode/Classes/Environment/CNLiveEnvironment.swift
@@ -31,8 +31,10 @@ let APPBaseWjjUrl: String = CNLiveEnvironmentManager.shared.base_wjj_url @@ -31,8 +31,10 @@ let APPBaseWjjUrl: String = CNLiveEnvironmentManager.shared.base_wjj_url
31 let APPBaseWjjBUrl: String = CNLiveEnvironmentManager.shared.base_wjj_b_url 31 let APPBaseWjjBUrl: String = CNLiveEnvironmentManager.shared.base_wjj_b_url
32 /// 网家家内电商接口 32 /// 网家家内电商接口
33 let APPBaseWjjShopUrl: String = CNLiveEnvironmentManager.shared.base_mjj_shop_url 33 let APPBaseWjjShopUrl: String = CNLiveEnvironmentManager.shared.base_mjj_shop_url
34 -  
35 - 34 +/// 商家版电商接口
  35 +let APPBaseShopUrl: String = CNLiveEnvironmentManager.shared.base_shop_url
  36 +/// cms接口
  37 +let APPBaseCMSUrl: String = CNLiveEnvironmentManager.shared.base_cms_url
36 ///当前APP的环境 38 ///当前APP的环境
37 let APPCurrentEnvironment: CNLiveEnvironment = CNLiveEnvironmentManager.shared.currentEnvironment 39 let APPCurrentEnvironment: CNLiveEnvironment = CNLiveEnvironmentManager.shared.currentEnvironment
38 40
@@ -78,8 +80,12 @@ class CNLiveEnvironmentManager: NSObject{ @@ -78,8 +80,12 @@ class CNLiveEnvironmentManager: NSObject{
78 var img_token_url: String 80 var img_token_url: String
79 /// 网家家电商域名请求 81 /// 网家家电商域名请求
80 var base_mjj_shop_url: String 82 var base_mjj_shop_url: String
  83 + /// 电商域名请求
  84 + var base_shop_url: String
81 /// 元码webViewUA设置 85 /// 元码webViewUA设置
82 var base_web_UA: String = "yuanma" 86 var base_web_UA: String = "yuanma"
  87 + /// cms域名请求
  88 + var base_cms_url: String
83 89
84 ///当前环境 90 ///当前环境
85 var currentEnvironment: CNLiveEnvironment 91 var currentEnvironment: CNLiveEnvironment
@@ -99,6 +105,8 @@ class CNLiveEnvironmentManager: NSObject{ @@ -99,6 +105,8 @@ class CNLiveEnvironmentManager: NSObject{
99 self.base_wjj_url = "" 105 self.base_wjj_url = ""
100 self.base_wjj_b_url = "" 106 self.base_wjj_b_url = ""
101 self.base_mjj_shop_url = "" 107 self.base_mjj_shop_url = ""
  108 + self.base_shop_url = ""
  109 + self.base_cms_url = ""
102 self.currentEnvironment = .development 110 self.currentEnvironment = .development
103 } 111 }
104 //重新copy 和 mutableCopy 方法 112 //重新copy 和 mutableCopy 方法
@@ -140,6 +148,8 @@ class CNLiveEnvironmentManager: NSObject{ @@ -140,6 +148,8 @@ class CNLiveEnvironmentManager: NSObject{
140 self.base_wjj_b_url = "https://managemall.cnlive.com:8080" 148 self.base_wjj_b_url = "https://managemall.cnlive.com:8080"
141 self.base_wjj_url = "https://apiwjj.cnlive.com" 149 self.base_wjj_url = "https://apiwjj.cnlive.com"
142 self.base_mjj_shop_url = "https://manageshop.cnlive.com" 150 self.base_mjj_shop_url = "https://manageshop.cnlive.com"
  151 + self.base_shop_url = "https://managemall.cnlive.com:8080"
  152 + self.base_cms_url = "https://cmsapi.cnlive.com"
143 } 153 }
144 //testFlight 环境配置 154 //testFlight 环境配置
145 func testFlightEnvironment(){ 155 func testFlightEnvironment(){
@@ -156,6 +166,8 @@ class CNLiveEnvironmentManager: NSObject{ @@ -156,6 +166,8 @@ class CNLiveEnvironmentManager: NSObject{
156 self.base_wjj_b_url = "https://managemall.cnlive.com:8080" 166 self.base_wjj_b_url = "https://managemall.cnlive.com:8080"
157 self.base_wjj_url = "https://apiwjj.cnlive.com" 167 self.base_wjj_url = "https://apiwjj.cnlive.com"
158 self.base_mjj_shop_url = "https://manageshop.cnlive.com" 168 self.base_mjj_shop_url = "https://manageshop.cnlive.com"
  169 + self.base_shop_url = "https://managemall.cnlive.com:8080"
  170 + self.base_cms_url = "https://cmsapi.cnlive.com"
159 } 171 }
160 //production 生产环境配置 172 //production 生产环境配置
161 func productionEnvironment(){ 173 func productionEnvironment(){
@@ -172,6 +184,8 @@ class CNLiveEnvironmentManager: NSObject{ @@ -172,6 +184,8 @@ class CNLiveEnvironmentManager: NSObject{
172 self.base_wjj_b_url = "https://managemall.cnlive.com:8080" 184 self.base_wjj_b_url = "https://managemall.cnlive.com:8080"
173 self.base_wjj_url = "https://apiwjj.cnlive.com" 185 self.base_wjj_url = "https://apiwjj.cnlive.com"
174 self.base_mjj_shop_url = "https://manageshop.cnlive.com" 186 self.base_mjj_shop_url = "https://manageshop.cnlive.com"
  187 + self.base_shop_url = "https://managemall.cnlive.com:8080"
  188 + self.base_cms_url = "https://cmsapi.cnlive.com"
175 } 189 }
176 190
177 } 191 }
metaCode/Classes/Extensions/NSObject+CNLiveExtensions.swift
@@ -45,7 +45,6 @@ private func currentVC(_ vc :UIViewController?) -&gt; UIViewController? { @@ -45,7 +45,6 @@ private func currentVC(_ vc :UIViewController?) -&gt; UIViewController? {
45 } 45 }
46 } 46 }
47 47
48 -  
49 /// 弹框提示 48 /// 弹框提示
50 /// - Parameter message: 内容提示 49 /// - Parameter message: 内容提示
51 func showMessage(message: String) { 50 func showMessage(message: String) {
@@ -138,7 +137,7 @@ func jsonToModel(_ jsonStr:String,_ modelType:HandyJSON.Type) -&gt; BaseModel { @@ -138,7 +137,7 @@ func jsonToModel(_ jsonStr:String,_ modelType:HandyJSON.Type) -&gt; BaseModel {
138 /** 137 /**
139 * Json转数组对象 138 * Json转数组对象
140 */ 139 */
141 -func jsonArrayToModel(_ jsonArrayStr:String, _ modelType:HandyJSON.Type,_ path: String) ->[BaseModel] { 140 +func jsonArrayToModel(_ jsonArrayStr:String, _ modelType:HandyJSON.Type) ->[BaseModel] {
142 if jsonArrayStr == "" || jsonArrayStr.count == 0 { 141 if jsonArrayStr == "" || jsonArrayStr.count == 0 {
143 #if DEBUG 142 #if DEBUG
144 print("jsonToModelArray:字符串为空") 143 print("jsonToModelArray:字符串为空")
@@ -149,12 +148,24 @@ func jsonArrayToModel(_ jsonArrayStr:String, _ modelType:HandyJSON.Type,_ path: @@ -149,12 +148,24 @@ func jsonArrayToModel(_ jsonArrayStr:String, _ modelType:HandyJSON.Type,_ path:
149 let data = jsonArrayStr.data(using: String.Encoding.utf8) 148 let data = jsonArrayStr.data(using: String.Encoding.utf8)
150 let peoplesArray = try! JSONSerialization.jsonObject(with:data!, options: JSONSerialization.ReadingOptions()) as? [AnyObject] 149 let peoplesArray = try! JSONSerialization.jsonObject(with:data!, options: JSONSerialization.ReadingOptions()) as? [AnyObject]
151 for people in peoplesArray! { 150 for people in peoplesArray! {
152 - modelArray.append(dictionaryToModel(people as! [String : Any], modelType,path)) 151 + modelArray.append(newDictionaryToModel(people as! [String : Any], modelType))
153 } 152 }
154 return modelArray 153 return modelArray
155 154
156 } 155 }
157 /** 156 /**
  157 + * (新)字典转对象
  158 + */
  159 +func newDictionaryToModel(_ dictionStr:[String:Any],_ modelType:HandyJSON.Type) -> BaseModel {
  160 + if dictionStr.count == 0 {
  161 + #if DEBUG
  162 + print("dictionaryToModel:字符串为空")
  163 + #endif
  164 + return BaseModel()
  165 + }
  166 + return modelType.deserialize(from: dictionStr) as! BaseModel
  167 +}
  168 +/**
158 * 字典转对象 169 * 字典转对象
159 */ 170 */
160 func dictionaryToModel(_ dictionStr:[String:Any],_ modelType:HandyJSON.Type,_ path: String) -> BaseModel { 171 func dictionaryToModel(_ dictionStr:[String:Any],_ modelType:HandyJSON.Type,_ path: String) -> BaseModel {
metaCode/Classes/Extensions/String+Extension.swift 0 → 100644
  1 +//
  2 +// String+Extension.swift
  3 +// metaCode
  4 +//
  5 +// Created by zx on 2023/10/16.
  6 +//
  7 +
  8 +
  9 +import UIKit
  10 +
  11 +
  12 +extension String {
  13 + /// Calculate text's height from `width` and `front`.
  14 + func calculateHeightWith(width: CGFloat, font: UIFont)-> CGFloat {
  15 + let attr = [NSAttributedString.Key.font: font]
  16 + let maxSize: CGSize = CGSize(width: width, height: CGFloat(MAXFLOAT))
  17 + let option = NSStringDrawingOptions.usesLineFragmentOrigin
  18 + return self.boundingRect(with: (maxSize), options: option, attributes: attr, context: nil).size.height
  19 + }
  20 +}
metaCode/Classes/Extensions/UITableView+Extension.swift 0 → 100644
  1 +//
  2 +// UITableView+Extension.swift
  3 +// metaCode
  4 +//
  5 +// Created by zx on 2023/10/16.
  6 +//
  7 +
  8 +
  9 +import UIKit
  10 +
  11 +extension UITableView {
  12 + // 注册有nib的cell
  13 + func ut_registerNibCell<T>(_ cellType: T.Type) where T: UITableViewCell {
  14 + let nib = UINib(nibName: "\(cellType)", bundle: nil)
  15 + let identifier = "\(cellType)"
  16 + register(nib, forCellReuseIdentifier: identifier)
  17 + }
  18 + // 注册无nib的cell
  19 + func ut_registerClassCell<T>(_ cellType: T.Type) where T: UITableViewCell {
  20 + let identifier = "\(cellType)"
  21 + register(cellType, forCellReuseIdentifier: identifier)
  22 + }
  23 + // 从缓存池池出队已经存在的 cell
  24 + func ut_dequeueReusable<T: UITableViewCell>(_ cell: T.Type, for indexPath: IndexPath) -> T {
  25 + let cell = dequeueReusableCell(withIdentifier: "\(T.self)", for: indexPath) as! T
  26 + return cell
  27 + }
  28 +
  29 + // 注册有nib的headerFooterView
  30 + func ut_registerNibHeaderFooterView<T>(_ viewType: T.Type) where T: UITableViewHeaderFooterView {
  31 + let nib = UINib(nibName: "\(viewType)", bundle: nil)
  32 + let identifier = "\(viewType)"
  33 + register(nib, forHeaderFooterViewReuseIdentifier: identifier)
  34 + }
  35 +
  36 + // 注册无nib的headerFooterView
  37 + func ut_registerClassHeaderFooterView<T>(_ viewType: T.Type) where T: UITableViewHeaderFooterView {
  38 + let identifier = "\(viewType)"
  39 + register(viewType, forHeaderFooterViewReuseIdentifier: identifier)
  40 + }
  41 +
  42 + // 从缓存池里取出已注册的headerFooterView
  43 + func ut_dequeueReusableHeaderFooterView<T: UITableViewHeaderFooterView>(_ view: T.Type) -> T {
  44 + let headerFooterView = dequeueReusableHeaderFooterView(withIdentifier: "\(T.self)") as! T
  45 + return headerFooterView
  46 + }
  47 +}
  48 +
  49 +extension UICollectionView {
  50 + // 注册有nib的cell
  51 + func ut_registerNibCell<T>(_ cellType: T.Type) where T: UICollectionViewCell {
  52 + let nib = UINib(nibName: "\(cellType)", bundle: nil)
  53 + let identifier = "\(cellType)"
  54 + register(nib, forCellWithReuseIdentifier: identifier)
  55 + }
  56 + // 注册无nib的cell
  57 + func ut_registerClassCell<T>(_ cellType: T.Type) where T: UICollectionViewCell {
  58 + let identifier = "\(cellType)"
  59 + register(cellType, forCellWithReuseIdentifier: identifier)
  60 + }
  61 + // 从缓存池池出队已经存在的 cell
  62 + func ut_dequeueReusable<T: UICollectionViewCell>(_ cell: T.Type, for indexPath: IndexPath) -> T {
  63 + let cell = dequeueReusableCell(withReuseIdentifier: "\(T.self)", for: indexPath) as! T
  64 + return cell
  65 + }
  66 +}
metaCode/Classes/Extensions/UIView+CNLiveExtensions.swift
@@ -237,4 +237,14 @@ extension UIView { @@ -237,4 +237,14 @@ extension UIView {
237 return self.frame.size 237 return self.frame.size
238 } 238 }
239 } 239 }
  240 +
  241 + // Constrain 4 edges of `self` to specified `view`.
  242 + func edges(to view: UIView, top: CGFloat=0, left: CGFloat=0, bottom: CGFloat=0, right: CGFloat=0) {
  243 + NSLayoutConstraint.activate([
  244 + self.leftAnchor.constraint(equalTo: view.leftAnchor, constant: left),
  245 + self.rightAnchor.constraint(equalTo: view.rightAnchor, constant: right),
  246 + self.topAnchor.constraint(equalTo: view.topAnchor, constant: top),
  247 + self.bottomAnchor.constraint(equalTo: view.bottomAnchor, constant: bottom)
  248 + ])
  249 + }
240 } 250 }
metaCode/Classes/Main/HomePage/Controller/CNLiveDownShopDetailController.swift 0 → 100644
  1 +//
  2 +// CNLiveDownShopDetailController.swift
  3 +// metaCode
  4 +//
  5 +// Created by zx on 2023/10/31.
  6 +//
  7 +
  8 +import Foundation
  9 +
  10 +class CNLiveDownShopDetailController:CNLiveBaseViewController, UICollectionViewDelegate, UICollectionViewDataSource,UICollectionViewDelegateFlowLayout{
  11 +
  12 + let kCNLiveShopDetailDefaultCellID = "kCNLiveShopDetailDefaultCellID"
  13 + let kCNLiveShopDetailHeaderViewID = "kCNLiveShopDetailHeaderViewID"
  14 +
  15 + let kCNLiveShopDetailBannerCellID = "kCNLiveShopDetailBannerCellID"
  16 +
  17 +
  18 + lazy var shopDetailModel: CNLiveShopDetailModel = {
  19 + let shopDetailModel = CNLiveShopDetailModel()
  20 + return shopDetailModel
  21 + }()
  22 +
  23 + lazy var collectionView: UICollectionView = {
  24 + let layout = UICollectionViewFlowLayout.init()
  25 + let collectionView = UICollectionView(frame: .zero, collectionViewLayout: layout)
  26 + collectionView.delegate = self
  27 + collectionView.dataSource = self
  28 + collectionView.backgroundColor = .white
  29 +// collectionView.register(CNLiveShopConsoleHeaderView.self, forSupplementaryViewOfKind: UICollectionView.elementKindSectionHeader, withReuseIdentifier: kCNLiveShopConsoleCollectionReusableHeaderViewID)
  30 + collectionView.register(CNLliveShopDetailBannerCell.self, forCellWithReuseIdentifier: kCNLiveShopDetailBannerCellID)
  31 + collectionView.register(UICollectionViewCell.self, forCellWithReuseIdentifier: kCNLiveShopDetailDefaultCellID)
  32 +
  33 + return collectionView
  34 + }()
  35 +
  36 + override func viewDidLoad() {
  37 + super.viewDidLoad()
  38 + self.getShopDetailApi()
  39 +
  40 + self.view.addSubview(collectionView)
  41 + collectionView.snp.makeConstraints { make in
  42 + make.top.equalToSuperview().offset(KNavigationHeight)
  43 + make.left.bottom.right.equalToSuperview()
  44 + }
  45 + }
  46 +
  47 + // MARK: - UICollectionViewDelegate
  48 + func numberOfSections(in collectionView: UICollectionView) -> Int {
  49 + if self.shopDetailModel.is_seller != nil{
  50 + if self.shopDetailModel.is_seller == true{
  51 + return 5
  52 + }else{//非商家,不处理
  53 + return 3
  54 + }
  55 + }else{
  56 + return 1
  57 + }
  58 + }
  59 + func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
  60 + if self.shopDetailModel.is_seller != nil {
  61 + if (self.shopDetailModel.is_seller == true) {
  62 + if (section == 4) {
  63 + let count = self.shopDetailModel.dynamic.count
  64 + return count == 0 ? 1 : count
  65 + }else {
  66 + return 1
  67 + }
  68 + }else {
  69 + return 1
  70 + }
  71 + }else{
  72 + return 1
  73 + }
  74 + }
  75 +// func collectionView(_ collectionView: UICollectionView, viewForSupplementaryElementOfKind kind: String, at indexPath: IndexPath) -> UICollectionReusableView {
  76 +// if (kind == UICollectionView.elementKindSectionHeader){
  77 +// let headerView:CNLiveShopConsoleHeaderView = collectionView .dequeueReusableSupplementaryView(ofKind: UICollectionView.elementKindSectionHeader, withReuseIdentifier: kCNLiveShopDetailHeaderViewID, for: indexPath) as! CNLiveShopConsoleHeaderView
  78 +//
  79 +// return headerView
  80 +// }else{
  81 +// return
  82 +// }
  83 + func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
  84 + switch indexPath.section {
  85 + case 0:
  86 + let cell = collectionView.dequeueReusableCell(withReuseIdentifier: kCNLiveShopDetailBannerCellID, for: indexPath) as! CNLliveShopDetailBannerCell
  87 +
  88 + cell.shopDetailModel = self.shopDetailModel
  89 + return cell
  90 +// case 1:
  91 +//
  92 +// case 2:
  93 +// case 3:
  94 +// case 4:
  95 + default:
  96 + let cell = collectionView.dequeueReusableCell(withReuseIdentifier: kCNLiveShopDetailDefaultCellID, for: indexPath)
  97 + return cell
  98 + }
  99 +
  100 + }
  101 +
  102 + // MARK: - UICollectionViewDelegateFlowLayout
  103 + func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAt indexPath: IndexPath) -> CGSize {
  104 + if (self.shopDetailModel.is_seller != nil && self.shopDetailModel.is_seller == true) {
  105 + switch (indexPath.section) {
  106 + case 0:
  107 + return CGSize(width: KSreenWidth, height: CNLiveAdaptTool.adaptLength(length: 210))
  108 + case 1:
  109 + return CGSize(width: KSreenWidth, height: 50)
  110 + case 2:
  111 + return CGSize(width: KSreenWidth, height: 50)
  112 + case 3:
  113 + return CGSize(width: KSreenWidth, height: 50)
  114 + case 4:
  115 + return CGSize(width: KSreenWidth, height: 50)
  116 + default:
  117 + return CGSizeZero
  118 + }
  119 + }else {
  120 + return CGSizeZero
  121 +// switch (indexPath.section) {
  122 +// case 0:
  123 +// {
  124 +// if (self.mainHPModel.is_show_btn) {
  125 +// return CGSizeMake(self.view.width, DS_adapt_length(262));
  126 +// }else {
  127 +// return CGSizeMake(self.view.width, DS_adapt_length(262) - DS_adapt_length(50));
  128 +// }
  129 +// }
  130 +// break;
  131 +// case 1:
  132 +// {
  133 +// if (self.mainHPModel.is_show_btn) {
  134 +// return CGSizeMake(self.view.width, DS_adapt_length(145));
  135 +// }else {
  136 +// return CGSizeMake(self.view.width, 0.000001);
  137 +// }
  138 +// }
  139 +// break;
  140 +// case 2:
  141 +// {
  142 +// if (self.mainHPModel.is_show_user) {
  143 +// return CGSizeMake(self.view.width, DS_adapt_length(191));
  144 +// }else {
  145 +// return CGSizeMake(self.view.width, 0.000001);
  146 +// }
  147 +// }
  148 +// break;
  149 +// default:
  150 +// {
  151 +// return CGSizeZero;
  152 +// }
  153 +// break;
  154 +// }
  155 + }
  156 + }
  157 +
  158 + //MARK: - 网络请求获取店铺详情
  159 + func getShopDetailApi()
  160 + {
  161 + showLoading(message: "")
  162 + CNLiveShopDetailViewModel.requestShopDetailInfo(storeId: "") { result, status in
  163 + hiddenLoading()
  164 + if status == .success{
  165 + let model = result as! CNLiveShopDetailModel
  166 + self.shopDetailModel = model
  167 + self.collectionView.reloadData()
  168 + }else if (status == .failed){
  169 +// self.NetApiStatus = .apiError
  170 + }else if (status == .noNetwork){
  171 +
  172 +// self.NetApiStatus = .notNetwork
  173 + }
  174 + }
  175 + }
  176 +}
metaCode/Classes/Main/HomePage/Controller/CNLiveShopConsoleController.swift 0 → 100644
  1 +//
  2 +// CNLiveShopConsoleController.swift
  3 +// metaCode
  4 +//
  5 +// Created by zx on 2023/10/27.
  6 +//
  7 +
  8 +import Foundation
  9 +
  10 +class CNLiveShopConsoleController: CNLiveBaseViewController, UICollectionViewDelegate, UICollectionViewDataSource {
  11 +
  12 + let kCNLiveShopConsoleCellKey = "kCNLiveShopConsoleCellKey"
  13 +
  14 + let kCNLiveShopConsoleCollectionReusableHeaderViewID = "kCNLiveShopConsoleCollectionReusableHeaderViewID"
  15 + let kCNLiveShopConsoleCollectionReusableFooterViewID = "kCNLiveShopConsoleCollectionReusableFooterViewID"
  16 +
  17 + lazy var collectionView: UICollectionView = {
  18 + let gap = CGFloat(15)
  19 + let layout = UICollectionViewFlowLayout.init()
  20 + layout.itemSize = CGSize(width: (KSreenWidth - gap*2-10)/2, height: 72)
  21 + layout.sectionInset = .init(top: gap, left: gap, bottom: gap, right: gap)
  22 + layout.headerReferenceSize = CGSize(width: KSreenWidth, height: 20)
  23 + let collectionView = UICollectionView(frame: .zero, collectionViewLayout: layout)
  24 + collectionView.delegate = self
  25 + collectionView.dataSource = self
  26 + collectionView.backgroundColor = .clear
  27 + collectionView.register(CNLiveShopConsoleHeaderView.self, forSupplementaryViewOfKind: UICollectionView.elementKindSectionHeader, withReuseIdentifier: kCNLiveShopConsoleCollectionReusableHeaderViewID)
  28 + collectionView.register(CNLiveShopConsoleCell.self, forCellWithReuseIdentifier: kCNLiveShopConsoleCellKey)
  29 + return collectionView
  30 + }()
  31 +
  32 + lazy var dataModel: CNLiveShopConsoleModel = {
  33 + let dataModel = CNLiveShopConsoleModel()
  34 + return dataModel
  35 + }()
  36 +
  37 + override func viewDidLoad() {
  38 + super.viewDidLoad()
  39 + self.view.backgroundColor = .clear
  40 + self.getPageApi()
  41 +
  42 + view.addSubview(collectionView)
  43 + collectionView.snp.makeConstraints { make in
  44 + make.top.equalToSuperview().offset(KNavigationHeight)
  45 + make.left.bottom.right.equalToSuperview()
  46 + }
  47 + }
  48 +
  49 + // MARK: - UICollectionViewDelegate
  50 + func numberOfSections(in collectionView: UICollectionView) -> Int {
  51 + return self.dataModel.list.count
  52 + }
  53 + func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
  54 + let listMdl = self.dataModel.list[section]
  55 + return listMdl.list.count
  56 + }
  57 + func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
  58 + let cell = collectionView.dequeueReusableCell(withReuseIdentifier: kCNLiveShopConsoleCellKey, for: indexPath) as! CNLiveShopConsoleCell
  59 + let listMdl = self.dataModel.list[indexPath.section]
  60 + let model = listMdl.list[indexPath.item]
  61 + cell.shopListContentModel = model
  62 + return cell
  63 + }
  64 +// func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, referenceSizeForHeaderInSection section: Int) -> CGSize {
  65 +// if (section == 0) {
  66 +// return CGSizeMake(self.view.width, 33);
  67 +// }else {
  68 +// return CGSizeMake(self.view.width, 33);
  69 +// }
  70 +// }
  71 +
  72 + func collectionView(_ collectionView: UICollectionView, viewForSupplementaryElementOfKind kind: String, at indexPath: IndexPath) -> UICollectionReusableView {
  73 + if (kind == UICollectionView.elementKindSectionHeader){
  74 + let sectionMdl = self.dataModel.list[indexPath.section]
  75 + let headerView:CNLiveShopConsoleHeaderView = collectionView .dequeueReusableSupplementaryView(ofKind: UICollectionView.elementKindSectionHeader, withReuseIdentifier: kCNLiveShopConsoleCollectionReusableHeaderViewID, for: indexPath) as! CNLiveShopConsoleHeaderView
  76 + headerView.height = 24
  77 + headerView.title = sectionMdl.title
  78 + return headerView
  79 + }else {
  80 + let footer = collectionView .dequeueReusableSupplementaryView(ofKind: UICollectionView.elementKindSectionFooter, withReuseIdentifier: kCNLiveShopConsoleCollectionReusableFooterViewID, for: indexPath)
  81 + return footer
  82 + }
  83 + }
  84 +
  85 + func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) {
  86 + let listMdl = self.dataModel.list[indexPath.section]
  87 + let itemModel = listMdl.list[indexPath.item]
  88 + if itemModel.type == CNLiveShopConsoleType.XZSP.rawValue{
  89 + //商城新增商品
  90 +
  91 + }else if itemModel.type == CNLiveShopConsoleType.SPGL.rawValue{
  92 + //商城商品管理
  93 +
  94 + }else if itemModel.type == CNLiveShopConsoleType.XZYHQ.rawValue{
  95 + //新增优惠券
  96 +
  97 + }else if itemModel.type == CNLiveShopConsoleType.GLYHQ.rawValue{
  98 + //优惠券管理
  99 +
  100 + }else if itemModel.type == CNLiveShopConsoleType.CreateShopClassify.rawValue{
  101 + //创建店铺分类
  102 +
  103 + }else if itemModel.type == CNLiveShopConsoleType.ShopClassifyManager.rawValue{
  104 + //店铺分类管理
  105 +
  106 + }else if itemModel.type == CNLiveShopConsoleType.FBDT.rawValue{
  107 + //发布动态
  108 +
  109 + }else if itemModel.type == CNLiveShopConsoleType.DTGL.rawValue{
  110 + //动态管理
  111 +
  112 + }else if itemModel.type == CNLiveShopConsoleType.DDGL.rawValue{
  113 + //订单管理
  114 +
  115 + }
  116 +// else if itemModel.type == CNLiveShopConsoleType.SH.rawValue{
  117 +// //退款/售后
  118 +//
  119 +// }
  120 + else if itemModel.type == CNLiveShopConsoleType.JYJL.rawValue{
  121 + //交易记录
  122 +
  123 + }else if itemModel.type == CNLiveShopConsoleType.OnManagerment.rawValue{
  124 + //直播管理
  125 +
  126 + }
  127 + }
  128 +
  129 + //MARK: - 网络请求获取详情页
  130 + func getPageApi()
  131 + {
  132 + showLoading(message: "")
  133 + CNLiveShopConsoleViewModel.requestUserInfo() { result, status in
  134 + hiddenLoading()
  135 +
  136 + if status == .success{
  137 + let shopUserModel = result as! CNLiveShopUserInfoModel
  138 + if shopUserModel.type != "3"{
  139 + //type 1商家或者8达人
  140 + let shopConsoleModel = CNLiveShopConsoleModel()
  141 + shopConsoleModel.initDataSource()
  142 + self.dataModel = shopConsoleModel
  143 + self.collectionView.reloadData()
  144 + }
  145 + }else if (status == .failed){
  146 +// self.NetApiStatus = .apiError
  147 + }else if (status == .noNetwork){
  148 +
  149 +// self.NetApiStatus = .notNetwork
  150 + }
  151 + }
  152 +//
  153 + }
  154 +}
metaCode/Classes/Main/HomePage/Controller/CNMetaCodeHomePageController.swift
@@ -18,6 +18,8 @@ let LeftGap: CGFloat = UIScreen.main.bounds.size.width &lt;= 375 ? 23 : 40 @@ -18,6 +18,8 @@ let LeftGap: CGFloat = UIScreen.main.bounds.size.width &lt;= 375 ? 23 : 40
18 18
19 ///主窗口宽度 19 ///主窗口宽度
20 let MainViewW: CGFloat = Width-LeftGap*2//Width-50 20 let MainViewW: CGFloat = Width-LeftGap*2//Width-50
  21 +///下滑页底部工具条高度
  22 +let DownSlideBottomViewHeight: CGFloat = 74
21 23
22 ///存储是否第一次显示首页上滑引导 24 ///存储是否第一次显示首页上滑引导
23 let CNKeyIsFirstAppearUpSlideHomeGuide: String = "isFirstAppearUpSlideHomeGuideKey" 25 let CNKeyIsFirstAppearUpSlideHomeGuide: String = "isFirstAppearUpSlideHomeGuideKey"
@@ -383,13 +385,24 @@ class CNMetaCodeHomePageController:CNLiveBaseViewController, NewPagedFlowViewDel @@ -383,13 +385,24 @@ class CNMetaCodeHomePageController:CNLiveBaseViewController, NewPagedFlowViewDel
383 bannerView?.layer.cornerRadius = 4 385 bannerView?.layer.cornerRadius = 4
384 bannerView?.layer.masksToBounds = false 386 bannerView?.layer.masksToBounds = false
385 } 387 }
  388 + let identityModel = dataArray[index] as! StandListModel
  389 + bannerView?.idModel = identityModel
  390 + if (identityModel.auth == true){
  391 + bannerView?.baseScrollView.isScrollEnabled = true
  392 + }else{
  393 + if (identityModel.downType == 3 || identityModel.downType == 4 || identityModel.upType == 3 || identityModel.upType == 4)
  394 + {
  395 +// bannerView?.baseScrollView.isScrollEnabled = false
  396 + }else{
  397 + bannerView?.baseScrollView.isScrollEnabled = true
  398 + }
  399 + }
  400 +
386 bannerView?.superScrollView = flowView.scrollView 401 bannerView?.superScrollView = flowView.scrollView
387 bannerView?.associatedVCView = self.view 402 bannerView?.associatedVCView = self.view
388 bannerView?.delegate = self 403 bannerView?.delegate = self
389 bannerView?.upSlideView.webView.navigationDelegate = self 404 bannerView?.upSlideView.webView.navigationDelegate = self
390 bannerView?.downSlideView.webView.navigationDelegate = self 405 bannerView?.downSlideView.webView.navigationDelegate = self
391 - let identityModel = dataArray[index] as! StandListModel  
392 - bannerView?.idModel = identityModel  
393 return bannerView 406 return bannerView
394 } 407 }
395 408
@@ -557,7 +570,7 @@ class CNMetaCodeHomePageController:CNLiveBaseViewController, NewPagedFlowViewDel @@ -557,7 +570,7 @@ class CNMetaCodeHomePageController:CNLiveBaseViewController, NewPagedFlowViewDel
557 print(url) 570 print(url)
558 if(navigationAction.navigationType == .linkActivated){ 571 if(navigationAction.navigationType == .linkActivated){
559 let webVC = CNWebViewController() 572 let webVC = CNWebViewController()
560 - webVC.url = url 573 + webVC.url = URL(string: url)
561 currentViewController()?.navigationController?.pushViewController(webVC, animated: true) 574 currentViewController()?.navigationController?.pushViewController(webVC, animated: true)
562 decisionHandler(.cancel, preferences) 575 decisionHandler(.cancel, preferences)
563 return 576 return
metaCode/Classes/Main/HomePage/Controller/CNSlideBaseNavigationController.swift 0 → 100644
  1 +//
  2 +// CNSlideBaseNavigationController.swift
  3 +// metaCode
  4 +//
  5 +// Created by zx on 2023/10/26.
  6 +//
  7 +
  8 +import Foundation
  9 +
  10 +class CNSlideBaseNavigationController: UINavigationController
  11 + ,UIViewControllerTransitioningDelegate {
  12 + var dismissClosure: (()->())?
  13 + override func viewDidLoad() {
  14 + super.viewDidLoad()
  15 + modalPresentationStyle = .custom
  16 + transitioningDelegate = self
  17 + }
  18 +
  19 + func animationController(forPresented presented: UIViewController, presenting: UIViewController, source: UIViewController) -> UIViewControllerAnimatedTransitioning? {
  20 + return CNUpSlideAnimationTransition(animationType: .present)
  21 + }
  22 +
  23 + func animationController(forDismissed dismissed: UIViewController) -> UIViewControllerAnimatedTransitioning? {
  24 + return CNUpSlideAnimationTransition(animationType: .dismiss)
  25 + }
  26 +
  27 + func presentationController(forPresented presented: UIViewController, presenting: UIViewController?, source: UIViewController) -> UIPresentationController? {
  28 + return CNUpSlideCardPresentationController(presentedViewController: presented, presenting: presenting)
  29 + }
  30 +}
metaCode/Classes/Main/HomePage/Controller/CNUpSlideCardPresentationController.swift 0 → 100644
  1 +//
  2 +// CNUpSlideCardPresentationController.swift
  3 +// metaCode
  4 +//
  5 +// Created by zx on 2023/10/16.
  6 +//
  7 +
  8 +import UIKit
  9 +
  10 +class CNUpSlideCardPresentationController: UIPresentationController {
  11 +
  12 + private lazy var blurView = UIVisualEffectView(effect: nil)
  13 +
  14 + override var shouldRemovePresentersView: Bool {
  15 + return false
  16 + }
  17 +
  18 + override func presentationTransitionWillBegin() {
  19 + let container = containerView!
  20 + blurView.translatesAutoresizingMaskIntoConstraints = false
  21 + container.addSubview(blurView)
  22 + blurView.edges(to: container)
  23 + blurView.alpha = 0.0
  24 +
  25 + presentingViewController.beginAppearanceTransition(false, animated: false)
  26 + presentedViewController.transitionCoordinator!.animate(alongsideTransition: { (ctx) in
  27 + self.blurView.effect = UIBlurEffect(style: .light)
  28 + self.blurView.alpha = 1
  29 + }) { (ctx) in }
  30 + }
  31 +
  32 + override func presentationTransitionDidEnd(_ completed: Bool) {
  33 + presentingViewController.endAppearanceTransition()
  34 + }
  35 +
  36 + override func dismissalTransitionWillBegin() {
  37 + presentingViewController.beginAppearanceTransition(true, animated: true)
  38 + presentedViewController.transitionCoordinator!.animate(alongsideTransition: { (ctx) in
  39 + self.blurView.alpha = 0.0
  40 + }, completion: nil)
  41 + }
  42 +
  43 + override func dismissalTransitionDidEnd(_ completed: Bool) {
  44 + presentingViewController.endAppearanceTransition()
  45 + if completed {
  46 + blurView.removeFromSuperview()
  47 + }
  48 + }
  49 +}
metaCode/Classes/Main/HomePage/Controller/CNUpSlideDetailViewController.swift 0 → 100644
  1 +//
  2 +// CNUpSlideDetailViewController.swift
  3 +// metaCode
  4 +//
  5 +// Created by zx on 2023/10/16.
  6 +//
  7 +
  8 +import Foundation
  9 +
  10 +class CNUpSlideDetailViewController: CNLiveBaseViewController {
  11 +
  12 + //slideModel
  13 + var _slideModel : CNLiveDownSlideModel?
  14 + var slideModel : CNLiveDownSlideModel? {
  15 + get{
  16 + _slideModel
  17 + }
  18 + set{
  19 + _slideModel = newValue!
  20 + }
  21 + }
  22 +
  23 + var dismissClosure: (()->())?
  24 + //the point when start to interactive
  25 + var interactiveStartingPoint: CGPoint? = nil
  26 +
  27 + var draggingDownToDismiss = false
  28 +
  29 + let cell: CNDownSlideSingleCourseCell!
  30 +
  31 + private lazy var dismissPanGesture: UIPanGestureRecognizer = {
  32 + let ges = UIPanGestureRecognizer()
  33 + ges.maximumNumberOfTouches = 1
  34 + ges.addTarget(self, action: #selector(handleDismissPan(gesture:)))
  35 + ges.delegate = self
  36 + return ges
  37 + }()
  38 +
  39 + lazy var scrollView: CNUpSlideDetailScrollView = {
  40 + let frame = self.view.bounds
  41 + let view = CNUpSlideDetailScrollView(frame: frame)
  42 + view.callBack = {(contentMdl:CNLiveDownSlideContentsModel)->Void in
  43 + CNLiveDownSlideTool.detailPushWebVCWithContentsMdl(contentMdl: contentMdl, viewController: self)
  44 + }
  45 + view.delegate = self
  46 + return view
  47 + }()
  48 +
  49 + lazy var closeBtn: UIButton = {
  50 + let btn = UIButton()
  51 + btn.frame = CGRect(x: KSreenWidth - 20 - 30, y: 20, width: 30, height: 30)
  52 + btn.setImage(#imageLiteral(resourceName: "close_button"), for: .normal)
  53 + btn.addTarget(self, action: #selector(closeAction), for: .touchUpInside)
  54 + return btn
  55 + }()
  56 +
  57 + init(cell: CNDownSlideSingleCourseCell,slideModel:CNLiveDownSlideModel) {
  58 + self.cell = cell
  59 + super.init(nibName: nil, bundle: nil)
  60 + self.slideModel = slideModel
  61 + self.setupTranstion()
  62 + setNeedsStatusBarAppearanceUpdate()
  63 + }
  64 +
  65 + private func setupTranstion() {
  66 + modalPresentationStyle = .custom
  67 + transitioningDelegate = self
  68 + }
  69 +
  70 + required init?(coder aDecoder: NSCoder) {
  71 + fatalError("init(coder:) has not been implemented")
  72 + }
  73 +
  74 + override func viewDidLoad() {
  75 + super.viewDidLoad()
  76 + setupUI()
  77 + getImageFromCell()
  78 + }
  79 +
  80 + private func setupUI() {
  81 + self.view.layer.masksToBounds = true
  82 + view.addSubview(scrollView)
  83 + scrollView.slideModel = _slideModel
  84 + view.addSubview(closeBtn)
  85 + view.addGestureRecognizer(dismissPanGesture)
  86 +
  87 + if #available(iOS 11.0, *) {
  88 + scrollView.contentInsetAdjustmentBehavior = .never
  89 + } else {
  90 + automaticallyAdjustsScrollViewInsets = false
  91 + }
  92 + }
  93 +
  94 + private func getImageFromCell() {
  95 + scrollView.imageView.image = cell.bgImageView.image
  96 + }
  97 +
  98 + @objc private func closeAction() {
  99 + dismiss(animated: true, completion: nil)
  100 + let nav = self.navigationController as! CNSlideBaseNavigationController
  101 + nav.dismissClosure?()
  102 + }
  103 +
  104 + @objc private func handleDismissPan(gesture: UIPanGestureRecognizer) {
  105 + if !draggingDownToDismiss {
  106 + return
  107 + }
  108 +
  109 + let startingPoint: CGPoint
  110 +
  111 + if let p = interactiveStartingPoint {
  112 + startingPoint = p
  113 + } else {
  114 + startingPoint = gesture.location(in: nil)
  115 + interactiveStartingPoint = startingPoint
  116 + }
  117 +
  118 + let currentLocation = gesture.location(in: nil)
  119 +
  120 + var progress = (currentLocation.y - startingPoint.y) / 100
  121 +
  122 + //prevent viewController bigger when scrolling up
  123 + if currentLocation.y <= startingPoint.y {
  124 + progress = 0
  125 + }
  126 +
  127 + if progress >= 1.0 {
  128 + dismiss(animated: true, completion: nil)
  129 + let nav = self.navigationController as! CNSlideBaseNavigationController
  130 + nav.dismissClosure?()
  131 +// dismissClosure?()
  132 + stopDismissPanGesture(gesture)
  133 + return
  134 + }
  135 +
  136 + let targetShrinkScale: CGFloat = 0.86
  137 + let currentScale: CGFloat = 1 - (1 - targetShrinkScale) * progress
  138 +
  139 + switch gesture.state {
  140 + case .began,.changed:
  141 + scrollView.isScrollEnabled = false
  142 + gesture.view?.transform = CGAffineTransform(scaleX: currentScale, y: currentScale)
  143 + gesture.view?.layer.cornerRadius = GlobalConstants.toDayCardCornerRadius * (progress)
  144 + scrollView.showsVerticalScrollIndicator = false
  145 + case .cancelled,.ended:
  146 + scrollView.isScrollEnabled = true
  147 + stopDismissPanGesture(gesture)
  148 + default:
  149 + break
  150 + }
  151 + }
  152 +
  153 + //当下拉Offset超过100或取消下拉手势时,执行此方法
  154 + private func stopDismissPanGesture(_ gesture: UIPanGestureRecognizer) {
  155 + draggingDownToDismiss = false
  156 + interactiveStartingPoint = nil
  157 + scrollView.showsVerticalScrollIndicator = true
  158 +
  159 + UIView.animate(withDuration: 0.2) {
  160 + gesture.view?.transform = CGAffineTransform.identity
  161 + }
  162 + }
  163 +
  164 +}
  165 +
  166 +extension CNUpSlideDetailViewController: UIViewControllerTransitioningDelegate {
  167 +
  168 + func animationController(forPresented presented: UIViewController, presenting: UIViewController, source: UIViewController) -> UIViewControllerAnimatedTransitioning? {
  169 + return CNUpSlideAnimationTransition(animationType: .present)
  170 + }
  171 +
  172 + func animationController(forDismissed dismissed: UIViewController) -> UIViewControllerAnimatedTransitioning? {
  173 + return CNUpSlideAnimationTransition(animationType: .dismiss)
  174 + }
  175 +
  176 + func presentationController(forPresented presented: UIViewController, presenting: UIViewController?, source: UIViewController) -> UIPresentationController? {
  177 + return CNUpSlideCardPresentationController(presentedViewController: presented, presenting: presenting)
  178 + }
  179 +}
  180 +
  181 +extension CNUpSlideDetailViewController: UIScrollViewDelegate {
  182 + func scrollViewDidScroll(_ scrollView: UIScrollView) {
  183 +
  184 + if scrollView.contentOffset.y < 0 {
  185 + scrollView.contentOffset = .zero
  186 + draggingDownToDismiss = true
  187 + }
  188 + }
  189 +}
  190 +
  191 +extension CNUpSlideDetailViewController: UIGestureRecognizerDelegate {
  192 + func gestureRecognizer(_ gestureRecognizer: UIGestureRecognizer, shouldRecognizeSimultaneouslyWith otherGestureRecognizer: UIGestureRecognizer) -> Bool {
  193 + return true
  194 + }
  195 +}
metaCode/Classes/Main/HomePage/Controller/CNUpSlideViewController.swift 0 → 100644
  1 +//
  2 +// CNUpSlideViewController.swift
  3 +// metaCode
  4 +//
  5 +// Created by zx on 2023/10/13.
  6 +//
  7 +
  8 +import Foundation
  9 +import UIKit
  10 +
  11 +//下滑tableview背景颜色
  12 +let kCNDownSlideBackgroundColorHex: String = "#F7F8FA"
  13 +
  14 +///CNliveDownSlideModel Type
  15 +let SlideModelTypeRecommend4: String = "4"//4一排两个 推荐课程&推荐活动
  16 +let SlideModelTypeTodayRecommend74: String = "74"//74今日推荐
  17 +let SlideModelTypeAllCourse12: String = "12"//12列表全部课程
  18 +let SlideModelTypeOneCourse75: String = "75"//75单课程大图
  19 +
  20 +class CNUpSlideViewController: CNLiveBaseViewController,UITableViewDelegate,UITableViewDataSource{
  21 +
  22 + let kCNLiveDownSlideCellIdentifier = "kCNLiveDownSlideCellIdentifier"
  23 + let kCNLiveDownSlideRecommendCellIdentifier = "kCNLiveDownSlideRecommendCellIdentifier"
  24 + let kCNLiveDownSlideTodayRecommendCellIdentifier = "kCNLiveDownSlideTodayRecommendCellIdentifier"
  25 +
  26 + var totolNum = 0//一共显示多少行cell
  27 +
  28 + var selectedCell: CNDownSlideSingleCourseCell?
  29 +
  30 + var statusBarShouldBeHidden = false
  31 + //we need to set `View controller-based status bar appearance = YES` in info.plist.
  32 + //so we can be able to hide statusBar.
  33 + override var prefersStatusBarHidden: Bool {
  34 + return statusBarShouldBeHidden
  35 + }
  36 +
  37 + override var preferredStatusBarUpdateAnimation: UIStatusBarAnimation {
  38 + return .slide
  39 + }
  40 +
  41 + var _downPath:String?
  42 + var downPath:String? {
  43 + get{
  44 + return _downPath
  45 + }
  46 + set{
  47 + _downPath = newValue!
  48 + self.getPageApi()
  49 + }
  50 + }
  51 +
  52 + // MARK: - 懒加载
  53 + ///数据源
  54 + lazy var dataArray: NSMutableArray = {
  55 + var dataArray = NSMutableArray()
  56 + return dataArray
  57 + }()
  58 +
  59 + override func viewWillAppear(_ animated: Bool) {
  60 + super.viewWillAppear(animated)
  61 + self.updateStatusBarAndTabbarFrame(visible: true)
  62 + }
  63 +
  64 + override func viewDidLoad() {
  65 + super.viewDidLoad()
  66 + self.view.backgroundColor = HexColor(kCNDownSlideBackgroundColorHex)
  67 + view.addSubview(tableView)
  68 + tableView.frame = CGRect(x: 0, y: KStatusBarHeight, width: KSreenWidth, height: KSreenHeight-DownSlideBottomViewHeight-KStatusBarHeight)
  69 + }
  70 +
  71 + lazy var tableView : UITableView = {
  72 + let tableView = UITableView(frame: .zero, style: .plain)
  73 + tableView.dataSource = self
  74 + tableView.delegate = self
  75 + tableView.separatorStyle = .none
  76 + tableView.register(CNDownSlideSingleCourseCell.self, forCellReuseIdentifier: kCNLiveDownSlideCellIdentifier)
  77 + tableView.backgroundColor = HexColor(kCNDownSlideBackgroundColorHex)
  78 + return tableView
  79 + }()
  80 +
  81 + private func updateStatusBarAndTabbarFrame(visible: Bool) {
  82 + statusBarShouldBeHidden = !visible
  83 + UIView.animate(withDuration: 0.25) {
  84 + self.setNeedsStatusBarAppearanceUpdate()
  85 + }
  86 + }
  87 +
  88 + // MARK: - UITableViewDelegate
  89 + func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
  90 +
  91 + self.dataArray.count
  92 + }
  93 +
  94 + func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
  95 +
  96 + let slideModel = self.dataArray[indexPath.row] as! CNLiveDownSlideModel
  97 +
  98 + //type=4一排两个 推荐课程&推荐活动; 74今日推荐; 12列表全部课程; 75单课程大图
  99 + if slideModel.type == SlideModelTypeRecommend4{
  100 + guard let cell = tableView.dequeueReusableCell(withIdentifier: kCNLiveDownSlideRecommendCellIdentifier) as? CNLiveDownSlideRecommendCell
  101 + else {
  102 + let cell = CNLiveDownSlideRecommendCell()
  103 + cell.slideModel = slideModel
  104 + return cell
  105 + }
  106 + cell.slideModel = slideModel
  107 + return cell
  108 + }else if slideModel.type == SlideModelTypeTodayRecommend74{
  109 + guard let cell = tableView.dequeueReusableCell(withIdentifier: kCNLiveDownSlideTodayRecommendCellIdentifier) as? CNLiveDownSlideTodayRecommendCell
  110 + else {
  111 + let cell = CNLiveDownSlideTodayRecommendCell()
  112 + cell.slideModel = slideModel
  113 + return cell
  114 + }
  115 + cell.slideModel = slideModel
  116 + return cell
  117 + }else if slideModel.type == SlideModelTypeAllCourse12{
  118 + guard let cell = tableView.dequeueReusableCell(withIdentifier: kCNLiveDownSlideCellIdentifier) as? CNDownSlideSingleCourseCell
  119 + else {
  120 + let cell = CNDownSlideSingleCourseCell()
  121 + cell.slideModel = slideModel
  122 + return cell
  123 + }
  124 + cell.slideModel = slideModel
  125 + return cell
  126 + }else if slideModel.type == SlideModelTypeOneCourse75{
  127 + guard let cell = tableView.dequeueReusableCell(withIdentifier: kCNLiveDownSlideCellIdentifier) as? CNDownSlideSingleCourseCell
  128 + else {
  129 + let cell = CNDownSlideSingleCourseCell()
  130 + cell.slideModel = slideModel
  131 + return cell
  132 + }
  133 + cell.slideModel = slideModel
  134 + return cell
  135 + }else{
  136 + return UITableViewCell()
  137 + }
  138 + }
  139 +
  140 +
  141 + func tableView(_ tableView: UITableView, didHighlightRowAt indexPath: IndexPath) {
  142 + guard let row = tableView.cellForRow(at: indexPath) as? CNDownSlideSingleCourseCell else { return }
  143 + UIView.animate(withDuration: 0.1) {
  144 + row.bgBackView.transform = CGAffineTransform(scaleX: 0.95, y: 0.95)
  145 + }
  146 + }
  147 +
  148 + func tableView(_ tableView: UITableView, didUnhighlightRowAt indexPath: IndexPath) {
  149 + guard let row = tableView.cellForRow(at: indexPath) as? CNDownSlideSingleCourseCell else { return }
  150 + UIView.animate(withDuration: 0.3) {
  151 + row.bgBackView.transform = CGAffineTransform(scaleX: 1.0, y: 1.0)
  152 + }
  153 + }
  154 +
  155 + func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
  156 +
  157 + let slideModel = self.dataArray[indexPath.row] as! CNLiveDownSlideModel
  158 + //type=4一排两个 推荐课程&推荐活动; 74今日推荐; 12列表全部课程; 75单课程大图
  159 + if slideModel.type == SlideModelTypeRecommend4{
  160 +
  161 + }else if slideModel.type == SlideModelTypeTodayRecommend74{
  162 +
  163 + }else if slideModel.type == SlideModelTypeAllCourse12{
  164 + guard let cell = tableView.cellForRow(at: indexPath) as? CNDownSlideSingleCourseCell else { return }
  165 + selectedCell = cell
  166 + let detailVC = CNSlideBaseNavigationController(rootViewController: CNUpSlideDetailViewController(cell: cell,slideModel: slideModel))
  167 + detailVC.dismissClosure = { [weak self] in
  168 + guard let StrongSelf = self else { return }
  169 + StrongSelf.updateStatusBarAndTabbarFrame(visible: true)
  170 + }
  171 + updateStatusBarAndTabbarFrame(visible: false)
  172 +
  173 + present(detailVC, animated: true, completion: nil)
  174 + }else if slideModel.type == SlideModelTypeOneCourse75{
  175 + guard let cell = tableView.cellForRow(at: indexPath) as? CNDownSlideSingleCourseCell else { return }
  176 + selectedCell = cell
  177 +
  178 + let detailVC = CNSlideBaseNavigationController(rootViewController: CNUpSlideDetailViewController(cell: cell,slideModel: slideModel))
  179 +
  180 + detailVC.dismissClosure = { [weak self] in
  181 + guard let StrongSelf = self else { return }
  182 + StrongSelf.updateStatusBarAndTabbarFrame(visible: true)
  183 + }
  184 + updateStatusBarAndTabbarFrame(visible: false)
  185 + present(detailVC, animated: true, completion: nil)
  186 + }
  187 + }
  188 +
  189 + func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat {
  190 + let slideModel = self.dataArray[indexPath.row] as! CNLiveDownSlideModel
  191 + return CGFloat(slideModel.cellH)
  192 + }
  193 +
  194 + func tableView(_ tableView: UITableView, heightForFooterInSection section: Int) -> CGFloat {
  195 + return 0
  196 + }
  197 + func tableView(_ tableView: UITableView, heightForHeaderInSection section: Int) -> CGFloat {
  198 + return 0
  199 + }
  200 + //MARK: - 网络请求获取详情页
  201 + func getPageApi()
  202 + {
  203 + showLoading(message: "")
  204 + CNLiveDownSlideViewModel.requestGetPage(pageId: _downPath! as NSString) { result, status in
  205 + hiddenLoading()
  206 +
  207 + if status == .success{
  208 + self.dataArray.addObjects(from: result as! [Any])
  209 + let newDataArray = NSMutableArray()
  210 + for slideModel in self.dataArray {
  211 + if let model = slideModel as? CNLiveDownSlideModel{
  212 +
  213 + let layout = CNLiveDownSlideModelLayout.init(model: model)
  214 + newDataArray.addObjects(from: [layout.getCellHModel()])
  215 + }
  216 + }
  217 + self.dataArray.removeAllObjects()
  218 + self.dataArray.addObjects(from: newDataArray as! [Any])
  219 +
  220 + self.tableView.reloadData()
  221 + }else if (status == .failed){
  222 +// self.NetApiStatus = .apiError
  223 + }else if (status == .noNetwork){
  224 +
  225 +// self.NetApiStatus = .notNetwork
  226 + }
  227 + }
  228 +//
  229 + }
  230 +}
metaCode/Classes/Main/HomePage/Controller/CNWebViewController.swift
@@ -18,15 +18,15 @@ class CNWebViewController:CNLiveBaseViewController ,WKNavigationDelegate{ @@ -18,15 +18,15 @@ class CNWebViewController:CNLiveBaseViewController ,WKNavigationDelegate{
18 return webView 18 return webView
19 }() 19 }()
20 20
21 - var _url:String?  
22 - var url:String? { 21 + var _url:URL?
  22 + var url:URL? {
23 get{ 23 get{
24 return _url 24 return _url
25 } 25 }
26 set{ 26 set{
27 _url = newValue! 27 _url = newValue!
28 - if (_url != ""){  
29 - let webUrl: URL! = URL.init(string: _url!) 28 + if (_url != nil){
  29 + let webUrl: URL! = _url!
30 webView.evaluateJavaScript("navigator.userAgent") { [self] result, error in 30 webView.evaluateJavaScript("navigator.userAgent") { [self] result, error in
31 let userAgent = result as! String 31 let userAgent = result as! String
32 if error == nil && userAgent.count > 0 { 32 if error == nil && userAgent.count > 0 {
metaCode/Classes/Main/HomePage/View/CNCustomIndexView.swift
@@ -13,15 +13,14 @@ class CNCustomIndexTopView : UIView{ @@ -13,15 +13,14 @@ class CNCustomIndexTopView : UIView{
13 ///关闭按钮事件回调 13 ///关闭按钮事件回调
14 var closeAction: closeBlock? 14 var closeAction: closeBlock?
15 15
16 -  
17 //MARK: - 懒加载 16 //MARK: - 懒加载
18 ///标题 17 ///标题
19 lazy var titleLabel: UILabel = { 18 lazy var titleLabel: UILabel = {
20 - let titleLabel = UILabel.init(frame: CGRectMake(10, 0, 75, 35)) 19 + let titleLabel = UILabel.init(frame: CGRectMake(0, 0, 75, 35))
21 titleLabel.bottom = self.bottom - 5 20 titleLabel.bottom = self.bottom - 5
22 titleLabel.textColor = .white 21 titleLabel.textColor = .white
23 titleLabel.textAlignment = .left 22 titleLabel.textAlignment = .left
24 - titleLabel.font = UIFont.systemFont(ofSize: 24, weight: .semibold) 23 + titleLabel.font = BoldFont_24
25 titleLabel.adjustsFontSizeToFitWidth=true 24 titleLabel.adjustsFontSizeToFitWidth=true
26 return titleLabel 25 return titleLabel
27 }() 26 }()
@@ -118,9 +117,15 @@ class CNCustomIndexView:PGIndexBannerSubiew, UIScrollViewDelegate, WJColorChange @@ -118,9 +117,15 @@ class CNCustomIndexView:PGIndexBannerSubiew, UIScrollViewDelegate, WJColorChange
118 set{ 117 set{
119 self.mainView.idModel = newValue! 118 self.mainView.idModel = newValue!
120 _idModel = newValue 119 _idModel = newValue
121 - self.upSlideView.url = _idModel?.downPath  
122 - self.downSlideView.url = _idModel?.upPath 120 + self.upSlideView.type = _idModel?.downType
  121 + self.upSlideView.downPath = _idModel?.downPath
  122 +
  123 + self.downSlideView.type = _idModel?.upType
  124 + self.downSlideView.downPath = _idModel?.upPath
  125 +
123 self.topNavView.setTitleString(title:(_idModel?.name)!) 126 self.topNavView.setTitleString(title:(_idModel?.name)!)
  127 +
  128 + self.colorDataArr = NSMutableArray(array: NSArray(objects: UIColor.white,KVCBackgroupColor!,HexColor(_idModel!.backgroundColor)!))
124 } 129 }
125 130
126 } 131 }
@@ -143,7 +148,7 @@ class CNCustomIndexView:PGIndexBannerSubiew, UIScrollViewDelegate, WJColorChange @@ -143,7 +148,7 @@ class CNCustomIndexView:PGIndexBannerSubiew, UIScrollViewDelegate, WJColorChange
143 148
144 ///颜色数据 149 ///颜色数据
145 lazy var colorDataArr: NSMutableArray = { 150 lazy var colorDataArr: NSMutableArray = {
146 - let colorDataArr = NSMutableArray(array: NSArray(objects: UIColor.white,KVCBackgroupColor!,UIColor("#004FE0")!)) 151 + let colorDataArr = NSMutableArray(array: NSArray(objects: UIColor.white,KVCBackgroupColor!,UIColor.yellow))//UIColor("#004FE0")!
147 152
148 return colorDataArr 153 return colorDataArr
149 }() 154 }()
@@ -180,7 +185,8 @@ class CNCustomIndexView:PGIndexBannerSubiew, UIScrollViewDelegate, WJColorChange @@ -180,7 +185,8 @@ class CNCustomIndexView:PGIndexBannerSubiew, UIScrollViewDelegate, WJColorChange
180 185
181 ///下滑显示的VIew 186 ///下滑显示的VIew
182 lazy var downSlideView: CNDownSlideView = { 187 lazy var downSlideView: CNDownSlideView = {
183 - let collectionView = CNDownSlideView.init(frame: CGRectMake(-25, 0, self.frame.size.width + 50, self.frame.size.height)) 188 +
  189 + let collectionView = CNDownSlideView.init(frame: CGRectMake(-LeftGap, 0, self.frame.size.width+LeftGap*2, self.frame.size.height))
184 collectionView.backgroundColor = .clear 190 collectionView.backgroundColor = .clear
185 collectionView.backAction = {[weak self] in 191 collectionView.backAction = {[weak self] in
186 self?.baseScrollView.setContentOffset(CGPoint(x: 0, y: (self!.baseScrollView.height)), animated: true) 192 self?.baseScrollView.setContentOffset(CGPoint(x: 0, y: (self!.baseScrollView.height)), animated: true)
@@ -199,8 +205,7 @@ class CNCustomIndexView:PGIndexBannerSubiew, UIScrollViewDelegate, WJColorChange @@ -199,8 +205,7 @@ class CNCustomIndexView:PGIndexBannerSubiew, UIScrollViewDelegate, WJColorChange
199 205
200 ///上滑显示的View 206 ///上滑显示的View
201 lazy var upSlideView : CNUpSlideView = { 207 lazy var upSlideView : CNUpSlideView = {
202 - let upSlideView = CNUpSlideView(frame: CGRectMake(-25, self.frame.size.height*2 + 120,self.frame.size.width+50, self.frame.size.height - 120))  
203 - 208 + let upSlideView = CNUpSlideView(frame: CGRectMake(-LeftGap, self.frame.size.height*2,self.frame.size.width+LeftGap*2, self.frame.size.height))
204 return upSlideView 209 return upSlideView
205 }() 210 }()
206 211
@@ -224,7 +229,7 @@ class CNCustomIndexView:PGIndexBannerSubiew, UIScrollViewDelegate, WJColorChange @@ -224,7 +229,7 @@ class CNCustomIndexView:PGIndexBannerSubiew, UIScrollViewDelegate, WJColorChange
224 229
225 /// 顶部自定义导航 230 /// 顶部自定义导航
226 lazy var topNavView: CNCustomIndexTopView = { 231 lazy var topNavView: CNCustomIndexTopView = {
227 - let topNavView = CNCustomIndexTopView.init(frame: CGRect(x: 0, y: 30, width: self.width, height: KNavigationHeight)) 232 + let topNavView = CNCustomIndexTopView.init(frame: CGRect(x: 0, y: KStatusBarHeight, width: self.width, height: KNavigationHeight))
228 topNavView.alpha = 0 233 topNavView.alpha = 0
229 topNavView.closeAction = { [weak self ] in 234 topNavView.closeAction = { [weak self ] in
230 self!.baseScrollView.setContentOffset(CGPoint(x: 0, y: self!.baseScrollView.height), animated: true) 235 self!.baseScrollView.setContentOffset(CGPoint(x: 0, y: self!.baseScrollView.height), animated: true)
@@ -250,13 +255,10 @@ class CNCustomIndexView:PGIndexBannerSubiew, UIScrollViewDelegate, WJColorChange @@ -250,13 +255,10 @@ class CNCustomIndexView:PGIndexBannerSubiew, UIScrollViewDelegate, WJColorChange
250 self.addSubview(self.downSlideViewRemindView) 255 self.addSubview(self.downSlideViewRemindView)
251 256
252 self.addSubview(self.baseScrollView) 257 self.addSubview(self.baseScrollView)
253 - self.addSubview(self.topNavView)  
254 -// self.topNavView.setTitleString(title: "志愿者")  
255 -  
256 self.baseScrollView.addSubview(self.downSlideView) 258 self.baseScrollView.addSubview(self.downSlideView)
257 self.baseScrollView.addSubview(self.mainView) 259 self.baseScrollView.addSubview(self.mainView)
258 self.baseScrollView.addSubview(self.upSlideView) 260 self.baseScrollView.addSubview(self.upSlideView)
259 - 261 + self.addSubview(self.topNavView)
260 //默认偏移到中间 262 //默认偏移到中间
261 self.baseScrollView.setContentOffset(CGPointMake(0, self.frame.size.height), animated: false) 263 self.baseScrollView.setContentOffset(CGPointMake(0, self.frame.size.height), animated: false)
262 } 264 }
@@ -380,12 +382,16 @@ class CNCustomIndexView:PGIndexBannerSubiew, UIScrollViewDelegate, WJColorChange @@ -380,12 +382,16 @@ class CNCustomIndexView:PGIndexBannerSubiew, UIScrollViewDelegate, WJColorChange
380 else{ 382 else{
381 self.topNavView.alpha = 0 383 self.topNavView.alpha = 0
382 } 384 }
383 -  
384 //隐藏downSlideView的bottomView 385 //隐藏downSlideView的bottomView
385 if scrollView.contentOffset.y > 10{ 386 if scrollView.contentOffset.y > 10{
386 self.downSlideView.bottomView.isHidden = true 387 self.downSlideView.bottomView.isHidden = true
387 self.downSlideView.contentView.backgroundColor = .clear 388 self.downSlideView.contentView.backgroundColor = .clear
388 } 389 }
  390 + if scrollView.contentOffset.y == 0{
  391 + //滚动到第一页,显示downSlideView的底部view
  392 + self.downSlideView.bottomView.isHidden = false
  393 + self.downSlideView.contentView.backgroundColor = HexColor(kCNDownSlideBackgroundColorHex) //KVCBackgroupColor
  394 + }
389 395
390 delegate?.customIndexViewDidScroll(scrollView: self.baseScrollView) 396 delegate?.customIndexViewDidScroll(scrollView: self.baseScrollView)
391 397
@@ -408,16 +414,29 @@ class CNCustomIndexView:PGIndexBannerSubiew, UIScrollViewDelegate, WJColorChange @@ -408,16 +414,29 @@ class CNCustomIndexView:PGIndexBannerSubiew, UIScrollViewDelegate, WJColorChange
408 self.superScrollView?.isScrollEnabled = false 414 self.superScrollView?.isScrollEnabled = false
409 } 415 }
410 416
411 -  
412 if scrollView.contentOffset.y == 0{ 417 if scrollView.contentOffset.y == 0{
413 //滚动到第一页,显示downSlideView的底部view 418 //滚动到第一页,显示downSlideView的底部view
414 self.downSlideView.bottomView.isHidden = false 419 self.downSlideView.bottomView.isHidden = false
415 - self.downSlideView.contentView.backgroundColor = KVCBackgroupColor 420 + self.downSlideView.contentView.backgroundColor = HexColor(kCNDownSlideBackgroundColorHex)//KVCBackgroupColor
416 } 421 }
417 422
418 -  
419 - //滑动结束 把topNavView 放到scrollView的上层  
420 - self.bringSubviewToFront(self.topNavView) 423 + //滑动结束 网页类型downType=1时把topNavView 放到scrollView的上层
  424 + if scrollView.contentOffset.y == ceil(defaultOffset*2) {
  425 + if self.idModel?.downType == 1 {
  426 + self.bringSubviewToFront(self.topNavView)
  427 + self.topNavView.isHidden = false
  428 + }else if self.idModel?.downType == 0{
  429 + self.topNavView.isHidden = false
  430 + self.bringSubviewToFront(self.topNavView)
  431 + }else{
  432 + self.topNavView.isHidden = true
  433 + }
  434 + }else{
  435 + self.topNavView.isHidden = true
  436 + }
  437 + if scrollView.contentOffset.y == ceil(defaultOffset*2){
  438 +
  439 + }
421 440
422 //下滑提醒View回到初始位置 441 //下滑提醒View回到初始位置
423 self.downSlideViewRemindView.top = -(self.downSlideViewRemindView.height + 50) 442 self.downSlideViewRemindView.top = -(self.downSlideViewRemindView.height + 50)
metaCode/Classes/Main/HomePage/View/CNDownSlideSingleCourseCell.swift 0 → 100644
  1 +//
  2 +// CNDownSlideSingleCourseCell.swift
  3 +// metaCode
  4 +//
  5 +// Created by zx on 2023/10/16.
  6 +// 单课程大图专辑
  7 +
  8 +
  9 +import Foundation
  10 +import UIKit
  11 +
  12 +enum GlobalConstants {
  13 + static let leftMargin: CGFloat = 20
  14 +
  15 + static let toDayCardRowH: CGFloat = 440
  16 + static let toDayCardCornerRadius: CGFloat = 12.0
  17 + static let todayCardSize: CGSize = CGSize(width: KSreenWidth - 2 * 15, height: DownSlideSingleCourseImgH)
  18 + static let cardDetailTopImageH: CGFloat = 500
  19 +
  20 + static let iconBorderColor: CGColor = UIColor(red: 239/255.0, green: 240/255.0, blue: 241/255.0, alpha: 1).cgColor
  21 + static let iconBorderWidth: CGFloat = 0.8
  22 + static let iconCornerRadius: CGFloat = 17.5
  23 +
  24 + static let textBlueColor = UIColor(red: 0/255.0, green: 122/255.0, blue: 255/255.0, alpha: 1.0) //007AFF
  25 + static let speratorLineColor = UIColor(red: 224/255.0, green: 224/255.0, blue: 224/255.0, alpha: 1)
  26 +
  27 +}
  28 +
  29 +///全部课程 标题高度
  30 +let DownSlideAllCourseTitleH: CGFloat = 55
  31 +//全部课程 每row_topY间距
  32 +let DownSlideAllCourseRowTopYGap: CGFloat = 10
  33 +//全部课程 每row_topY间距
  34 +let DownSlideAllCourseRowBottomYGap: CGFloat = 20
  35 +//全部课程 每row_img宽高
  36 +let DownSlideAllCourseRowImageWH: CGFloat = 45
  37 +
  38 +///全部课程 每row高度
  39 +let DownSlideAllCourseRowH: CGFloat = DownSlideAllCourseRowTopYGap+DownSlideAllCourseRowBottomYGap + DownSlideAllCourseRowImageWH
  40 +///全部课程 宽度
  41 +let DownSlideAllCourseW: CGFloat = KSreenWidth - DownSlideRecommendLeftGap*2
  42 +
  43 +///单节课程 大图高度
  44 +let DownSlideSingleCourseImgH: CGFloat = 345
  45 +///单节课程 更多课程高度
  46 +let DownSlideSingleCourseMoreH: CGFloat = 60
  47 +///单节课程 宽度
  48 +let DownSlideSingleCourseW: CGFloat = KSreenWidth - DownSlideRecommendLeftGap*2
  49 +
  50 +class CNDownSlideSingleCourseCell: UITableViewCell {
  51 +
  52 + let bgBackView = UIView()
  53 + let bgImageView = UIImageView()
  54 +
  55 + //slideModel
  56 + var _slideModel : CNLiveDownSlideModel?
  57 + var slideModel : CNLiveDownSlideModel? {
  58 + get{
  59 + _slideModel
  60 + }
  61 + set{
  62 + _slideModel = newValue!
  63 + self.setupNewUI(model: _slideModel!)
  64 + }
  65 + }
  66 +
  67 + override init(style: UITableViewCell.CellStyle, reuseIdentifier: String?) {
  68 + super.init(style: style, reuseIdentifier: reuseIdentifier)
  69 + self.selectionStyle = .none
  70 + setupUI()
  71 + }
  72 +
  73 + required init?(coder aDecoder: NSCoder) {
  74 + fatalError("init(coder:) has not been implemented")
  75 + }
  76 +
  77 + private func setupUI() {
  78 + contentView.backgroundColor = HexColor(kCNDownSlideBackgroundColorHex)
  79 + }
  80 +
  81 + func setupNewUI(model:CNLiveDownSlideModel){
  82 + if model.type == SlideModelTypeAllCourse12 {
  83 + //全部课程列表
  84 + contentView.addSubview(bgBackView)
  85 +
  86 + bgBackView.frame = CGRect(x: DownSlideRecommendLeftGap, y: 0,width:DownSlideSingleCourseW , height:model.cellH-DownSlideRecommendLeftGap)
  87 + bgBackView.layer.shadowColor = HexColor("#000000")?.cgColor
  88 + bgBackView.layer.shadowRadius = 12
  89 + bgBackView.layer.shadowOpacity = 1
  90 + bgBackView.layer.shadowOffset = CGSize(width: 0, height: 0)
  91 + bgBackView.layer.cornerRadius = 12
  92 + bgBackView.clipsToBounds = true
  93 + bgBackView.backgroundColor = HexColor("#FFFFFF")
  94 +
  95 + let titleLbl = UILabel(frame: CGRect(x: DownSlideRecommendLeftGap, y: DownSlideRecommendLeftGap, width: DownSlideSingleCourseW-DownSlideRecommendLeftGap*2, height: 30))
  96 + titleLbl.text = model.blockName ?? "全部课程"
  97 + titleLbl.font = BoldFont_21
  98 + titleLbl.textColor = HexColor("#333333")
  99 + bgBackView.addSubview(titleLbl)
  100 +
  101 + //总块数
  102 + let contentsNum = model.contents.count
  103 + //model行数
  104 + let row = model.rowNum
  105 + //总显示块数
  106 + var totalNum = (contentsNum >= row) ? row : contentsNum
  107 + if row == 0{//row为0 , contents全部显示
  108 + totalNum = contentsNum
  109 + }
  110 + for i in 0..<totalNum{//i是第几行
  111 + let contentMdl = model.contents[i]
  112 +
  113 + //小icon
  114 + let imageView = UIImageView(frame: CGRectMake(DownSlideRecommendLeftGap, titleLbl.bottom+DownSlideRecommendLeftGap+CGFloat(i)*(DownSlideAllCourseRowTopYGap+DownSlideAllCourseRowImageWH+DownSlideAllCourseRowBottomYGap), CGFloat(DownSlideAllCourseRowImageWH), CGFloat(DownSlideAllCourseRowImageWH)))
  115 + imageView.kf.setImage(with: URL(string:contentMdl.poster!))
  116 + bgBackView.addSubview(imageView)
  117 +
  118 + let titleLbl = UILabel(frame: CGRect(x: imageView.right+DownSlideRecommendLeftGap, y: imageView.top, width: DownSlideSingleCourseW-90-imageView.right, height: 21))
  119 + titleLbl.text = contentMdl.title ?? "婴儿课程"
  120 + titleLbl.font = Font_15
  121 + titleLbl.textColor = HexColor("#333333")
  122 + bgBackView.addSubview(titleLbl)
  123 +
  124 + let subTitleLbl = UILabel(frame: CGRect(x: titleLbl.left, y:titleLbl.bottom+3 , width: titleLbl.width, height: 17))
  125 + subTitleLbl.text = contentMdl.subTitle ?? "适应3-6岁"
  126 + subTitleLbl.font = Font_12
  127 + subTitleLbl.textColor = HexColor("#999999")
  128 + bgBackView.addSubview(subTitleLbl)
  129 +
  130 + let enterBtn = UIButton(type: .custom)
  131 + enterBtn.frame = CGRect(x: bgBackView.right-25-65, y: 0, width: 65, height: 30)
  132 + enterBtn.centerY = imageView.centerY
  133 + enterBtn.setBackgroundImage(UIImage(named: "homepage_down_enter"), for: .normal)
  134 + enterBtn.setTitle("进入", for: .normal)
  135 + enterBtn.titleLabel?.font = BoldFont_13
  136 + enterBtn.setTitleColor(HexColor("#FFFFFF"), for: .normal)
  137 + enterBtn.addTarget(self, action: #selector(enterBtnAction(_:)), for: .touchUpInside)
  138 + enterBtn.tag = i
  139 + bgBackView.addSubview(enterBtn)
  140 + }
  141 + }else if model.type == SlideModelTypeOneCourse75 {
  142 + //单图课程
  143 + contentView.addSubview(bgBackView)
  144 + bgBackView.addSubview(bgImageView)
  145 +
  146 + bgBackView.frame = CGRect(x: DownSlideRecommendLeftGap, y: 0,width:DownSlideSingleCourseW , height:DownSlideSingleCourseMoreH+DownSlideSingleCourseImgH)
  147 + bgBackView.layer.shadowColor = UIColor.black.cgColor
  148 + bgBackView.layer.shadowOpacity = 0.4
  149 + bgBackView.layer.shadowOffset = CGSize(width: 0, height: 1)
  150 +
  151 + bgImageView.frame = CGRect(x: 0, y: 0,width:DownSlideSingleCourseW , height:DownSlideSingleCourseImgH)
  152 + bgImageView.contentMode = .scaleAspectFill
  153 + bgImageView.layer.cornerRadius = GlobalConstants.toDayCardCornerRadius
  154 + bgImageView.layer.maskedCorners = [.layerMinXMinYCorner, .layerMaxXMinYCorner]
  155 + bgImageView.layer.masksToBounds = true
  156 + bgImageView.kf.setImage(with: URL(string: model.contents[0].poster ?? ""))
  157 +
  158 + let titleLbl = UILabel(frame: CGRect(x: DownSlideRecommendLeftGap, y: DownSlideRecommendLeftGap, width: DownSlideSingleCourseW-DownSlideRecommendLeftGap*2, height: 30))
  159 + titleLbl.text = model.contents[0].title ?? "婴儿课程"
  160 + titleLbl.font = BoldFont_21
  161 + titleLbl.textColor = HexColor("#FFFFFF")
  162 + bgImageView.addSubview(titleLbl)
  163 +
  164 + let subTitleLbl = UILabel(frame: CGRect(x: DownSlideRecommendLeftGap, y:titleLbl.bottom , width: DownSlideSingleCourseW-DownSlideRecommendLeftGap*2, height: 30))
  165 + subTitleLbl.text = model.contents[0].subTitle ?? "适应3-6岁"
  166 + subTitleLbl.font = Font_12
  167 + subTitleLbl.textColor = HexColor("#FFFFFF")
  168 + bgImageView.addSubview(subTitleLbl)
  169 +
  170 + //单节底部视图
  171 + let singleCourseBottomView = UIView(frame: CGRect(x: 0, y: DownSlideSingleCourseImgH, width: DownSlideSingleCourseW, height: DownSlideSingleCourseMoreH))
  172 + singleCourseBottomView.layer.cornerRadius = 12
  173 + singleCourseBottomView.layer.maskedCorners = [.layerMinXMaxYCorner, .layerMaxXMaxYCorner]
  174 + singleCourseBottomView.backgroundColor = .white
  175 + singleCourseBottomView.isUserInteractionEnabled = true
  176 + bgBackView.addSubview(singleCourseBottomView)
  177 +
  178 + let moreLabel = UILabel(frame: CGRect(x: DownSlideRecommendLeftGap, y: 15, width: DownSlideSingleCourseW - 50 - DownSlideRecommendLeftGap , height: 30))
  179 + moreLabel.text = model.blockName ?? "更多"
  180 + moreLabel.font = Font_15
  181 + moreLabel.textColor = HexColor("#333333")
  182 + singleCourseBottomView.addSubview(moreLabel)
  183 +
  184 + let moreImgView = UIImageView(image: UIImage(named: "homepage_down_more"))
  185 + moreImgView.left = moreLabel.right
  186 + moreImgView.centerY = moreLabel.centerY
  187 + singleCourseBottomView.addSubview(moreImgView)
  188 + }
  189 + }
  190 +
  191 + //MARK: - 事件
  192 + @objc func enterBtnAction(_ sender: UIButton){
  193 + let tag = sender.tag
  194 + let contentMdl = self.slideModel?.contents[tag]
  195 + CNLiveDownSlideTool.pushWebVCWithContentsMdl(contentMdl: contentMdl!)
  196 + }
  197 +}
metaCode/Classes/Main/HomePage/View/CNDownSlideView.swift
@@ -3,7 +3,7 @@ @@ -3,7 +3,7 @@
3 // metaCode 3 // metaCode
4 // 4 //
5 // Created by daojian on 2023/5/30. 5 // Created by daojian on 2023/5/30.
6 -// 6 +// 下滑后的上面页面
7 7
8 import Foundation 8 import Foundation
9 import UIKit 9 import UIKit
@@ -16,10 +16,11 @@ class CNDownSlideView:UIView{ @@ -16,10 +16,11 @@ class CNDownSlideView:UIView{
16 //返回首页 16 //返回首页
17 var backAction:backBlock? 17 var backAction:backBlock?
18 18
  19 +
19 //MARK: - 懒加载 20 //MARK: - 懒加载
20 lazy var contentView:UIView = { 21 lazy var contentView:UIView = {
21 22
22 - let contentView = UIView.init(frame: CGRect(x: 0, y: 0, width: self.width, height: self.height-KTabBarHeight)) 23 + let contentView = UIView.init(frame: CGRect(x: 0, y: 0, width: self.width, height: self.height))
23 contentView.backgroundColor = UIColor.clear 24 contentView.backgroundColor = UIColor.clear
24 25
25 // let path:UIBezierPath = UIBezierPath.init(roundedRect: contentView.bounds, byRoundingCorners: [.bottomLeft, .bottomRight], cornerRadii: CGSize.init(width: 20, height: 20)) 26 // let path:UIBezierPath = UIBezierPath.init(roundedRect: contentView.bounds, byRoundingCorners: [.bottomLeft, .bottomRight], cornerRadii: CGSize.init(width: 20, height: 20))
@@ -47,42 +48,65 @@ class CNDownSlideView:UIView{ @@ -47,42 +48,65 @@ class CNDownSlideView:UIView{
47 return webView 48 return webView
48 }() 49 }()
49 50
50 - var _url:String?  
51 - var url:String? { 51 + var upSlideVC:CNUpSlideViewController = {
  52 + let upSlideVC = CNUpSlideViewController.init()
  53 + upSlideVC.view.width = KSreenWidth
  54 + upSlideVC.view.height = KSreenHeight-DownSlideBottomViewHeight
  55 + return upSlideVC
  56 + }()
  57 +
  58 + var shopConsoleVC:CNLiveShopConsoleController = {
  59 + let shopConsoleVC = CNLiveShopConsoleController.init()
  60 + shopConsoleVC.view.width = KSreenWidth
  61 + shopConsoleVC.view.height = KSreenHeight-DownSlideBottomViewHeight
  62 + return shopConsoleVC
  63 + }()
  64 +
  65 + var type:Int?
  66 +
  67 + var _downPath:String?
  68 + var downPath:String? {
52 get{ 69 get{
53 - return _url 70 + return _downPath
54 } 71 }
55 set{ 72 set{
56 - _url = newValue!  
57 - if (_url != ""){  
58 - let webUrl: URL! = URL.init(string: _url!)  
59 - webView.load(URLRequest.init(url:webUrl)) 73 + _downPath = newValue!
  74 +
  75 + if(type == UpDownTypeH5){
  76 + self.contentView.addSubview(self.webView)
  77 + if (_downPath != ""){
  78 + let webUrl: URL! = URL.init(string: _downPath!)
  79 + webView.load(URLRequest.init(url:webUrl))
  80 + }
  81 + }else if(type == UpDownTypePage){
  82 + self.addSubview(self.upSlideVC.view)
  83 + self.upSlideVC.downPath = _downPath
  84 +
  85 + }else if(type == UpDownTypeShopDetail){
  86 +
  87 + }else if(type == UpDownTypeShopControlConsole){
  88 + self.addSubview(self.shopConsoleVC.view)
60 } 89 }
61 } 90 }
62 } 91 }
63 92
64 - lazy var topView:UIView = {  
65 -  
66 - let tempTopView = UIView(frame: CGRect(x:0, y:20, width: self.width - 50, height: 70))  
67 -  
68 - return tempTopView  
69 - }()  
70 -  
71 lazy var bottomView:UIView = { 93 lazy var bottomView:UIView = {
72 94
73 - let bottomView = UIView(frame: CGRect(x:0, y:self.height - KTabBarHeight, width: self.width, height: KTabBarHeight))  
74 - bottomView.backgroundColor = .white 95 + let bottomView = UIView(frame: CGRect(x:0, y:self.height - DownSlideBottomViewHeight, width: self.width, height: DownSlideBottomViewHeight))
  96 + bottomView.backgroundColor = HexColor("#FFFFFF")
75 bottomView.isHidden = true 97 bottomView.isHidden = true
76 98
77 - let path:UIBezierPath = UIBezierPath.init(roundedRect: bottomView.bounds, byRoundingCorners: [.topLeft, .topRight], cornerRadii: CGSize.init(width: 20, height: 20))  
78 - 99 + let path:UIBezierPath = UIBezierPath.init(roundedRect: bottomView.bounds, byRoundingCorners: [.topLeft, .topRight], cornerRadii: CGSize.init(width: 50, height: 50))
79 let maskLayer:CAShapeLayer = CAShapeLayer() 100 let maskLayer:CAShapeLayer = CAShapeLayer()
80 maskLayer.frame = bottomView.bounds 101 maskLayer.frame = bottomView.bounds
81 maskLayer.path = path.cgPath 102 maskLayer.path = path.cgPath
82 bottomView.layer.mask = maskLayer 103 bottomView.layer.mask = maskLayer
  104 + bottomView.clipsToBounds = true
  105 +// bottomView.layer.cornerRadius = 50
  106 +// bottomView.layer.maskedCorners = [.layerMinXMinYCorner, .layerMaxXMinYCorner]
83 107
84 let backBtn: UIButton = UIButton(type: .custom) 108 let backBtn: UIButton = UIButton(type: .custom)
85 - backBtn.frame = CGRectMake(0, 0, 100, 30) 109 + backBtn.frame = CGRectMake(0, 0, 100, DownSlideBottomViewHeight)
86 backBtn.centerX = bottomView.width/2 110 backBtn.centerX = bottomView.width/2
87 backBtn.centerY = bottomView.height/2 111 backBtn.centerY = bottomView.height/2
88 backBtn.setImage(UIImage(named: "homePage_backhome_icon"), for: .normal) 112 backBtn.setImage(UIImage(named: "homePage_backhome_icon"), for: .normal)
@@ -98,9 +122,15 @@ class CNDownSlideView:UIView{ @@ -98,9 +122,15 @@ class CNDownSlideView:UIView{
98 122
99 override init(frame: CGRect) { 123 override init(frame: CGRect) {
100 super.init(frame: frame) 124 super.init(frame: frame)
  125 +
  126 + let tap = UITapGestureRecognizer.init(target: self, action: #selector(slideViewTap))
  127 + tap.cancelsTouchesInView = false
  128 + self.addGestureRecognizer(tap)
101 self.initUI() 129 self.initUI()
102 } 130 }
103 - 131 + @objc func slideViewTap() {
  132 + print("slideViewTap")
  133 + }
104 required init?(coder: NSCoder) { 134 required init?(coder: NSCoder) {
105 fatalError("init(coder:) has not been implemented") 135 fatalError("init(coder:) has not been implemented")
106 } 136 }
@@ -108,11 +138,10 @@ class CNDownSlideView:UIView{ @@ -108,11 +138,10 @@ class CNDownSlideView:UIView{
108 138
109 ///初始化UI 139 ///初始化UI
110 func initUI(){ 140 func initUI(){
  141 + self.isUserInteractionEnabled = true
111 self.addSubview(self.contentView) 142 self.addSubview(self.contentView)
112 - self.contentView.addSubview(self.webView)  
113 -// self.addSubview(self.topView) 143 +
114 self.addSubview(self.bottomView) 144 self.addSubview(self.bottomView)
115 -  
116 } 145 }
117 146
118 @objc func backBtnAction(){ 147 @objc func backBtnAction(){
metaCode/Classes/Main/HomePage/View/CNLiveDownSlideRecommendCell.swift 0 → 100644
  1 +//
  2 +// CNLiveDownSlideRecommendCell.swift
  3 +// metaCode
  4 +//
  5 +// Created by zx on 2023/10/20.
  6 +// type:4 推荐课程 推荐活动
  7 +
  8 +import Foundation
  9 +
  10 +///推荐课程左间距
  11 +let DownSlideRecommendLeftGap: CGFloat = 15
  12 +///推荐课程宽高
  13 +let DownSlideRecommendWH: CGFloat = (KSreenWidth-DownSlideRecommendLeftGap*3)*0.5
  14 +
  15 +
  16 +class CNLiveDownSlideRecommendCell: UITableViewCell {
  17 +
  18 + //slideModel
  19 + var _slideModel : CNLiveDownSlideModel?
  20 + var slideModel : CNLiveDownSlideModel? {
  21 + get{
  22 + _slideModel
  23 + }
  24 + set{
  25 + _slideModel = newValue!
  26 + setupNewUI(model: _slideModel!)
  27 + }
  28 + }
  29 +
  30 + override init(style: UITableViewCell.CellStyle, reuseIdentifier: String?) {
  31 + super.init(style: style, reuseIdentifier: reuseIdentifier)
  32 + self.selectionStyle = .none
  33 + contentView.backgroundColor = HexColor(kCNDownSlideBackgroundColorHex)
  34 + }
  35 +
  36 + required init?(coder: NSCoder) {
  37 + fatalError("init(coder:) has not been implemented")
  38 + }
  39 +
  40 +
  41 + func setupNewUI(model:CNLiveDownSlideModel){
  42 + //总块数
  43 + let contentsNum = model.contents.count
  44 + //model行数
  45 + let row = model.rowNum
  46 + //总显示块数/循环数
  47 + var totalNum = (contentsNum >= row*2) ? row*2 : contentsNum
  48 + if row == 0{//row为0 , contents全部显示
  49 + totalNum = contentsNum
  50 + }
  51 + //lieIndex 当前是contents的第0列还是第1列
  52 + var lieIndex = 0
  53 + //hangIndex 当前是第几行,1...n
  54 + var hangIndex = 1
  55 + for i in 0..<totalNum{//i是第几行
  56 + if lieIndex == 0{
  57 + //显示左边的块
  58 + let contentMdl = model.contents[(hangIndex-1)*2+(lieIndex)]
  59 + let imageView = UIImageView(frame: CGRectMake(DownSlideRecommendLeftGap, CGFloat(hangIndex-1)*DownSlideRecommendWH+DownSlideRecommendLeftGap*CGFloat(hangIndex-1), CGFloat(DownSlideRecommendWH), CGFloat(DownSlideRecommendWH)))
  60 + imageView.kf.setImage(with: URL(string:contentMdl.poster!))
  61 + imageView.tag = i
  62 + imageView.isUserInteractionEnabled = true
  63 + imageView.addGestureRecognizer(UITapGestureRecognizer.init(target: self, action: #selector(pushWebAction)))
  64 + contentView.addSubview(imageView)
  65 + lieIndex = 1
  66 + }else{
  67 + //lieIndex==1显示右边的块
  68 + let contentMdl = model.contents[(hangIndex-1)*2+(lieIndex)]
  69 + let imageView = UIImageView(frame: CGRectMake(CGFloat(DownSlideRecommendLeftGap*2)+CGFloat(DownSlideRecommendWH), CGFloat(hangIndex-1)*DownSlideRecommendWH+DownSlideRecommendLeftGap*CGFloat(hangIndex-1), CGFloat(DownSlideRecommendWH), CGFloat(DownSlideRecommendWH)))
  70 + imageView.kf.setImage(with: URL(string:contentMdl.poster!))
  71 + imageView.tag = i
  72 + imageView.isUserInteractionEnabled = true
  73 + imageView.addGestureRecognizer(UITapGestureRecognizer.init(target: self, action: #selector(pushWebAction)))
  74 + contentView.addSubview(imageView)
  75 + lieIndex = 0
  76 + hangIndex += 1
  77 + }
  78 + }
  79 + }
  80 +
  81 + @objc func pushWebAction(ges: UITapGestureRecognizer){
  82 + let imageView = ges.view as! UIImageView
  83 + let i = imageView.tag
  84 + let contentMdl = (self.slideModel?.contents[i])!
  85 + CNLiveDownSlideTool.pushWebVCWithContentsMdl(contentMdl: contentMdl)
  86 + }
  87 +
  88 +}
metaCode/Classes/Main/HomePage/View/CNLiveDownSlideTodayRecommendCell.swift 0 → 100644
  1 +//
  2 +// CNLiveDownSlideTodayRecommendCell.swift
  3 +// metaCode
  4 +//
  5 +// Created by zx on 2023/10/20.
  6 +// type:74 今日推荐
  7 +
  8 +import Foundation
  9 +
  10 +///今日推荐高度
  11 +let DownSlideTodayRecommendH: CGFloat = 105
  12 +///今日推荐宽度
  13 +let DownSlideTodayRecommendW: CGFloat = KSreenWidth-DownSlideRecommendLeftGap*2
  14 +
  15 +class CNLiveDownSlideTodayRecommendCell: UITableViewCell {
  16 + //slideModel
  17 + var _slideModel : CNLiveDownSlideModel?
  18 + var slideModel : CNLiveDownSlideModel? {
  19 + get{
  20 + _slideModel
  21 + }
  22 + set{
  23 + _slideModel = newValue!
  24 + self.setupNewUI(model: _slideModel!)
  25 + }
  26 + }
  27 + override init(style: UITableViewCell.CellStyle, reuseIdentifier: String?) {
  28 + super.init(style: style, reuseIdentifier: reuseIdentifier)
  29 + self.selectionStyle = .none
  30 + contentView.backgroundColor = HexColor(kCNDownSlideBackgroundColorHex)
  31 + }
  32 +
  33 + required init?(coder: NSCoder) {
  34 + fatalError("init(coder:) has not been implemented")
  35 + }
  36 +
  37 + func setupNewUI(model:CNLiveDownSlideModel){
  38 + //总块数
  39 + let contentsNum = model.contents.count
  40 + //model行数
  41 + let row = model.rowNum
  42 + //总显示块数
  43 + var totalNum = (contentsNum >= row) ? row : contentsNum
  44 + if row == 0{//row为0 , contents全部显示
  45 + totalNum = contentsNum
  46 + }
  47 + for i in 0..<totalNum{//i是第几行
  48 + let contentMdl = model.contents[i]
  49 + let imageView = UIImageView(frame: CGRectMake(DownSlideRecommendLeftGap, CGFloat(i)*(DownSlideTodayRecommendH+DownSlideRecommendLeftGap), CGFloat(DownSlideTodayRecommendW), CGFloat(DownSlideTodayRecommendH)))
  50 + imageView.kf.setImage(with: URL(string:contentMdl.poster!))
  51 + imageView.tag = i
  52 + imageView.layer.cornerRadius = 12
  53 + imageView.clipsToBounds = true
  54 + imageView.isUserInteractionEnabled = true
  55 + imageView.addGestureRecognizer(UITapGestureRecognizer.init(target: self, action: #selector(pushWebAction)))
  56 + contentView.addSubview(imageView)
  57 + }
  58 + }
  59 +
  60 + @objc func pushWebAction(ges: UITapGestureRecognizer){
  61 + let imageView = ges.view as! UIImageView
  62 + let i = imageView.tag
  63 + let contentMdl = self.slideModel?.contents[i]
  64 + CNLiveDownSlideTool.pushWebVCWithContentsMdl(contentMdl: contentMdl!)
  65 + }
  66 +}
metaCode/Classes/Main/HomePage/View/CNLiveShopConsoleCell.swift 0 → 100644
  1 +//
  2 +// CNLiveShopConsoleCell.swift
  3 +// metaCode
  4 +//
  5 +// Created by zx on 2023/10/30.
  6 +//
  7 +
  8 +import Foundation
  9 +
  10 +class CNLiveShopConsoleCell: UICollectionViewCell {
  11 +
  12 + var bgView = UIView()
  13 + var iconImageView = UIImageView()
  14 + var titleLbl = UILabel()
  15 + var subTitleLbl = UILabel()
  16 +
  17 + //slideModel
  18 + var _shopListContentModel : CNLiveShopConsoleListContentModel?
  19 + var shopListContentModel : CNLiveShopConsoleListContentModel? {
  20 + get{
  21 + _shopListContentModel
  22 + }
  23 + set{
  24 + _shopListContentModel = newValue!
  25 + self.iconImageView.image = UIImage(named: _shopListContentModel!.simg!)
  26 + self.titleLbl.text = _shopListContentModel?.title
  27 + self.subTitleLbl.text = _shopListContentModel?.subtitle
  28 + }
  29 + }
  30 +
  31 + override init(frame: CGRect) {
  32 + super.init(frame: frame)
  33 + self.backgroundColor = .clear
  34 + self.setUI()
  35 + }
  36 +
  37 + required init?(coder: NSCoder) {
  38 + fatalError("init(coder:) has not been implemented")
  39 + }
  40 +
  41 + func setUI(){
  42 + self.bgView = UIView(frame: contentView.bounds)
  43 + self.bgView.backgroundColor = .white
  44 + self.bgView.layer.cornerRadius = 7
  45 + contentView.addSubview(self.bgView)
  46 +
  47 + self.iconImageView = UIImageView(frame: CGRectMake(15, 0, 35, 35))
  48 + self.iconImageView.centerY = contentView.centerY
  49 + self.iconImageView.clipsToBounds = true
  50 + self.iconImageView.contentMode = .scaleAspectFit
  51 + self.bgView.addSubview(self.iconImageView)
  52 +
  53 + self.titleLbl = UILabel(frame: CGRect(x: self.iconImageView.right+10, y: (contentView.height-20-15)*0.5, width: contentView.width-self.iconImageView.right-10-20, height: 20))
  54 + self.titleLbl.text = "创建店铺分类"
  55 + self.titleLbl.font = Font_14
  56 + self.titleLbl.textColor = HexColor("#4A4A4A")
  57 + self.bgView.addSubview(self.titleLbl)
  58 +
  59 + self.subTitleLbl = UILabel(frame: CGRect(x: self.titleLbl.left, y: self.titleLbl.bottom, width: self.titleLbl.width, height: 15))
  60 + self.subTitleLbl.text = "创建店铺分类"
  61 + self.subTitleLbl.font = Font_11
  62 + self.subTitleLbl.textColor = HexColor("#999999")
  63 + self.bgView.addSubview(self.subTitleLbl)
  64 + }
  65 +}
  66 +
  67 +class CNLiveShopConsoleHeaderView:UICollectionReusableView{
  68 +
  69 + var _title:String?
  70 + var title:String? {
  71 + get{
  72 + return _title
  73 + }
  74 + set{
  75 + _title = newValue!
  76 + self.titleLbl.text = _title
  77 + }
  78 + }
  79 +
  80 + var titleLbl:UILabel = {
  81 + let titleLbl = UILabel(frame: CGRect(x: 15, y: 0, width: 100, height:23 ))
  82 + titleLbl.text = "商品管理"
  83 + titleLbl.font = Font_16
  84 + titleLbl.textColor = HexColor("#B4B4B4")
  85 + return titleLbl
  86 + }()
  87 +
  88 + override init(frame: CGRect) {
  89 + super.init(frame: frame)
  90 + self.setUI()
  91 + }
  92 +
  93 + required init?(coder: NSCoder) {
  94 + fatalError("init(coder:) has not been implemented")
  95 + }
  96 +
  97 + func setUI(){
  98 + self.addSubview(self.titleLbl)
  99 +
  100 + }
  101 +}
metaCode/Classes/Main/HomePage/View/CNLliveShopDetailBannerCell.swift 0 → 100644
  1 +//
  2 +// CNLliveShopDetailBannerCell.swift
  3 +// metaCode
  4 +//
  5 +// Created by zx on 2023/11/1.
  6 +//
  7 +
  8 +import Foundation
  9 +import FSPagerView
  10 +
  11 +class CNLliveShopDetailBannerCell:UICollectionViewCell,FSPagerViewDataSource,FSPagerViewDelegate{
  12 +
  13 + let kCNLliveShopDetailBannerCellID = "kCNLliveShopDetailBannerCellID"
  14 +
  15 + lazy var viewPager: FSPagerView = {
  16 + let viewPager = FSPagerView()
  17 + viewPager.frame = CGRect(x: 10, y: 10, width: self.contentView.width-20, height: self.contentView.height-20)
  18 + viewPager.dataSource = self
  19 + viewPager.delegate = self
  20 + viewPager.register(FSPagerViewCell.self, forCellWithReuseIdentifier: kCNLliveShopDetailBannerCellID)
  21 + //设置自动翻页事件间隔,默认值为0 (不自动翻页)
  22 + viewPager.automaticSlidingInterval = 1.0
  23 + //设置页面之间的间隔距离
  24 + viewPager.interitemSpacing = 8.0
  25 + //设置可以无限翻页,默认值为false,false时从尾部向前滚动到头部再继续循环滚动,true时可以无限滚动
  26 + viewPager.isInfinite = true
  27 + //设置转场的模式
  28 + viewPager.transformer = FSPagerViewTransformer(type: FSPagerViewTransformerType.depth)
  29 + return viewPager
  30 + }()
  31 +
  32 + //shopDetailModel
  33 + var _shopDetailModel : CNLiveShopDetailModel?
  34 + var shopDetailModel : CNLiveShopDetailModel? {
  35 + get{
  36 + _shopDetailModel
  37 + }
  38 + set{
  39 + _shopDetailModel = newValue!
  40 +
  41 + }
  42 + }
  43 +
  44 + override init(frame: CGRect) {
  45 + super.init(frame: frame)
  46 + self.backgroundColor = .clear
  47 + self.setUI()
  48 + }
  49 +
  50 + required init?(coder: NSCoder) {
  51 + fatalError("init(coder:) has not been implemented")
  52 + }
  53 +
  54 + func setUI(){
  55 + self.backgroundColor = .red
  56 + self.contentView.addSubview(self.viewPager)
  57 + }
  58 +
  59 + // MARK: - FSPagerViewDataSource
  60 + func numberOfItems(in pagerView: FSPagerView) -> Int {
  61 + return (self.shopDetailModel?.banner.count)!
  62 + }
  63 + func pagerView(_ pagerView: FSPagerView, cellForItemAt index: Int) -> FSPagerViewCell {
  64 + let cell = pagerView.dequeueReusableCell(withReuseIdentifier: kCNLliveShopDetailBannerCellID, at: index)
  65 + let imgUrl = self.shopDetailModel?.banner[index].simg!
  66 + cell.imageView?.kf.setImage(with: URL(string: imgUrl!))
  67 + return cell
  68 + }
  69 +}
metaCode/Classes/Main/HomePage/View/CNUpSlideDetailScrollView.swift 0 → 100644
  1 +//
  2 +// CNUpSlideDetailScrollView.swift
  3 +// metaCode
  4 +//
  5 +// Created by zx on 2023/10/16.
  6 +//
  7 +
  8 +import UIKit
  9 +
  10 +typealias enterBlock = (_ contentsMdl:CNLiveDownSlideContentsModel)->Void
  11 +
  12 +class CNUpSlideDetailScrollView: UIScrollView {
  13 + //返回首页
  14 + var callBack : enterBlock?
  15 +
  16 + let bgBackView = UIView()
  17 + let imageView = UIImageView()
  18 +
  19 + //slideModel
  20 + var _slideModel : CNLiveDownSlideModel?
  21 + var slideModel : CNLiveDownSlideModel? {
  22 + get{
  23 + _slideModel
  24 + }
  25 + set{
  26 + _slideModel = newValue!
  27 + self.setupNewUI(model: _slideModel!)
  28 + }
  29 + }
  30 +
  31 + override init(frame: CGRect) {
  32 + super.init(frame: frame)
  33 +
  34 + setupUI()
  35 + }
  36 +
  37 + required init?(coder aDecoder: NSCoder) {
  38 + fatalError("init(coder:) has not been implemented")
  39 + }
  40 +
  41 + private func setupUI() {
  42 + bgBackView.frame = CGRect(x: DownSlideRecommendLeftGap, y: 0,width:KSreenWidth , height:KSreenHeight)
  43 + imageView.frame = CGRect(x: 0,y: 0,width:KSreenWidth , height: KSreenWidth*DownSlideSingleCourseImgH/DownSlideSingleCourseW)
  44 + imageView.contentMode = .scaleAspectFill
  45 +
  46 + bgBackView.addSubview(imageView)
  47 + addSubview(bgBackView)
  48 +
  49 + contentSize = CGSize(width: KSreenWidth, height: bgBackView.height)
  50 + }
  51 +
  52 + func setupNewUI(model:CNLiveDownSlideModel){
  53 + if model.type == SlideModelTypeAllCourse12 {
  54 + //全部课程列表
  55 + let topTitleLbl = UILabel(frame: CGRect(x: DownSlideRecommendLeftGap, y: KStatusBarHeight+DownSlideRecommendLeftGap, width: DownSlideSingleCourseW-DownSlideRecommendLeftGap*2, height: 30))
  56 + topTitleLbl.text = model.blockName ?? "全部课程"
  57 + topTitleLbl.font = BoldFont_21
  58 + topTitleLbl.textColor = HexColor("#333333")
  59 + bgBackView.addSubview(topTitleLbl)
  60 +
  61 + //总块数
  62 + let contentsNum = model.contents.count
  63 + //model行数
  64 + let row = model.rowNum
  65 + //总显示块数
  66 + var totalNum = (contentsNum >= row) ? row : contentsNum
  67 + if row == 0{//row为0 , contents全部显示
  68 + totalNum = contentsNum
  69 + }
  70 + for i in 0..<totalNum{//i是第几行
  71 + let contentMdl = model.contents[i]
  72 +
  73 + //小icon
  74 + let imageView = UIImageView(frame: CGRectMake(DownSlideRecommendLeftGap, topTitleLbl.bottom+DownSlideRecommendLeftGap+CGFloat(i)*(DownSlideAllCourseRowTopYGap+DownSlideAllCourseRowImageWH+DownSlideAllCourseRowBottomYGap), CGFloat(DownSlideAllCourseRowImageWH), CGFloat(DownSlideAllCourseRowImageWH)))
  75 + imageView.kf.setImage(with: URL(string:contentMdl.poster ?? ""))
  76 + bgBackView.addSubview(imageView)
  77 +
  78 + let titleLbl = UILabel(frame: CGRect(x: imageView.right+DownSlideRecommendLeftGap, y: imageView.top, width: DownSlideSingleCourseW-90-imageView.right, height: 21))
  79 + titleLbl.text = contentMdl.title ?? "婴儿课程"
  80 + titleLbl.font = Font_15
  81 + titleLbl.textColor = HexColor("#333333")
  82 + bgBackView.addSubview(titleLbl)
  83 +
  84 + let subTitleLbl = UILabel(frame: CGRect(x: titleLbl.left, y:titleLbl.bottom+3 , width: titleLbl.width, height: 17))
  85 + subTitleLbl.text = contentMdl.subTitle ?? "适应3-6岁"
  86 + subTitleLbl.font = Font_12
  87 + subTitleLbl.textColor = HexColor("#999999")
  88 + bgBackView.addSubview(subTitleLbl)
  89 +
  90 + let enterBtn = UIButton(type: .custom)
  91 + enterBtn.frame = CGRect(x: subTitleLbl.right+10, y: 0, width: 65, height: 30)
  92 + enterBtn.centerY = imageView.centerY
  93 + enterBtn.setBackgroundImage(UIImage(named: "homepage_down_enter"), for: .normal)
  94 + enterBtn.setTitle("进入", for: .normal)
  95 + enterBtn.titleLabel?.font = BoldFont_13
  96 + enterBtn.setTitleColor(HexColor("#FFFFFF"), for: .normal)
  97 + enterBtn.addTarget(self, action: #selector(enterBtnAction(_:)), for: .touchUpInside)
  98 + enterBtn.tag = i
  99 + bgBackView.addSubview(enterBtn)
  100 + }
  101 + }else if model.type == SlideModelTypeOneCourse75 {
  102 + //单图课程
  103 +
  104 + let topTitleLbl = UILabel(frame: CGRect(x: 0, y: KStatusBarHeight+DownSlideRecommendLeftGap, width:bgBackView.width - 50 , height: 30))
  105 + topTitleLbl.text = model.contents[0].title ?? "婴儿课程"
  106 + topTitleLbl.font = BoldFont_21
  107 + topTitleLbl.textColor = HexColor("#FFFFFF")
  108 + imageView.addSubview(topTitleLbl)
  109 +
  110 + let topSubTitleLbl = UILabel(frame: CGRect(x: topTitleLbl.left, y:topTitleLbl.bottom , width: topTitleLbl.width, height: 30))
  111 + topSubTitleLbl.text = model.contents[0].subTitle ?? "适应3-6岁"
  112 + topSubTitleLbl.font = Font_12
  113 + topSubTitleLbl.textColor = HexColor("#FFFFFF")
  114 + imageView.addSubview(topSubTitleLbl)
  115 +
  116 + //总块数
  117 + let contentsNum = model.contents.count
  118 + //model行数
  119 + let row = model.rowNum
  120 + //总显示块数
  121 + var totalNum = (contentsNum >= row) ? row : contentsNum
  122 + if row == 0{//row为0 , contents全部显示
  123 + totalNum = contentsNum
  124 + }
  125 + for i in 0..<totalNum{//i是第几行
  126 + let contentMdl = model.contents[i]
  127 +
  128 + //小icon
  129 + let imgView = UIImageView(frame: CGRectMake(0, imageView.height+DownSlideRecommendLeftGap+CGFloat(i)*(DownSlideAllCourseRowTopYGap+DownSlideAllCourseRowImageWH+DownSlideAllCourseRowBottomYGap), CGFloat(DownSlideAllCourseRowImageWH), CGFloat(DownSlideAllCourseRowImageWH)))
  130 + imgView.kf.setImage(with: URL(string:contentMdl.poster ?? ""))
  131 + bgBackView.addSubview(imgView)
  132 +
  133 + let titleLbl = UILabel(frame: CGRect(x: imgView.right+DownSlideRecommendLeftGap, y: imgView.top, width: DownSlideSingleCourseW-90-imgView.right, height: 21))
  134 + titleLbl.text = contentMdl.title ?? "婴儿课程"
  135 + titleLbl.font = Font_15
  136 + titleLbl.textColor = HexColor("#333333")
  137 + bgBackView.addSubview(titleLbl)
  138 +
  139 + let subTitleLbl = UILabel(frame: CGRect(x: titleLbl.left, y:titleLbl.bottom+3 , width: titleLbl.width, height: 17))
  140 + subTitleLbl.text = contentMdl.subTitle ?? "适应3-6岁"
  141 + subTitleLbl.font = Font_12
  142 + subTitleLbl.textColor = HexColor("#999999")
  143 + bgBackView.addSubview(subTitleLbl)
  144 +
  145 + let enterBtn = UIButton(type: .custom)
  146 + enterBtn.frame = CGRect(x: subTitleLbl.right+10, y: 0, width: 65, height: 30)
  147 + enterBtn.centerY = imgView.centerY-5
  148 + enterBtn.setBackgroundImage(UIImage(named: "homepage_down_enter"), for: .normal)
  149 + enterBtn.setTitle("进入", for: .normal)
  150 + enterBtn.titleLabel?.font = BoldFont_13
  151 + enterBtn.setTitleColor(HexColor("#FFFFFF"), for: .normal)
  152 + enterBtn.addTarget(self, action: #selector(enterBtnAction(_:)), for: .touchUpInside)
  153 + enterBtn.tag = i
  154 + bgBackView.addSubview(enterBtn)
  155 + }
  156 + }
  157 + }
  158 +
  159 + //闭包:函数参数
  160 +// func callBackBlock(_ block: @escaping enterBlock) {
  161 +// block(_:)
  162 +// }
  163 +// func useBlock(){
  164 +// if callBack != nil {
  165 +// callBack!("闭包传值2")
  166 +// }
  167 +// }
  168 + //MARK: - 事件
  169 + @objc func enterBtnAction(_ sender: UIButton){
  170 + let tag = sender.tag
  171 + let contentMdl = (self.slideModel?.contents[tag])!
  172 + if callBack != nil {
  173 + let contentMdl1 = contentMdl
  174 + callBack!(contentMdl1)
  175 + }
  176 + }
  177 +}
metaCode/Classes/Main/HomePage/View/CNUpSlideView.swift
@@ -3,32 +3,60 @@ @@ -3,32 +3,60 @@
3 // metaCode 3 // metaCode
4 // 4 //
5 // Created by daojian on 2023/5/31. 5 // Created by daojian on 2023/5/31.
6 -// 6 +// 上滑后的下面页面
7 7
8 import Foundation 8 import Foundation
9 import WebKit 9 import WebKit
10 10
  11 +let UpDownTypeH5 = 1///h5
  12 +let UpDownTypePage = 2///原生page页面
  13 +let UpDownTypeShopDetail = 3///店铺详情
  14 +let UpDownTypeShopControlConsole = 4///店铺控制台
  15 +
11 ///上滑显示的VIew 16 ///上滑显示的VIew
12 class CNUpSlideView:UIView{ 17 class CNUpSlideView:UIView{
13 18
14 lazy var webView: WKWebView = { 19 lazy var webView: WKWebView = {
15 - let webView = WKWebView.init(frame: CGRectMake(10, 20, self.width - 20, self.height - 20)) 20 + let webView = WKWebView.init(frame: CGRectMake(10, KNavigationHeight+KStatusBarHeight+10, self.width - 20, self.height-KNavigationHeight-KStatusBarHeight-10))
16 webView.scrollView.showsVerticalScrollIndicator = false 21 webView.scrollView.showsVerticalScrollIndicator = false
17 webView.scrollView.showsHorizontalScrollIndicator = false 22 webView.scrollView.showsHorizontalScrollIndicator = false
18 webView.backgroundColor = .clear 23 webView.backgroundColor = .clear
  24 + webView.layer.cornerRadius = 29
  25 + webView.layer.maskedCorners = [.layerMinXMinYCorner, .layerMaxXMinYCorner]
  26 + webView.clipsToBounds = true
19 return webView 27 return webView
20 }() 28 }()
21 29
22 - var _url:String?  
23 - var url:String? { 30 + lazy var upSlideVC: CNLiveDownShopDetailController = {
  31 + let upSlideVC = CNLiveDownShopDetailController.init()
  32 + upSlideVC.view.width = KSreenWidth
  33 + upSlideVC.view.height = KSreenHeight
  34 + upSlideVC.view.backgroundColor = .white
  35 + return upSlideVC
  36 + }()
  37 +
  38 + var type:Int?
  39 +
  40 + var _downPath:String?
  41 + var downPath:String? {
24 get{ 42 get{
25 - return _url 43 + return _downPath
26 } 44 }
27 set{ 45 set{
28 - _url = newValue!  
29 - if (_url != ""){  
30 - let webUrl: URL! = URL.init(string: _url!)  
31 - webView.load(URLRequest.init(url:webUrl)) 46 + _downPath = newValue!
  47 + if(type == UpDownTypeH5){
  48 + self.addSubview(self.webView)
  49 + if (_downPath != ""){
  50 + let webUrl: URL! = URL.init(string: _downPath!)
  51 + webView.load(URLRequest.init(url:webUrl))
  52 + }
  53 + }
  54 + else if(type == UpDownTypePage){
  55 +
  56 + }else if(type == UpDownTypeShopDetail){
  57 + self.addSubview(self.upSlideVC.view)
  58 + }else if(type == UpDownTypeShopControlConsole){
  59 +
32 } 60 }
33 } 61 }
34 } 62 }
@@ -45,17 +73,8 @@ class CNUpSlideView:UIView{ @@ -45,17 +73,8 @@ class CNUpSlideView:UIView{
45 73
46 func initUI() 74 func initUI()
47 { 75 {
48 - self.backgroundColor = UIColor.white;  
49 - self.clipsToBounds = true;  
50 - self.layer.cornerRadius = 20;  
51 - self.addSubview(self.webView)  
52 -  
53 -  
54 -// let imageview : UIImageView = UIImageView.init(frame: CGRect(x: 20, y: 10, width: self.width - 40, height: self.height - 20))  
55 -// imageview.image = UIImage(named: "homePage_payMoneyImage")  
56 -//  
57 -// self.addSubview(imageview)  
58 - 76 + self.backgroundColor = UIColor.clear
  77 + self.layer.cornerRadius = 20
59 } 78 }
60 79
61 } 80 }
metaCode/Classes/Main/HomePage/ViewModel/CNLiveDownSlideViewModel.swift 0 → 100644
  1 +//
  2 +// CNLiveDownSlideViewModel.swift
  3 +// metaCode
  4 +//
  5 +// Created by zx on 2023/10/19.
  6 +//
  7 +
  8 +import Foundation
  9 +import CNLiveRequestBastKit
  10 +
  11 +enum CNLiveDownSlideResponseType {
  12 + case success
  13 + case failed
  14 + case noNetwork
  15 + case unkonw
  16 +}
  17 +typealias downSlideResultBlock = (_ result: Any,_ status:CNLiveDownSlideResponseType) -> Void
  18 +
  19 +class CNLiveDownSlideViewModel:NSObject{
  20 +
  21 + /// 获取下滑页原生页面数据
  22 + /// - Parameters:
  23 + /// - userId: 用户ID
  24 + /// - pageId: 页面ID
  25 + static func requestGetPage(pageId:NSString, resultBlock: @escaping downSlideResultBlock) {
  26 + let param = NSMutableDictionary()
  27 + param.setValue(UserInfoManager.shared.userInfo.uid, forKey: "userId")
  28 + param.setValue(pageId, forKey: "pageId")
  29 + CNLiveNetworking.setAllowRequestDefaultArgument(true)
  30 + CNLiveNetworking.setupShowDataResult(false)
  31 + CNLiveNetworking.requestNetwork(with: .GET, urlString: APPBaseCMSUrl+"/contentApi/getPage", param: param as! [String : String], cacheType: .networkOnly) { task, result, error in
  32 + hiddenLoading()
  33 + if (error == nil) {
  34 + let resp = result as! NSDictionary
  35 + let errorCode = "\(resp["errorCode"] ?? "0")"
  36 + if (errorCode == "0") {
  37 + let downSlideModelArr = resp["data"] as! NSArray
  38 + var modelArray:[BaseModel] = []
  39 + for downSlideDic in downSlideModelArr {
  40 + let downSlideModel = newDictionaryToModel(downSlideDic as! [String : Any], CNLiveDownSlideModel.self)
  41 + modelArray.append(downSlideModel)
  42 + }
  43 + resultBlock(modelArray,.success)
  44 + }
  45 + else{
  46 + resultBlock(NSNull(),.failed)
  47 + }
  48 + }
  49 + }
  50 + }
  51 +
  52 +}
metaCode/Classes/Main/HomePage/ViewModel/CNLiveShopConsoleViewModel.swift 0 → 100644
  1 +//
  2 +// CNLiveShopConsoleViewModel.swift
  3 +// metaCode
  4 +//
  5 +// Created by zx on 2023/10/27.
  6 +//
  7 +
  8 +import Foundation
  9 +import CNLiveRequestBastKit
  10 +
  11 +class CNLiveShopConsoleViewModel: NSObject {
  12 + /// 用户信息获取
  13 + /// - Parameters:
  14 + /// - userId: 用户ID
  15 + static func requestUserInfo(resultBlock: @escaping downSlideResultBlock) {
  16 + let param = NSMutableDictionary()
  17 + param.setValue(UserInfoManager.shared.userInfo.uid, forKey: "uid")
  18 + CNLiveNetworking.setAllowRequestDefaultArgument(true)
  19 + CNLiveNetworking.setupShowDataResult(false)
  20 + CNLiveNetworking.requestNetwork(with: .POST, urlString: APPBaseShopUrl+"/api/v1/isSellerNew", param: param as! [String : String], cacheType: .networkOnly) { task, result, error in
  21 + hiddenLoading()
  22 + if (error == nil) {
  23 + let resp = result as! NSDictionary
  24 + let dataDic = resp["data"] as! NSDictionary
  25 + let shopUserInfoModel = newDictionaryToModel(dataDic as! [String : Any], CNLiveShopUserInfoModel.self)
  26 + resultBlock(shopUserInfoModel,.success)
  27 + }else{
  28 + resultBlock(NSNull(),.failed)
  29 + }
  30 + }
  31 + }
  32 +}
metaCode/Classes/Main/HomePage/ViewModel/CNLiveShopDetailViewModel.swift 0 → 100644
  1 +//
  2 +// CNLiveShopDetailViewModel.swift
  3 +// metaCode
  4 +//
  5 +// Created by zx on 2023/10/31.
  6 +//
  7 +
  8 +import Foundation
  9 +import CNLiveRequestBastKit
  10 +
  11 +class CNLiveShopDetailViewModel:NSObject{
  12 + /// 店铺详情信息获取
  13 + /// - Parameters:
  14 + /// - userId: 用户ID
  15 + /// - storeId:餐厅店铺id 不是餐厅达人不需要传
  16 + static func requestShopDetailInfo(storeId:String?,resultBlock: @escaping downSlideResultBlock) {
  17 + let param = NSMutableDictionary()
  18 + param.setValue(UserInfoManager.shared.userInfo.uid, forKey: "uid")
  19 + param.setValue(storeId ?? "", forKey: "store_id")
  20 +
  21 + CNLiveNetworking.setAllowRequestDefaultArgument(true)
  22 + CNLiveNetworking.setupShowDataResult(false)
  23 + CNLiveNetworking.requestNetwork(with: .POST, urlString: APPBaseShopUrl+"/api/v1/index", param: param as! [String : String], cacheType: .networkOnly) { task, result, error in
  24 + hiddenLoading()
  25 + if (error == nil) {
  26 + let resp = result as! NSDictionary
  27 + let dataDic = resp["data"] as! NSDictionary
  28 + let shopDetailModel = newDictionaryToModel(dataDic as! [String : Any], CNLiveShopDetailModel.self)
  29 + resultBlock(shopDetailModel,.success)
  30 + }else{
  31 + resultBlock(NSNull(),.failed)
  32 + }
  33 + }
  34 + }
  35 +}
metaCode/Classes/Main/MinePage/ViewModel/CNLiveMineBaseModel.swift
@@ -148,13 +148,15 @@ final class StandListModel: BaseModel, TableCodable { @@ -148,13 +148,15 @@ final class StandListModel: BaseModel, TableCodable {
148 var descBackgroundImg: String = ""//首页文字背景图 148 var descBackgroundImg: String = ""//首页文字背景图
149 var cardImg: String = ""//卡片背景图 149 var cardImg: String = ""//卡片背景图
150 var cardBackgroundImg: String = ""//首页卡片背景图 150 var cardBackgroundImg: String = ""//首页卡片背景图
151 - var upPath: String = ""//顶部h5  
152 - var downPath: String = ""//底部h5 151 + var upPath: String = ""//顶部h5 或原生页面pageId
  152 + var upType: Int = 0//下滑类型1:h5 2:原生页面 3店铺详情 4 店铺控制台
  153 + var downType: Int = 0//上滑类型1:h5 2:原生页面 3店铺详情 4 店铺控制台
  154 + var downPath: String = ""//底部h5url 或原生页面pageId
153 var auth: Bool = false//身份是否验证 155 var auth: Bool = false//身份是否验证
154 156
155 var createTimeString: String = "" 157 var createTimeString: String = ""
156 var timeString: String = "" 158 var timeString: String = ""
157 - 159 +
158 override func mapping(mapper: HelpingMapper) { 160 override func mapping(mapper: HelpingMapper) {
159 mapper <<< 161 mapper <<<
160 self.createTime <-- TransformOf(fromJSON: { [weak self] (raw) -> Int in 162 self.createTime <-- TransformOf(fromJSON: { [weak self] (raw) -> Int in
metaCode/Classes/Main/Model/CNLiveDownSlideModel.swift 0 → 100644
  1 +//
  2 +// CNLiveDownSlideModel.swift
  3 +// metaCode
  4 +//
  5 +// Created by zx on 2023/10/19.
  6 +//
  7 +
  8 +import Foundation
  9 +
  10 +// !!!: /contentApi/getPage 接口数据
  11 +class CNLiveDownSlideModel: BaseModel {
  12 + ///大块标题id
  13 + var blockId: String?
  14 + ///大块标题
  15 + var blockName: String?
  16 + ///类型 type=4一排两个 74今日推荐 12列表全部课程 75单课程大图/
  17 + var type: String?
  18 + ///显示几行
  19 + var rowNum: Int = 0
  20 + ///具体内容 title subTitle poster thirdUrl或者shareUrl
  21 + var contents = [CNLiveDownSlideContentsModel]()
  22 + ///cell高度
  23 + var cellH: CGFloat = 0
  24 +}
  25 +
  26 +//下滑tableview背景颜色
  27 +let kCNDownSlideContentsModelModel1: String = "1"
  28 +let kCNDownSlideContentsModelModel2: String = "2"
  29 +let kCNDownSlideContentsModelModel3: String = "3"
  30 +let kCNDownSlideContentsModelModel4: String = "4"
  31 +let kCNDownSlideContentsModelModelAlbum: String = "album"
  32 +let kCNDownSlideContentsModelModelAlbum_video: String = "album_video"
  33 +let kCNDownSlideContentsModelModelAlbum_ugc: String = "album_ugc"
  34 +
  35 +class CNLiveDownSlideContentsModel: BaseModel {
  36 + ///内容id
  37 + var contentId: String?
  38 + ///主标题
  39 + var title: String?
  40 + ///副标题
  41 + var subTitle: String?
  42 + ///头像/
  43 + var poster: String?
  44 + ///videoId
  45 + var pid: String?
  46 + ///model
  47 + ///1,2时跳转:sharelUrl后面拼接 ?contentId=contentId&videoId=pid
  48 + ///3,4时跳转:thirdUrl
  49 + ///“album”,“album_video”,“album_ugc” -> http://wjjh5.cnlive.com/cnYmAlbumVideoList.html?aid=contentId&title=titlle
  50 + /// aid:专辑id,title:专辑名称(需要encode)
  51 + var model: String?
  52 + ///model为1,2时
  53 + var shareUrl: String?
  54 + ///model为3,4时跳转url
  55 + var thirdUrl: String?
  56 +}
metaCode/Classes/Main/Model/CNLiveShopConsoleModel.swift 0 → 100644
  1 +//
  2 +// CNLiveShopConsoleModel.swift
  3 +// metaCode
  4 +//
  5 +// Created by zx on 2023/10/28.
  6 +//
  7 +
  8 +import Foundation
  9 +///商城item类型
  10 +enum CNLiveShopConsoleType:Int {
  11 + ///商城新增商品
  12 + case XZSP,
  13 + ///商城商品管理
  14 + SPGL,
  15 + ///新增优惠券
  16 + XZYHQ,
  17 + ///管理优惠券
  18 + GLYHQ,
  19 + ///创建店铺分类
  20 + CreateShopClassify,
  21 + ///店铺分类管理
  22 + ShopClassifyManager,
  23 + ///发布动态
  24 + FBDT,
  25 + ///动态管理
  26 + DTGL,
  27 + ///商城订单管理
  28 + DDGL,
  29 + ///商城交易记录
  30 + JYJL,
  31 + ///直播管理
  32 + OnManagerment
  33 +
  34 +
  35 +// ///商城退款/售后
  36 +// SH,
  37 +// ///动态草稿箱
  38 +// CGX,
  39 +// ///餐品管理
  40 +// CPGL_REPAST,
  41 +// ///餐厅订单
  42 +// CTDD_REPAST,
  43 +// ///餐厅管理投诉/售后
  44 +// TSSH_REPAST,
  45 +// ///餐厅满减券
  46 +// MJQ_REPAST,
  47 +// ///餐厅管理
  48 +// CTGL_REPAST,
  49 +// ///餐厅商家配置
  50 +// SJPZ_REPAST,
  51 +//
  52 +}
  53 +
  54 +class CNLiveShopConsoleModel:BaseModel {
  55 + ///大分组
  56 + var list = [CNLiveShopConsoleListModel]()
  57 +
  58 + func initDataSource(){
  59 + var dataSource =
  60 + [["title":"商品管理",
  61 + "list":[
  62 + ["title":"新增商品", "subtitle":"创建新的商品", "simg":"DS_WB_XZSP", "type":0],
  63 + ["title":"商品管理", "subtitle":"管理现有的商品", "simg":"DS_WB_SPGL", "type":1]]],
  64 + ["title":"订单管理",
  65 + "list":[
  66 + ["title":"订单管理", "subtitle":"管理用户订单", "simg":"DS_WB_DDGL", "type":8]]],
  67 + ["title":"直播管理",
  68 + "list":[["title":"直播管理","subtitle":"申请创建直播","simg":"DS_WB_NO_Management","type":10]]]]
  69 + /**
  70 + var dataSource =
  71 + [["title":"商品管理",
  72 + "list":[
  73 + ["title":"新增商品", "subtitle":"创建新的商品", "simg":"DS_WB_XZSP", "type":0],
  74 + ["title":"商品管理", "subtitle":"管理现有的商品", "simg":"DS_WB_SPGL", "type":1],
  75 + ["title":"新增优惠券", "subtitle":"创建新增优惠券", "simg":"DS_WB_XZYHQ", "type":2],
  76 + ["title":"优惠券管理", "subtitle":"管理现有的优惠券", "simg":"DS_WB_GLYHQ", "type":3]]],
  77 + ["title":"分类管理",
  78 + "list":[
  79 + ["title":"创建店铺分类", "subtitle":"创建店铺分类", "simg":"DS_WB_SJPZ_REPAST", "type":4],
  80 + ["title":"店铺分类管理", "subtitle":"店铺分类管理", "simg":"DS_WB_DPFL", "type":5]]],
  81 + ["title":"动态管理",
  82 + "list":[
  83 + ["title":"发布动态", "subtitle":"发布新鲜动态", "simg":"DS_WB_FBDT", "type":6],
  84 + ["title":"动态管理", "subtitle":"管理现有动态", "simg":"DS_WB_DTGL", "type":7]]],
  85 + ["title":"订单管理",
  86 + "list":[
  87 + ["title":"订单管理", "subtitle":"管理用户订单", "simg":"DS_WB_DDGL", "type":8]]],
  88 + ["title":"交易管理",
  89 + "list":[
  90 + ["title":"交易记录", "subtitle":"查看交易记录", "simg":"DS_WB_JYJL", "type":9]]],
  91 + ["title":"直播管理",
  92 + "list":[["title":"直播管理","subtitle":"申请创建直播","simg":"DS_WB_NO_Management","type":10]]]]
  93 + */
  94 + for dic in dataSource{
  95 + let mdl = newDictionaryToModel(dic, CNLiveShopConsoleListModel.self)
  96 + list.append(mdl as! CNLiveShopConsoleListModel)
  97 +
  98 + }
  99 + }
  100 +
  101 +}
  102 +
  103 +class CNLiveShopConsoleListModel: BaseModel {
  104 + /// section标题
  105 + var title: String?
  106 + /// item list内容
  107 + var list = [CNLiveShopConsoleListContentModel]()
  108 +}
  109 +
  110 +class CNLiveShopConsoleListContentModel: BaseModel {
  111 + /// 图片
  112 + var simg: String?
  113 + /// 标题
  114 + var title: String?
  115 + /// 子标题
  116 + var subtitle: String?
  117 + /// 类型
  118 + var type:Int = 0//CNLiveShopConsoleType
  119 +}
metaCode/Classes/Main/Model/CNLiveShopDetailModel.swift 0 → 100644
  1 +//
  2 +// CNLiveShopDetailModel.swift
  3 +// metaCode
  4 +//
  5 +// Created by zx on 2023/10/31.
  6 +//
  7 +
  8 +import Foundation
  9 +
  10 +class CNLiveShopDetailModel:BaseModel{
  11 + ///banner
  12 + var banner = [CNLiveShopDetailBannerModel]()
  13 + ///是否显示申请入驻按钮组view
  14 + var is_show_btn: Bool?
  15 + ///是否显示用户信息view
  16 + var is_show_user: Bool?
  17 + ///是否显示退款订单推送提示红点
  18 + var is_show_tip: Bool?
  19 + ///快捷申请标题
  20 + var quick_title: String?
  21 + ///快捷申请url
  22 + var quick_url: String?
  23 + ///退款订单数
  24 + var order_return_num: String?
  25 + ///申请入驻按钮组
  26 + var btn = [CNLiveShopDetailBtnModel]()
  27 + ///用户信息
  28 + var user: CNLiveShopDetailUserModel?
  29 + ///空的话 跳转注册登录 有值的话 跳url
  30 + var user_btn: String?
  31 + ///是否为商家
  32 + var is_seller: Bool?
  33 + ///0老达人 1普通商家 2文创精品 3健康餐桌 8达人
  34 + var seller_type: Int = 0
  35 + ///商家数据
  36 + var seller_data: CNLiveShopDetailSellerDataModel?
  37 + ///达人动态
  38 + var dynamic = [CNLiveShopDetailDynamicModel]()
  39 + ///餐厅店铺信息
  40 + var foods_shop: CNLiveShopDetailFoodsShopModel?
  41 +}
  42 +
  43 +class CNLiveShopDetailBannerModel:BaseModel{
  44 + ///id
  45 + var id: String?
  46 + ///标题
  47 + var title: String?
  48 + ///图片
  49 + var simg: String?
  50 + ///1跳全屏url 其他不跳
  51 + var type: String?
  52 + ///url
  53 + var url: String?
  54 +}
  55 +
  56 +class CNLiveShopDetailBtnModel:BaseModel{
  57 + ///标题
  58 + var title: String?
  59 + ///图片
  60 + var image: String?
  61 + ///url
  62 + var url: String?
  63 +}
  64 +
  65 +class CNLiveShopDetailUserModel:BaseModel{
  66 + ///0 未申请过 1 未提交 2 审核中 3 审核拒绝 4 审核通过
  67 + var state: Int = 0
  68 + ///头像
  69 + var user_img: String?
  70 + ///名称
  71 + var username: String?
  72 +}
  73 +
  74 +class CNLiveShopDetailSellerDataModel:BaseModel{
  75 + ///每日订单数
  76 + var day_order: Int = 0
  77 + ///每日订单金额
  78 + var day_order_money: String?
  79 + ///电商剩余金额
  80 + var shop_money: String?
  81 + ///老达人余额
  82 + var daren_money: String?
  83 + ///总余额
  84 + var total_money: String?
  85 +
  86 +}
  87 +
  88 +class CNLiveShopDetailDynamicModel:BaseModel{
  89 + ///动态id
  90 + var id: String?
  91 + ///动态内容
  92 + var title: String?
  93 + ///用户id
  94 + var uid: String?
  95 + ///发布时间
  96 + var addtime: Double?
  97 + ///经度
  98 + var longitude: String?
  99 + ///纬度
  100 + var latitude: String?
  101 + ///浏览数
  102 + var pv: Int = 0
  103 + ///点赞数
  104 + var upper: Int = 0
  105 + ///评论数
  106 + var comment: Int = 0
  107 + ///定位
  108 + var location: String?
  109 + ///视频
  110 + var video: String?
  111 + ///是否点赞 1点赞 0没点
  112 + var is_upper: Bool?
  113 + ///是否显示 1显示 0隐藏
  114 + var state: Bool?
  115 + ///商品id
  116 + var goods_id: String?
  117 + ///视频封面图
  118 + var video_img: String?
  119 + ///封面图数组
  120 + var img = [Array<String>]()
  121 + ///达人信息
  122 + var shop_user: CNLiveShopDetailDynamicShopUserModel?
  123 + ///热门评论
  124 + var comment_content: CNLiveShopDetailDynamicCommentModel?
  125 + ///商品
  126 + var goods: CNLiveShopDetailDynamicGoodsModel?
  127 +}
  128 +
  129 +// MARK: - 达人数据
  130 +class CNLiveShopDetailDynamicShopUserModel:BaseModel{
  131 + ///店铺id
  132 + var id: String?
  133 + ///达人名称
  134 + var title: String?
  135 + ///达人头像
  136 + var logo: String?
  137 + ///达人id
  138 + var uid: String?
  139 +}
  140 +
  141 +// MARK: - 热门评论
  142 +class CNLiveShopDetailDynamicCommentModel:BaseModel{
  143 + ///评论id
  144 + var id: String?
  145 + ///用户id
  146 + var uid: String?
  147 + ///评论内容
  148 + var content: String?
  149 + ///评论时间
  150 + var addtime: Double?
  151 + ///点赞数
  152 + var upper: Int = 0
  153 +}
  154 +
  155 +// MARK: - 商品
  156 +class CNLiveShopDetailDynamicGoodsModel:BaseModel{
  157 + ///商品id
  158 + var id: String?
  159 + ///商品标题
  160 + var title: String?
  161 + ///1普通商品 2文创商品
  162 + var shop_type: String?
  163 + ///
  164 + var type: String?
  165 + ///
  166 + var to: String?
  167 + ///现价
  168 + var price: String?
  169 + ///原价
  170 + var prices: String?
  171 + ///广告语
  172 + var ads: String?
  173 + ///商品封面
  174 + var simg: String?
  175 +}
  176 +
  177 +// MARK: - 餐厅店铺信息
  178 +class CNLiveShopDetailFoodsShopModel:BaseModel{
  179 + ///店铺名称
  180 + var title: String?
  181 + ///店铺id
  182 + var id: String?
  183 +}
  184 +
  185 +
  186 +
metaCode/Classes/Main/Model/CNLiveShopUserInfoModel.swift 0 → 100644
  1 +//
  2 +// CNLiveShopUserInfoModel.swift
  3 +// metaCode
  4 +//
  5 +// Created by zx on 2023/10/27.
  6 +//
  7 +
  8 +import Foundation
  9 +
  10 +//获取用户信息
  11 +class CNLiveShopUserInfoModel:BaseModel{
  12 + ///darenid生成付款码时用到
  13 + var daren_id: String?
  14 + ///uid 用于请求老达人信息接口
  15 + var daren_uid: String?
  16 + ///id
  17 + var id: String?
  18 + ///链接im的id daren_XXXXX
  19 + var im_id: String?
  20 + ///0 未申请过 1 未提交 2 审核中 3 审核拒绝 4 审核通过(type==0踢出)
  21 + var state: String?
  22 + ///0 老达人 1 普通商家 2 文创精品 3 健康餐桌 8 达人
  23 + var type: String?
  24 + ///达人申请地址
  25 + var url: String?
  26 + ///链接im的token
  27 + var token: String?
  28 + ///商家是否可用 1可用 0禁用(禁用踢出)
  29 + var is_able: String?
  30 + ///商家昵称
  31 + var title: String?
  32 + ///商家logo
  33 + var logo: String?
  34 +}
  35 +/**
  36 + Printing description of ((__NSDictionaryI *)0x000000010884eca0):
  37 + {
  38 + "daren_id" = "daren_10505455";
  39 + "daren_uid" = 10505455;
  40 + id = 219;
  41 + "im_id" = "daren_10505455";
  42 + "is_able" = 0;
  43 + logo = "https://wjj.ys2.cnliveimg.com/769/shop/img/2021/01/06/5ff567b950c9a";
  44 + qqUid = "";
  45 + sinaUid = "";
  46 + state = 4;
  47 + title = "\U4e1c\U5317\U5473\U9053";
  48 + token = "eJxNjl1PgzAYhf9LbzXaFkqKiRcEyAZjZvNjmYlJU9dOOzJo2so6jP9dRrbo7fOc9z3nGzxXTzd8s2m-GsfcUUtwByC4HrESsnFqq6QZoOBGNgxBAklIyDnBtVaCcccCI-4dWlGzUQ0MhRBCgiJ6kdJrZSTjWzf*xSTGQ*IsO2msapsTh4ggHED4J53an*ahKKYBpRGNLnXqY8Dz-CUtct7b-atHWPr34uqQpCV9zPtliKu67H2c6WCxK99uU*jmNlF54goVrq3Pp369yFzX0VDvspmnq3oSZ*3xUE3l54wuVw8Teg9*fgGu0Fnz";
  49 + type = 8;
  50 + uid = 10505455;
  51 + url = "https://managemall.cnlive.com/html/preferred-library-b/1/#/pages/checkIt/checkIt?redirect=daren";
  52 + wxUid = "oBAMNt5Phwrb_kWID0EyxYsZU3d0";
  53 + }
  54 + */
metaCode/Classes/Main/Util/CNLiveAdaptTool.swift 0 → 100644
  1 +//
  2 +// CNLiveAdaptTool.swift
  3 +// metaCode
  4 +//
  5 +// Created by zx on 2023/11/2.
  6 +//
  7 +
  8 +import Foundation
  9 +
  10 +class CNLiveAdaptTool:NSObject{
  11 + class func adaptLength(length:CGFloat) -> CGFloat{
  12 +
  13 + let multiple = KSreenWidth / 375.0
  14 + let f_adapt_length = floor(length * multiple)
  15 + return f_adapt_length
  16 + }
  17 +}
metaCode/Classes/Main/Util/CNLiveDownSlideModelLayout.swift 0 → 100644
  1 +//
  2 +// CNLiveDownSlideModelLayout.swift
  3 +// metaCode
  4 +//
  5 +// Created by zx on 2023/10/23.
  6 +//
  7 +
  8 +import Foundation
  9 +
  10 +
  11 +class CNLiveDownSlideModelLayout:NSObject{
  12 +
  13 + ///cell高度
  14 + var cellH:CGFloat = 0.0
  15 +
  16 + //slideModel
  17 + var _slideModel : CNLiveDownSlideModel?
  18 + var slideModel : CNLiveDownSlideModel? {
  19 + get{
  20 + _slideModel
  21 + }
  22 + set{
  23 + _slideModel = newValue
  24 + }
  25 + }
  26 +
  27 + init(model:CNLiveDownSlideModel){
  28 + super.init()
  29 + self.slideModel = model
  30 + //总块数
  31 + let contentsNum = model.contents.count
  32 + //model行数
  33 + let row = model.rowNum
  34 + if(_slideModel?.type == SlideModelTypeRecommend4){//推荐活动,推荐课程
  35 +
  36 + //总显示块数/循环数
  37 + var totalNum = (contentsNum >= row*2) ? row*2 : contentsNum
  38 + if row == 0{//row为0 , contents全部显示
  39 + totalNum = contentsNum
  40 + }
  41 + _slideModel?.cellH = ceil(CGFloat(totalNum)*0.5)*(DownSlideRecommendWH + DownSlideRecommendLeftGap)
  42 + }else if(_slideModel?.type == SlideModelTypeTodayRecommend74){//今日推荐
  43 + //总显示块数/循环数
  44 + var totalNum = (contentsNum >= row) ? row : contentsNum
  45 + if row == 0{//row为0 , contents全部显示
  46 + totalNum = contentsNum
  47 + }
  48 + _slideModel?.cellH = CGFloat(totalNum)*(DownSlideTodayRecommendH + DownSlideRecommendLeftGap)
  49 + }else if(_slideModel?.type == SlideModelTypeAllCourse12){//全部课程
  50 +
  51 + _slideModel?.cellH = DownSlideAllCourseTitleH + DownSlideAllCourseRowH * CGFloat(_slideModel!.rowNum)+DownSlideRecommendLeftGap
  52 +
  53 + }else if(_slideModel?.type == SlideModelTypeOneCourse75){//单节课程
  54 +
  55 + _slideModel?.cellH = DownSlideSingleCourseImgH + DownSlideSingleCourseMoreH+DownSlideRecommendLeftGap
  56 + }else{
  57 + _slideModel?.cellH = 0
  58 + }
  59 + }
  60 + func getCellHModel()->CNLiveDownSlideModel{
  61 + return _slideModel!
  62 + }
  63 +
  64 +}
metaCode/Classes/Main/Util/CNLiveDownSlideTool.swift 0 → 100644
  1 +//
  2 +// CNLiveDownSlideTool.swift
  3 +// metaCode
  4 +//
  5 +// Created by zx on 2023/10/25.
  6 +//
  7 +
  8 +import Foundation
  9 +
  10 +class CNLiveDownSlideTool:NSObject{
  11 + class func pushWebVCWithContentsMdl(contentMdl:CNLiveDownSlideContentsModel){
  12 +
  13 + if (contentMdl.model == kCNDownSlideContentsModelModel1) || (contentMdl.model == kCNDownSlideContentsModelModel2){
  14 +
  15 + let queryItem = URLQueryItem(name: "contentId", value: contentMdl.contentId)
  16 + let queryItem1 = URLQueryItem(name: "videoId", value: contentMdl.pid)
  17 + let urlComponents = NSURLComponents(string: (contentMdl.shareUrl)!)!
  18 + urlComponents.queryItems = [queryItem, queryItem1]
  19 + let regURL = urlComponents.url
  20 + let webVC = CNWebViewController()
  21 + webVC.url = regURL
  22 + currentViewController()?.navigationController?.pushViewController(webVC, animated: true)
  23 +
  24 + }else if (contentMdl.model == kCNDownSlideContentsModelModel3) || (contentMdl.model == kCNDownSlideContentsModelModel4){
  25 + let webVC = CNWebViewController()
  26 + webVC.url = URL(string: (contentMdl.thirdUrl)!)
  27 + currentViewController()?.navigationController?.pushViewController(webVC, animated: true)
  28 + }else if (contentMdl.model == kCNDownSlideContentsModelModelAlbum) || (contentMdl.model == kCNDownSlideContentsModelModelAlbum_ugc) || (contentMdl.model == kCNDownSlideContentsModelModelAlbum_video){
  29 +
  30 + let urlString = "http://wjjh5.cnlive.com/cnYmAlbumVideoList.html"
  31 + let queryItem = URLQueryItem(name: "aid", value: contentMdl.contentId)
  32 + let queryItem1 = URLQueryItem(name: "title", value: contentMdl.title)
  33 + let urlComponents = NSURLComponents(string: urlString)
  34 + urlComponents!.queryItems = [queryItem, queryItem1]
  35 + let regURL = urlComponents?.url
  36 + let webVC = CNWebViewController()
  37 + webVC.url = regURL
  38 + currentViewController()?.navigationController?.pushViewController(webVC, animated: true)
  39 + }else{
  40 + return
  41 + }
  42 + }
  43 +
  44 + class func detailPushWebVCWithContentsMdl(contentMdl:CNLiveDownSlideContentsModel,viewController:UIViewController){
  45 +
  46 + if (contentMdl.model == kCNDownSlideContentsModelModel1) || (contentMdl.model == kCNDownSlideContentsModelModel2){
  47 +
  48 + let queryItem = URLQueryItem(name: "contentId", value: contentMdl.contentId)
  49 + let queryItem1 = URLQueryItem(name: "videoId", value: contentMdl.pid)
  50 + let urlComponents = NSURLComponents(string: (contentMdl.shareUrl)!)!
  51 + urlComponents.queryItems = [queryItem, queryItem1]
  52 + let regURL = urlComponents.url
  53 + let webVC = CNWebViewController()
  54 + webVC.url = regURL
  55 + viewController.navigationController?.pushViewController(webVC, animated: true)
  56 +
  57 + }else if (contentMdl.model == kCNDownSlideContentsModelModel3) || (contentMdl.model == kCNDownSlideContentsModelModel4){
  58 + let webVC = CNWebViewController()
  59 + webVC.url = URL(string: (contentMdl.thirdUrl)!)
  60 + viewController.navigationController?.pushViewController(webVC, animated: true)
  61 + }else if (contentMdl.model == kCNDownSlideContentsModelModelAlbum) || (contentMdl.model == kCNDownSlideContentsModelModelAlbum_ugc) || (contentMdl.model == kCNDownSlideContentsModelModelAlbum_video){
  62 +
  63 + let urlString = "http://wjjh5.cnlive.com/cnYmAlbumVideoList.html"
  64 + let queryItem = URLQueryItem(name: "aid", value: contentMdl.contentId)
  65 + let queryItem1 = URLQueryItem(name: "title", value: contentMdl.title)
  66 + let urlComponents = NSURLComponents(string: urlString)
  67 + urlComponents!.queryItems = [queryItem, queryItem1]
  68 + let regURL = urlComponents?.url
  69 + let webVC = CNWebViewController()
  70 + webVC.url = regURL
  71 + viewController.navigationController?.pushViewController(webVC, animated: true)
  72 + }else{
  73 + return
  74 + }
  75 + }
  76 +}
metaCode/Classes/Main/Util/CNUpSlideAnimationTransition.swift 0 → 100644
  1 +//
  2 +// CNUpSlideAnimationTransition.swift
  3 +// metaCode
  4 +//
  5 +// Created by zx on 2023/10/16.
  6 +//
  7 +
  8 +import UIKit
  9 +
  10 +fileprivate let transitonDuration: TimeInterval = 1.0
  11 +
  12 +
  13 +enum AnimationType {
  14 + case present
  15 + case dismiss
  16 +}
  17 +
  18 +class CNUpSlideAnimationTransition: NSObject {
  19 + let animationType: AnimationType!
  20 +
  21 + init(animationType: AnimationType) {
  22 + self.animationType = animationType
  23 + super.init()
  24 + }
  25 +}
  26 +
  27 +extension CNUpSlideAnimationTransition: UIViewControllerAnimatedTransitioning {
  28 + func transitionDuration(using transitionContext: UIViewControllerContextTransitioning?) -> TimeInterval {
  29 + return transitonDuration
  30 + }
  31 +
  32 + func animateTransition(using transitionContext: UIViewControllerContextTransitioning) {
  33 + if animationType == .present {
  34 + animationForPresent(using: transitionContext)
  35 + } else {
  36 + animationForDismiss(using: transitionContext)
  37 + }
  38 + }
  39 +
  40 + func animationForPresent(using transitionContext: UIViewControllerContextTransitioning) {
  41 + let containerView = transitionContext.containerView
  42 + //1.Get fromVC and toVC
  43 + guard let fromVC = transitionContext.viewController(forKey: .from) as? CNUpSlideViewController else { return }
  44 + guard let toNaviVC = transitionContext.viewController(forKey: .to) as? CNSlideBaseNavigationController else { return }
  45 + guard let selectedCell = fromVC.selectedCell else { return }
  46 + let toVC = toNaviVC.topViewController as! CNUpSlideDetailViewController
  47 + let frame = selectedCell.convert(selectedCell.bgBackView.frame, to: fromVC.view)
  48 + //2.Set presentation original size.
  49 + toVC.view.frame = frame
  50 + toVC.scrollView.imageView.frame.size.width = GlobalConstants.todayCardSize.width
  51 + toVC.scrollView.imageView.frame.size.height = GlobalConstants.todayCardSize.height
  52 +
  53 + containerView.addSubview(toNaviVC.view)
  54 +
  55 + //3.Change original size to final size with animation.
  56 + UIView.animate(withDuration: transitonDuration, delay: 0, usingSpringWithDamping: 0.5, initialSpringVelocity: 0, options: [], animations: {
  57 + toVC.view.frame = UIScreen.main.bounds
  58 + toVC.scrollView.imageView.frame.size.width = KSreenWidth
  59 + toVC.scrollView.imageView.frame.size.height = KSreenWidth*DownSlideSingleCourseImgH/DownSlideSingleCourseW
  60 + toVC.closeBtn.alpha = 1
  61 +
  62 + }) { (completed) in
  63 + transitionContext.completeTransition(completed)
  64 + }
  65 + }
  66 +
  67 + func animationForDismiss(using transitionContext: UIViewControllerContextTransitioning) {
  68 + guard let fromNaviVC = transitionContext.viewController(forKey: .from) as? CNSlideBaseNavigationController else { return }
  69 + guard let toVC = transitionContext.viewController(forKey: .to) as? CNUpSlideViewController else { return }
  70 + guard let selectedCell = toVC.selectedCell else { return }
  71 + let fromVC = fromNaviVC.topViewController as! CNUpSlideDetailViewController
  72 +
  73 + UIView.animate(withDuration: transitonDuration - 0.3, delay: 0, usingSpringWithDamping: 0.8, initialSpringVelocity: 0, options: [], animations: {
  74 + let frame = selectedCell.convert(selectedCell.bgBackView.frame, to: toVC.view)
  75 + fromVC.view.frame = frame
  76 + fromVC.view.layer.cornerRadius = GlobalConstants.toDayCardCornerRadius
  77 + fromVC.scrollView.imageView.frame.size.width = GlobalConstants.todayCardSize.width
  78 + fromVC.scrollView.imageView.frame.size.height = GlobalConstants.todayCardSize.height
  79 + fromVC.closeBtn.alpha = 0
  80 +
  81 + }) { (completed) in
  82 + transitionContext.completeTransition(completed)
  83 + }
  84 + }
  85 +
  86 +}
metaCode/Classes/Other/AppDelegate.swift
@@ -68,7 +68,7 @@ class AppDelegate: UIResponder, UIApplicationDelegate { @@ -68,7 +68,7 @@ class AppDelegate: UIResponder, UIApplicationDelegate {
68 let ver : String = Bundle.main.infoDictionary?["CFBundleVersion"] as! String 68 let ver : String = Bundle.main.infoDictionary?["CFBundleVersion"] as! String
69 let p : Dictionary = ["platform_id":kAppBundleID,"uuid":uuid,"plat":"i","ver":ver,"appId":APPId,"timestamp":String(NSNumber(floatLiteral: Date().timeIntervalSince1970).intValue),"clientPlat":"i","frmId":"ios"] 69 let p : Dictionary = ["platform_id":kAppBundleID,"uuid":uuid,"plat":"i","ver":ver,"appId":APPId,"timestamp":String(NSNumber(floatLiteral: Date().timeIntervalSince1970).intValue),"clientPlat":"i","frmId":"ios"]
70 CNLiveNetworking.setupDefaultParam(p) 70 CNLiveNetworking.setupDefaultParam(p)
71 - 71 +
72 let shop_dic : Dictionary = ["Phone-Model":"iPhone","Uid":UserInfoManager.shared.userInfo.uid ,"CFBundleShortVersionString":ver,"Shop-Version":"0.6.2"] 72 let shop_dic : Dictionary = ["Phone-Model":"iPhone","Uid":UserInfoManager.shared.userInfo.uid ,"CFBundleShortVersionString":ver,"Shop-Version":"0.6.2"]
73 CNLiveNetworking.setupDSShopParam(shop_dic) 73 CNLiveNetworking.setupDSShopParam(shop_dic)
74 CNLiveNetworking.setRequestTimeoutInterval(10) 74 CNLiveNetworking.setRequestTimeoutInterval(10)
metaCode/Supporting Files/Assets.xcassets/Home/DS_WB_DDGL.imageset/Contents.json 0 → 100644
  1 +{
  2 + "images" : [
  3 + {
  4 + "idiom" : "universal",
  5 + "scale" : "1x"
  6 + },
  7 + {
  8 + "filename" : "DS_WB_DDGL@2x.png",
  9 + "idiom" : "universal",
  10 + "scale" : "2x"
  11 + },
  12 + {
  13 + "idiom" : "universal",
  14 + "scale" : "3x"
  15 + }
  16 + ],
  17 + "info" : {
  18 + "author" : "xcode",
  19 + "version" : 1
  20 + }
  21 +}
metaCode/Supporting Files/Assets.xcassets/Home/DS_WB_DDGL.imageset/DS_WB_DDGL@2x.png 0 → 100644

2 KB

metaCode/Supporting Files/Assets.xcassets/Home/DS_WB_DPFL.imageset/Contents.json 0 → 100644
  1 +{
  2 + "images" : [
  3 + {
  4 + "idiom" : "universal",
  5 + "scale" : "1x"
  6 + },
  7 + {
  8 + "filename" : "DS_WB_DPFL@2x.png",
  9 + "idiom" : "universal",
  10 + "scale" : "2x"
  11 + },
  12 + {
  13 + "idiom" : "universal",
  14 + "scale" : "3x"
  15 + }
  16 + ],
  17 + "info" : {
  18 + "author" : "xcode",
  19 + "version" : 1
  20 + }
  21 +}
metaCode/Supporting Files/Assets.xcassets/Home/DS_WB_DPFL.imageset/DS_WB_DPFL@2x.png 0 → 100644

1013 Bytes

metaCode/Supporting Files/Assets.xcassets/Home/DS_WB_DTGL.imageset/Contents.json 0 → 100644
  1 +{
  2 + "images" : [
  3 + {
  4 + "idiom" : "universal",
  5 + "scale" : "1x"
  6 + },
  7 + {
  8 + "filename" : "DS_WB_DTGL@2x.png",
  9 + "idiom" : "universal",
  10 + "scale" : "2x"
  11 + },
  12 + {
  13 + "idiom" : "universal",
  14 + "scale" : "3x"
  15 + }
  16 + ],
  17 + "info" : {
  18 + "author" : "xcode",
  19 + "version" : 1
  20 + }
  21 +}
metaCode/Supporting Files/Assets.xcassets/Home/DS_WB_DTGL.imageset/DS_WB_DTGL@2x.png 0 → 100644

2.41 KB

metaCode/Supporting Files/Assets.xcassets/Home/DS_WB_FBDT.imageset/Contents.json 0 → 100644
  1 +{
  2 + "images" : [
  3 + {
  4 + "idiom" : "universal",
  5 + "scale" : "1x"
  6 + },
  7 + {
  8 + "filename" : "DS_WB_FBDT@2x.png",
  9 + "idiom" : "universal",
  10 + "scale" : "2x"
  11 + },
  12 + {
  13 + "idiom" : "universal",
  14 + "scale" : "3x"
  15 + }
  16 + ],
  17 + "info" : {
  18 + "author" : "xcode",
  19 + "version" : 1
  20 + }
  21 +}
metaCode/Supporting Files/Assets.xcassets/Home/DS_WB_FBDT.imageset/DS_WB_FBDT@2x.png 0 → 100644

1.07 KB

metaCode/Supporting Files/Assets.xcassets/Home/DS_WB_GLYHQ.imageset/Contents.json 0 → 100644
  1 +{
  2 + "images" : [
  3 + {
  4 + "idiom" : "universal",
  5 + "scale" : "1x"
  6 + },
  7 + {
  8 + "filename" : "DS_WB_GLYHQ@2x.png",
  9 + "idiom" : "universal",
  10 + "scale" : "2x"
  11 + },
  12 + {
  13 + "idiom" : "universal",
  14 + "scale" : "3x"
  15 + }
  16 + ],
  17 + "info" : {
  18 + "author" : "xcode",
  19 + "version" : 1
  20 + }
  21 +}
metaCode/Supporting Files/Assets.xcassets/Home/DS_WB_GLYHQ.imageset/DS_WB_GLYHQ@2x.png 0 → 100644

2.68 KB

metaCode/Supporting Files/Assets.xcassets/Home/DS_WB_JYJL.imageset/Contents.json 0 → 100644
  1 +{
  2 + "images" : [
  3 + {
  4 + "idiom" : "universal",
  5 + "scale" : "1x"
  6 + },
  7 + {
  8 + "filename" : "DS_WB_JYJL@2x.png",
  9 + "idiom" : "universal",
  10 + "scale" : "2x"
  11 + },
  12 + {
  13 + "idiom" : "universal",
  14 + "scale" : "3x"
  15 + }
  16 + ],
  17 + "info" : {
  18 + "author" : "xcode",
  19 + "version" : 1
  20 + }
  21 +}
metaCode/Supporting Files/Assets.xcassets/Home/DS_WB_JYJL.imageset/DS_WB_JYJL@2x.png 0 → 100644

2.21 KB

metaCode/Supporting Files/Assets.xcassets/Home/DS_WB_NO_Management.imageset/Contents.json 0 → 100644
  1 +{
  2 + "images" : [
  3 + {
  4 + "idiom" : "universal",
  5 + "scale" : "1x"
  6 + },
  7 + {
  8 + "filename" : "DS_WB_NO_Management@2x.png",
  9 + "idiom" : "universal",
  10 + "scale" : "2x"
  11 + },
  12 + {
  13 + "idiom" : "universal",
  14 + "scale" : "3x"
  15 + }
  16 + ],
  17 + "info" : {
  18 + "author" : "xcode",
  19 + "version" : 1
  20 + }
  21 +}
metaCode/Supporting Files/Assets.xcassets/Home/DS_WB_NO_Management.imageset/DS_WB_NO_Management@2x.png 0 → 100644

2.04 KB

metaCode/Supporting Files/Assets.xcassets/Home/DS_WB_SJPZ_REPAST.imageset/Contents.json 0 → 100644
  1 +{
  2 + "images" : [
  3 + {
  4 + "idiom" : "universal",
  5 + "scale" : "1x"
  6 + },
  7 + {
  8 + "filename" : "DS_WB_SJPZ_REPAST@2x.png",
  9 + "idiom" : "universal",
  10 + "scale" : "2x"
  11 + },
  12 + {
  13 + "idiom" : "universal",
  14 + "scale" : "3x"
  15 + }
  16 + ],
  17 + "info" : {
  18 + "author" : "xcode",
  19 + "version" : 1
  20 + }
  21 +}
metaCode/Supporting Files/Assets.xcassets/Home/DS_WB_SJPZ_REPAST.imageset/DS_WB_SJPZ_REPAST@2x.png 0 → 100644

2.18 KB

metaCode/Supporting Files/Assets.xcassets/Home/DS_WB_SPGL.imageset/Contents.json 0 → 100644
  1 +{
  2 + "images" : [
  3 + {
  4 + "idiom" : "universal",
  5 + "scale" : "1x"
  6 + },
  7 + {
  8 + "filename" : "DS_WB_SPGL@2x.png",
  9 + "idiom" : "universal",
  10 + "scale" : "2x"
  11 + },
  12 + {
  13 + "idiom" : "universal",
  14 + "scale" : "3x"
  15 + }
  16 + ],
  17 + "info" : {
  18 + "author" : "xcode",
  19 + "version" : 1
  20 + }
  21 +}
metaCode/Supporting Files/Assets.xcassets/Home/DS_WB_SPGL.imageset/DS_WB_SPGL@2x.png 0 → 100644

2.11 KB

metaCode/Supporting Files/Assets.xcassets/Home/DS_WB_XZSP.imageset/Contents.json 0 → 100644
  1 +{
  2 + "images" : [
  3 + {
  4 + "idiom" : "universal",
  5 + "scale" : "1x"
  6 + },
  7 + {
  8 + "filename" : "DS_WB_XZSP@2x.png",
  9 + "idiom" : "universal",
  10 + "scale" : "2x"
  11 + },
  12 + {
  13 + "idiom" : "universal",
  14 + "scale" : "3x"
  15 + }
  16 + ],
  17 + "info" : {
  18 + "author" : "xcode",
  19 + "version" : 1
  20 + }
  21 +}
metaCode/Supporting Files/Assets.xcassets/Home/DS_WB_XZSP.imageset/DS_WB_XZSP@2x.png 0 → 100644

1.32 KB

metaCode/Supporting Files/Assets.xcassets/Home/DS_WB_XZYHQ.imageset/Contents.json 0 → 100644
  1 +{
  2 + "images" : [
  3 + {
  4 + "idiom" : "universal",
  5 + "scale" : "1x"
  6 + },
  7 + {
  8 + "filename" : "DS_WB_XZYHQ@2x.png",
  9 + "idiom" : "universal",
  10 + "scale" : "2x"
  11 + },
  12 + {
  13 + "idiom" : "universal",
  14 + "scale" : "3x"
  15 + }
  16 + ],
  17 + "info" : {
  18 + "author" : "xcode",
  19 + "version" : 1
  20 + }
  21 +}
metaCode/Supporting Files/Assets.xcassets/Home/DS_WB_XZYHQ.imageset/DS_WB_XZYHQ@2x.png 0 → 100644

2.96 KB

metaCode/Supporting Files/Assets.xcassets/Home/close_button.imageset/Contents.json 0 → 100644
  1 +{
  2 + "images" : [
  3 + {
  4 + "idiom" : "universal",
  5 + "scale" : "1x"
  6 + },
  7 + {
  8 + "filename" : "close_button@2x.png",
  9 + "idiom" : "universal",
  10 + "scale" : "2x"
  11 + },
  12 + {
  13 + "idiom" : "universal",
  14 + "scale" : "3x"
  15 + }
  16 + ],
  17 + "info" : {
  18 + "author" : "xcode",
  19 + "version" : 1
  20 + }
  21 +}
metaCode/Supporting Files/Assets.xcassets/Home/close_button.imageset/close_button@2x.png 0 → 100644

1.14 KB

metaCode/Supporting Files/Assets.xcassets/Home/homepage_down_enter.imageset/Contents.json 0 → 100644
  1 +{
  2 + "images" : [
  3 + {
  4 + "idiom" : "universal",
  5 + "scale" : "1x"
  6 + },
  7 + {
  8 + "filename" : "homepage_down_enter@2x.png",
  9 + "idiom" : "universal",
  10 + "scale" : "2x"
  11 + },
  12 + {
  13 + "idiom" : "universal",
  14 + "scale" : "3x"
  15 + }
  16 + ],
  17 + "info" : {
  18 + "author" : "xcode",
  19 + "version" : 1
  20 + }
  21 +}
metaCode/Supporting Files/Assets.xcassets/Home/homepage_down_enter.imageset/homepage_down_enter@2x.png 0 → 100644

2.18 KB

metaCode/Supporting Files/Assets.xcassets/Home/homepage_down_more.imageset/Contents.json 0 → 100644
  1 +{
  2 + "images" : [
  3 + {
  4 + "idiom" : "universal",
  5 + "scale" : "1x"
  6 + },
  7 + {
  8 + "filename" : "homepage_down_more@2x.png",
  9 + "idiom" : "universal",
  10 + "scale" : "2x"
  11 + },
  12 + {
  13 + "idiom" : "universal",
  14 + "scale" : "3x"
  15 + }
  16 + ],
  17 + "info" : {
  18 + "author" : "xcode",
  19 + "version" : 1
  20 + }
  21 +}
metaCode/Supporting Files/Assets.xcassets/Home/homepage_down_more.imageset/homepage_down_more@2x.png 0 → 100644

1.66 KB