Commit f44bbd4b00a90381185a7ee601f28cf64c1c2c87
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
Podfile
| @@ -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?) -> UIViewController? { | @@ -45,7 +45,6 @@ private func currentVC(_ vc :UIViewController?) -> 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) -> BaseModel { | @@ -138,7 +137,7 @@ func jsonToModel(_ jsonStr:String,_ modelType:HandyJSON.Type) -> 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 <= 375 ? 23 : 40 | @@ -18,6 +18,8 @@ let LeftGap: CGFloat = UIScreen.main.bounds.size.width <= 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