Sfoglia il codice sorgente

feat:3.6.1(1)
1.增加调整光纤和上色老照片
2.会员购买改版
3.App 改名为 Old Photo

100Years 1 mese fa
parent
commit
d0ebc80d1a
100 ha cambiato i file con 1363 aggiunte e 395 eliminazioni
  1. 1 0
      Podfile
  2. 1 1
      Podfile.lock
  3. 79 7
      TSLiveWallpaper.xcodeproj/project.pbxproj
  4. 15 0
      TSLiveWallpaper.xcworkspace/xcshareddata/swiftpm/Package.resolved
  5. 2 3
      TSLiveWallpaper/Assets.xcassets/AIList/aiList_Enlighten.imageset/Contents.json
  6. BIN
      TSLiveWallpaper/Assets.xcassets/AIList/aiList_Enlighten.imageset/aiList_Enlighten@2x.png
  7. BIN
      TSLiveWallpaper/Assets.xcassets/AIList/aiList_Enlighten.imageset/aiList_Enlighten@3x.png
  8. 22 0
      TSLiveWallpaper/Assets.xcassets/AIList/aiList_Recreate.imageset/Contents.json
  9. BIN
      TSLiveWallpaper/Assets.xcassets/AIList/aiList_Recreate.imageset/aiList_Recreate@2x.png
  10. BIN
      TSLiveWallpaper/Assets.xcassets/AIList/aiList_Recreate.imageset/aiList_Recreate@3x.png
  11. 22 0
      TSLiveWallpaper/Assets.xcassets/Common/gray_right_arrow.imageset/Contents.json
  12. BIN
      TSLiveWallpaper/Assets.xcassets/Common/gray_right_arrow.imageset/gray_right_arrow@2x.png
  13. BIN
      TSLiveWallpaper/Assets.xcassets/Common/gray_right_arrow.imageset/gray_right_arrow@3x.png
  14. 6 0
      TSLiveWallpaper/Assets.xcassets/Comparison/Contents.json
  15. 1 2
      TSLiveWallpaper/Assets.xcassets/Comparison/image_comparison_new_0.imageset/Contents.json
  16. BIN
      TSLiveWallpaper/Assets.xcassets/Comparison/image_comparison_new_0.imageset/image_comparison_new_0@3x.png
  17. 1 2
      TSLiveWallpaper/Assets.xcassets/Comparison/image_comparison_new_1.imageset/Contents.json
  18. BIN
      TSLiveWallpaper/Assets.xcassets/Comparison/image_comparison_new_1.imageset/image_comparison_new_1@3x.png
  19. 1 2
      TSLiveWallpaper/Assets.xcassets/Comparison/image_comparison_new_2.imageset/Contents.json
  20. BIN
      TSLiveWallpaper/Assets.xcassets/Comparison/image_comparison_new_2.imageset/image_comparison_new_2@3x.png
  21. 21 0
      TSLiveWallpaper/Assets.xcassets/Comparison/image_comparison_new_3.imageset/Contents.json
  22. BIN
      TSLiveWallpaper/Assets.xcassets/Comparison/image_comparison_new_3.imageset/image_comparison_new_3@3x.png
  23. 21 0
      TSLiveWallpaper/Assets.xcassets/Comparison/image_comparison_old_0.imageset/Contents.json
  24. BIN
      TSLiveWallpaper/Assets.xcassets/Comparison/image_comparison_old_0.imageset/image_comparison_old_0@3x.png
  25. 21 0
      TSLiveWallpaper/Assets.xcassets/Comparison/image_comparison_old_1.imageset/Contents.json
  26. BIN
      TSLiveWallpaper/Assets.xcassets/Comparison/image_comparison_old_1.imageset/image_comparison_old_1@3x.png
  27. 21 0
      TSLiveWallpaper/Assets.xcassets/Comparison/image_comparison_old_2.imageset/Contents.json
  28. BIN
      TSLiveWallpaper/Assets.xcassets/Comparison/image_comparison_old_2.imageset/image_comparison_old_2@3x.png
  29. 21 0
      TSLiveWallpaper/Assets.xcassets/Comparison/image_comparison_old_3.imageset/Contents.json
  30. BIN
      TSLiveWallpaper/Assets.xcassets/Comparison/image_comparison_old_3.imageset/image_comparison_old_3@3x.png
  31. 22 0
      TSLiveWallpaper/Assets.xcassets/Hint/hint_Enlighten_bad.imageset/Contents.json
  32. BIN
      TSLiveWallpaper/Assets.xcassets/Hint/hint_Enlighten_bad.imageset/hint_Enlighten_bad@2x.png
  33. BIN
      TSLiveWallpaper/Assets.xcassets/Hint/hint_Enlighten_bad.imageset/hint_Enlighten_bad@3x.png
  34. 22 0
      TSLiveWallpaper/Assets.xcassets/Hint/hint_Enlighten_good.imageset/Contents.json
  35. BIN
      TSLiveWallpaper/Assets.xcassets/Hint/hint_Enlighten_good.imageset/hint_Enlighten_good@2x.png
  36. BIN
      TSLiveWallpaper/Assets.xcassets/Hint/hint_Enlighten_good.imageset/hint_Enlighten_good@3x.png
  37. 22 0
      TSLiveWallpaper/Assets.xcassets/Mine/mine_cell_about.imageset/Contents.json
  38. BIN
      TSLiveWallpaper/Assets.xcassets/Mine/mine_cell_about.imageset/mine_cell_about@2x.png
  39. BIN
      TSLiveWallpaper/Assets.xcassets/Mine/mine_cell_about.imageset/mine_cell_about@3x.png
  40. 22 0
      TSLiveWallpaper/Assets.xcassets/Mine/mine_cell_privacy.imageset/Contents.json
  41. BIN
      TSLiveWallpaper/Assets.xcassets/Mine/mine_cell_privacy.imageset/mine_cell_privacy@2x.png
  42. BIN
      TSLiveWallpaper/Assets.xcassets/Mine/mine_cell_privacy.imageset/mine_cell_privacy@3x.png
  43. 22 0
      TSLiveWallpaper/Assets.xcassets/Mine/mine_cell_rateUs.imageset/Contents.json
  44. BIN
      TSLiveWallpaper/Assets.xcassets/Mine/mine_cell_rateUs.imageset/mine_cell_rateUs@2x.png
  45. BIN
      TSLiveWallpaper/Assets.xcassets/Mine/mine_cell_rateUs.imageset/mine_cell_rateUs@3x.png
  46. 22 0
      TSLiveWallpaper/Assets.xcassets/Mine/mine_cell_share.imageset/Contents.json
  47. BIN
      TSLiveWallpaper/Assets.xcassets/Mine/mine_cell_share.imageset/mine_cell_share@2x.png
  48. BIN
      TSLiveWallpaper/Assets.xcassets/Mine/mine_cell_share.imageset/mine_cell_share@3x.png
  49. 22 0
      TSLiveWallpaper/Assets.xcassets/Mine/mine_cell_useragree.imageset/Contents.json
  50. BIN
      TSLiveWallpaper/Assets.xcassets/Mine/mine_cell_useragree.imageset/mine_cell_useragree@2x.png
  51. BIN
      TSLiveWallpaper/Assets.xcassets/Mine/mine_cell_useragree.imageset/mine_cell_useragree@3x.png
  52. 6 0
      TSLiveWallpaper/Assets.xcassets/Purchase/Contents.json
  53. 22 0
      TSLiveWallpaper/Assets.xcassets/Purchase/purchase_bg_shade.imageset/Contents.json
  54. BIN
      TSLiveWallpaper/Assets.xcassets/Purchase/purchase_bg_shade.imageset/purchase_bg_shade@2x.png
  55. BIN
      TSLiveWallpaper/Assets.xcassets/Purchase/purchase_bg_shade.imageset/purchase_bg_shade@3x.png
  56. BIN
      TSLiveWallpaper/Assets.xcassets/Vip/Cloud_Music.imageset/Cloud_Music@1x.png
  57. BIN
      TSLiveWallpaper/Assets.xcassets/Vip/Cloud_Music.imageset/Cloud_Music@2x.png
  58. BIN
      TSLiveWallpaper/Assets.xcassets/Vip/Cloud_Music.imageset/Cloud_Music@3x.png
  59. BIN
      TSLiveWallpaper/Assets.xcassets/Vip/Cloud_Music_Pro.imageset/Cloud_Music_Pro@1x.png
  60. BIN
      TSLiveWallpaper/Assets.xcassets/Vip/Cloud_Music_Pro.imageset/Cloud_Music_Pro@2x.png
  61. BIN
      TSLiveWallpaper/Assets.xcassets/Vip/Cloud_Music_Pro.imageset/Cloud_Music_Pro@3x.png
  62. 0 23
      TSLiveWallpaper/Assets.xcassets/Vip/Cloud_Music_Pro.imageset/Contents.json
  63. 0 23
      TSLiveWallpaper/Assets.xcassets/Vip/Dmanager_pro.imageset/Contents.json
  64. BIN
      TSLiveWallpaper/Assets.xcassets/Vip/Dmanager_pro.imageset/Dmanager_pro@1x.png
  65. BIN
      TSLiveWallpaper/Assets.xcassets/Vip/Dmanager_pro.imageset/Dmanager_pro@2x.png
  66. BIN
      TSLiveWallpaper/Assets.xcassets/Vip/Dmanager_pro.imageset/Dmanager_pro@3x.png
  67. 0 23
      TSLiveWallpaper/Assets.xcassets/Vip/Old-Tim_pro.imageset/Contents.json
  68. BIN
      TSLiveWallpaper/Assets.xcassets/Vip/Old-Tim_pro.imageset/Old-Tim_pro@1x.png
  69. BIN
      TSLiveWallpaper/Assets.xcassets/Vip/Old-Tim_pro.imageset/Old-Tim_pro@2x.png
  70. BIN
      TSLiveWallpaper/Assets.xcassets/Vip/Old-Tim_pro.imageset/Old-Tim_pro@3x.png
  71. BIN
      TSLiveWallpaper/Assets.xcassets/Vip/noVip_big_bg.imageset/noVip_big_bg@2x.png
  72. BIN
      TSLiveWallpaper/Assets.xcassets/Vip/noVip_big_bg.imageset/noVip_big_bg@3x.png
  73. 22 0
      TSLiveWallpaper/Assets.xcassets/Vip/setting_purchase_bg.imageset/Contents.json
  74. BIN
      TSLiveWallpaper/Assets.xcassets/Vip/setting_purchase_bg.imageset/setting_purchase_bg@2x.png
  75. BIN
      TSLiveWallpaper/Assets.xcassets/Vip/setting_purchase_bg.imageset/setting_purchase_bg@3x.png
  76. 22 0
      TSLiveWallpaper/Assets.xcassets/Vip/setting_purchase_vip_bg.imageset/Contents.json
  77. BIN
      TSLiveWallpaper/Assets.xcassets/Vip/setting_purchase_vip_bg.imageset/setting_purchase_vip_bg@2x.png
  78. BIN
      TSLiveWallpaper/Assets.xcassets/Vip/setting_purchase_vip_bg.imageset/setting_purchase_vip_bg@3x.png
  79. BIN
      TSLiveWallpaper/Assets.xcassets/Vip/vip_big_bg.imageset/vip_big_bg@2x.png
  80. BIN
      TSLiveWallpaper/Assets.xcassets/Vip/vip_big_bg.imageset/vip_big_bg@3x.png
  81. BIN
      TSLiveWallpaper/Assets.xcassets/Vip/vip_big_icon.imageset/vip_big_icon@2x.png
  82. BIN
      TSLiveWallpaper/Assets.xcassets/Vip/vip_big_icon.imageset/vip_big_icon@3x.png
  83. 8 18
      TSLiveWallpaper/Base.lproj/LaunchScreen.storyboard
  84. 36 12
      TSLiveWallpaper/Business/BusinessView/TSAppBtnView.swift
  85. 172 0
      TSLiveWallpaper/Business/BusinessView/TSImageComparisonView.swift
  86. 0 0
      TSLiveWallpaper/Business/BusinessView/TSImageIPanComparisonView.swift
  87. 0 36
      TSLiveWallpaper/Business/BusinessView/TSView.swift
  88. 172 0
      TSLiveWallpaper/Business/BusinessView/TYCycleImageComparisonView.swift
  89. 25 1
      TSLiveWallpaper/Business/TSAIListVC/TSAIAgeImageHintVC/TSAIListHintBaseVC.swift
  90. 10 14
      TSLiveWallpaper/Business/TSAIListVC/TSAIList+Enmu.swift
  91. 2 2
      TSLiveWallpaper/Business/TSAIListVC/TSAIListVC/TSAILIstCell.swift
  92. 30 0
      TSLiveWallpaper/Business/TSAIListVC/TSAIListVC/TSAIListVC.swift
  93. 7 0
      TSLiveWallpaper/Business/TSAIListVC/TSAIPhotoGeneratorVC/TSAIListPhotoGeneratorVM.swift
  94. 22 1
      TSLiveWallpaper/Business/TSAIListVC/TSAIUploadPhotoVC/TSAIUploadPhotoVC.swift
  95. 1 1
      TSLiveWallpaper/Business/TSEditLiveVC/TSEditLiveVC.swift
  96. 1 1
      TSLiveWallpaper/Business/TSHomeVC/TSHomeVC.swift
  97. 17 10
      TSLiveWallpaper/Business/TSMineVC/TSMineCell.swift
  98. 88 150
      TSLiveWallpaper/Business/TSMineVC/TSMineVC.swift
  99. 153 0
      TSLiveWallpaper/Business/TSMineVC/View/TSMineTopView.swift
  100. 137 63
      TSLiveWallpaper/Business/TSPurchaseMembershipVC/TSPurchaseVC.swift

+ 1 - 0
Podfile

@@ -29,6 +29,7 @@ target 'TSLiveWallpaper' do
   pod 'RealmSwift', '~>10'
   pod 'TSSmalCoacopods', :path => '../TSSmalCoacopods'
   pod "DynamicBlurView"
+  pod 'TYCyclePagerView'
 end
 
 

+ 1 - 1
Podfile.lock

@@ -218,6 +218,6 @@ SPEC CHECKSUMS:
   TZImagePickerController: d084a7b97c82d387e7669dd86dc9a9057500aacf
   YYModel: 2a7fdd96aaa4b86a824e26d0c517de8928c04b30
 
-PODFILE CHECKSUM: a6ed03a6ab5b7f6266e98585bcb3ab1aa881185e
+PODFILE CHECKSUM: 9ef89fbe0d8e037e47c74750a3a222191b93c7ca
 
 COCOAPODS: 1.16.2

+ 79 - 7
TSLiveWallpaper.xcodeproj/project.pbxproj

@@ -202,6 +202,15 @@
 		A8F778B22D1BA07200BF55D5 /* TSRandomWallpaperBrowseSelectView.swift in Sources */ = {isa = PBXBuildFile; fileRef = A8F778B12D1BA07000BF55D5 /* TSRandomWallpaperBrowseSelectView.swift */; };
 		A8F778B42D1BB8F600BF55D5 /* PhotoManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = A8F778B32D1BB8F300BF55D5 /* PhotoManager.swift */; };
 		A8F778B72D1BE9A500BF55D5 /* TSLiveWallpaperBrowseVC.swift in Sources */ = {isa = PBXBuildFile; fileRef = A8F778B62D1BE9A100BF55D5 /* TSLiveWallpaperBrowseVC.swift */; };
+		A8FD8F332DFBCB85008CAACF /* ZillaSlab-Regular.ttf in Resources */ = {isa = PBXBuildFile; fileRef = A8FD8F322DFBCB85008CAACF /* ZillaSlab-Regular.ttf */; };
+		A8FD8F342DFBCB85008CAACF /* ZillaSlab-Medium.ttf in Resources */ = {isa = PBXBuildFile; fileRef = A8FD8F312DFBCB85008CAACF /* ZillaSlab-Medium.ttf */; };
+		A8FD8F352DFBCB85008CAACF /* ZillaSlab-BoldItalic.ttf in Resources */ = {isa = PBXBuildFile; fileRef = A8FD8F302DFBCB85008CAACF /* ZillaSlab-BoldItalic.ttf */; };
+		A8FD8F382DFBD660008CAACF /* TSMineTopView.swift in Sources */ = {isa = PBXBuildFile; fileRef = A8FD8F372DFBD659008CAACF /* TSMineTopView.swift */; };
+		A8FD8F3C2DFC0A72008CAACF /* HighlightedText.swift in Sources */ = {isa = PBXBuildFile; fileRef = A8FD8F3B2DFC0A71008CAACF /* HighlightedText.swift */; };
+		A8FD8F3F2DFC10CF008CAACF /* SwiftUIX in Frameworks */ = {isa = PBXBuildFile; productRef = A8FD8F3E2DFC10CF008CAACF /* SwiftUIX */; };
+		A8FD8F412DFC138A008CAACF /* TYCycleImageComparisonView.swift in Sources */ = {isa = PBXBuildFile; fileRef = A8FD8F402DFC138A008CAACF /* TYCycleImageComparisonView.swift */; };
+		A8FD8F432DFC1656008CAACF /* TSImageComparisonView.swift in Sources */ = {isa = PBXBuildFile; fileRef = A8FD8F422DFC1656008CAACF /* TSImageComparisonView.swift */; };
+		A8FD8F452DFC219B008CAACF /* launch1.png in Resources */ = {isa = PBXBuildFile; fileRef = A8FD8F442DFC219B008CAACF /* launch1.png */; };
 /* End PBXBuildFile section */
 
 /* Begin PBXFileReference section */
@@ -416,6 +425,14 @@
 		A8F778B12D1BA07000BF55D5 /* TSRandomWallpaperBrowseSelectView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TSRandomWallpaperBrowseSelectView.swift; sourceTree = "<group>"; };
 		A8F778B32D1BB8F300BF55D5 /* PhotoManager.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PhotoManager.swift; sourceTree = "<group>"; };
 		A8F778B62D1BE9A100BF55D5 /* TSLiveWallpaperBrowseVC.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TSLiveWallpaperBrowseVC.swift; sourceTree = "<group>"; };
+		A8FD8F302DFBCB85008CAACF /* ZillaSlab-BoldItalic.ttf */ = {isa = PBXFileReference; lastKnownFileType = file; path = "ZillaSlab-BoldItalic.ttf"; sourceTree = "<group>"; };
+		A8FD8F312DFBCB85008CAACF /* ZillaSlab-Medium.ttf */ = {isa = PBXFileReference; lastKnownFileType = file; path = "ZillaSlab-Medium.ttf"; sourceTree = "<group>"; };
+		A8FD8F322DFBCB85008CAACF /* ZillaSlab-Regular.ttf */ = {isa = PBXFileReference; lastKnownFileType = file; path = "ZillaSlab-Regular.ttf"; sourceTree = "<group>"; };
+		A8FD8F372DFBD659008CAACF /* TSMineTopView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TSMineTopView.swift; sourceTree = "<group>"; };
+		A8FD8F3B2DFC0A71008CAACF /* HighlightedText.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = HighlightedText.swift; sourceTree = "<group>"; };
+		A8FD8F402DFC138A008CAACF /* TYCycleImageComparisonView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TYCycleImageComparisonView.swift; sourceTree = "<group>"; };
+		A8FD8F422DFC1656008CAACF /* TSImageComparisonView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TSImageComparisonView.swift; sourceTree = "<group>"; };
+		A8FD8F442DFC219B008CAACF /* launch1.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = launch1.png; sourceTree = "<group>"; };
 		CA36AE9B313600F95F04D9CA /* Pods-TSLiveWallpaper.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-TSLiveWallpaper.debug.xcconfig"; path = "Target Support Files/Pods-TSLiveWallpaper/Pods-TSLiveWallpaper.debug.xcconfig"; sourceTree = "<group>"; };
 		E33A770AEFA5810AED7219D3 /* Pods_TSLiveWallpaper.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_TSLiveWallpaper.framework; sourceTree = BUILT_PRODUCTS_DIR; };
 /* End PBXFileReference section */
@@ -426,6 +443,7 @@
 			buildActionMask = 2147483647;
 			files = (
 				059E844A164B0E39971303B9 /* Pods_TSLiveWallpaper.framework in Frameworks */,
+				A8FD8F3F2DFC10CF008CAACF /* SwiftUIX in Frameworks */,
 			);
 			runOnlyForDeploymentPostprocessing = 0;
 		};
@@ -746,6 +764,7 @@
 		A81CA4662D156A8100A3AAC8 /* Common */ = {
 			isa = PBXGroup;
 			children = (
+				A8FD8F3A2DFC0A63008CAACF /* SwiftUI */,
 				A86857C12DF926EB0089D222 /* TSPhotoSizeHelper.swift */,
 				A86857A52DF920400089D222 /* ViewTool */,
 				A86857832DF81B510089D222 /* TSNetWork */,
@@ -860,6 +879,7 @@
 		A81CA4912D16521300A3AAC8 /* TSMineVC */ = {
 			isa = PBXGroup;
 			children = (
+				A8FD8F362DFBD650008CAACF /* View */,
 				A839461C2D1D61A900ABFF0D /* VC */,
 				A81CA4982D1652C200A3AAC8 /* TSMineVC.swift */,
 				A81CA4A92D16943200A3AAC8 /* TSMineCell.swift */,
@@ -911,6 +931,9 @@
 		A81CA4B22D1695F800A3AAC8 /* Font */ = {
 			isa = PBXGroup;
 			children = (
+				A8FD8F302DFBCB85008CAACF /* ZillaSlab-BoldItalic.ttf */,
+				A8FD8F312DFBCB85008CAACF /* ZillaSlab-Medium.ttf */,
+				A8FD8F322DFBCB85008CAACF /* ZillaSlab-Regular.ttf */,
 				A86857C52DF92BE70089D222 /* ZillaSlab-Bold.ttf */,
 			);
 			path = Font;
@@ -1087,6 +1110,9 @@
 		A868578D2DF845D00089D222 /* BusinessView */ = {
 			isa = PBXGroup;
 			children = (
+				A86857DC2DF99C200089D222 /* TSImageIPanComparisonView.swift */,
+				A8FD8F422DFC1656008CAACF /* TSImageComparisonView.swift */,
+				A8FD8F402DFC138A008CAACF /* TYCycleImageComparisonView.swift */,
 				A86857BF2DF926870089D222 /* TSPageNullView.swift */,
 				A86857AE2DF921970089D222 /* TSAppBtnView.swift */,
 				A86857B12DF921F90089D222 /* TSView.swift */,
@@ -1199,7 +1225,6 @@
 		A86857DB2DF99C170089D222 /* View */ = {
 			isa = PBXGroup;
 			children = (
-				A86857DC2DF99C200089D222 /* TSImageIPanComparisonView.swift */,
 			);
 			path = View;
 			sourceTree = "<group>";
@@ -1248,6 +1273,7 @@
 				A81CA45F2D1567CD00A3AAC8 /* LaunchVC */,
 				A8E56BEC2D1520EC003C54AF /* AppDelegate.swift */,
 				A8E56BED2D1520EC003C54AF /* Assets.xcassets */,
+				A8FD8F442DFC219B008CAACF /* launch1.png */,
 				A8E56BEE2D1520EC003C54AF /* Info.plist */,
 				A8E56BF02D1520EC003C54AF /* LaunchScreen.storyboard */,
 				609B6EA32D6F1221007942D4 /* Localizable.strings */,
@@ -1283,6 +1309,22 @@
 			path = TSLiveWallpaperBrowseVC;
 			sourceTree = "<group>";
 		};
+		A8FD8F362DFBD650008CAACF /* View */ = {
+			isa = PBXGroup;
+			children = (
+				A8FD8F372DFBD659008CAACF /* TSMineTopView.swift */,
+			);
+			path = View;
+			sourceTree = "<group>";
+		};
+		A8FD8F3A2DFC0A63008CAACF /* SwiftUI */ = {
+			isa = PBXGroup;
+			children = (
+				A8FD8F3B2DFC0A71008CAACF /* HighlightedText.swift */,
+			);
+			path = SwiftUI;
+			sourceTree = "<group>";
+		};
 		D901B78947260557CA1FA83C /* Frameworks */ = {
 			isa = PBXGroup;
 			children = (
@@ -1343,6 +1385,9 @@
 			);
 			mainGroup = A8E56BCB2D1520DD003C54AF;
 			minimizedProjectReferenceProxies = 1;
+			packageReferences = (
+				A8FD8F3D2DFC10CF008CAACF /* XCRemoteSwiftPackageReference "SwiftUIX" */,
+			);
 			productRefGroup = A8E56BD52D1520DD003C54AF /* Products */;
 			projectDirPath = "";
 			projectRoot = "";
@@ -1357,6 +1402,7 @@
 			isa = PBXResourcesBuildPhase;
 			buildActionMask = 2147483647;
 			files = (
+				A8FD8F452DFC219B008CAACF /* launch1.png in Resources */,
 				603901222DF9770A0096551E /* Flash-old-Time.png in Resources */,
 				606372D82D545E6C005C82CF /* Example Music.mp3 in Resources */,
 				A8C4C0A42D24218A003C46FC /* metadata.mov in Resources */,
@@ -1364,6 +1410,9 @@
 				A86857C62DF92BE70089D222 /* ZillaSlab-Bold.ttf in Resources */,
 				60553FC42D3B528A00BAAD7F /* IJKPlayer.md in Resources */,
 				609B6EA52D6F1221007942D4 /* Localizable.strings in Resources */,
+				A8FD8F332DFBCB85008CAACF /* ZillaSlab-Regular.ttf in Resources */,
+				A8FD8F342DFBCB85008CAACF /* ZillaSlab-Medium.ttf in Resources */,
+				A8FD8F352DFBCB85008CAACF /* ZillaSlab-BoldItalic.ttf in Resources */,
 				A8E56BF92D1520EC003C54AF /* Assets.xcassets in Resources */,
 				A81F5B522D19685900740085 /* response.json in Resources */,
 				A8E56BFB2D1520EC003C54AF /* LaunchScreen.storyboard in Resources */,
@@ -1423,10 +1472,12 @@
 				A81CA4992D1652C400A3AAC8 /* TSMineVC.swift in Sources */,
 				A8C4C0EF2D27BFF7003C46FC /* TSNetworkTool.swift in Sources */,
 				A81CA46E2D156C7000A3AAC8 /* GlobalImports.swift in Sources */,
+				A8FD8F382DFBD660008CAACF /* TSMineTopView.swift in Sources */,
 				606372E52D55BAB8005C82CF /* GuideBubbleView.swift in Sources */,
 				A81CA4832D157F5C00A3AAC8 /* UIImageView+Ex.swift in Sources */,
 				60F82C112D43298800FFB08D /* MusicContainerViewModel.swift in Sources */,
 				A81F5B492D1956EA00740085 /* UIScreen.swift in Sources */,
+				A8FD8F412DFC138A008CAACF /* TYCycleImageComparisonView.swift in Sources */,
 				A8C4C0E62D268D02003C46FC /* LivePhotoCreater.swift in Sources */,
 				A8C4C0E72D268D02003C46FC /* VideoRecorder.swift in Sources */,
 				A8F76C4D2D3747B400AA6E93 /* TSPurchaseVC.swift in Sources */,
@@ -1447,6 +1498,7 @@
 				60553FD72D3B54A400BAAD7F /* GradientText.swift in Sources */,
 				60553FD82D3B54A400BAAD7F /* LWBaseNavigationController.swift in Sources */,
 				60553FD92D3B54A400BAAD7F /* GradientBackgroundModifier.swift in Sources */,
+				A8FD8F432DFC1656008CAACF /* TSImageComparisonView.swift in Sources */,
 				A868579E2DF915E90089D222 /* TSPurchaseBusiness.swift in Sources */,
 				A81F5B5D2D1A906C00740085 /* TSHomeDataModel.swift in Sources */,
 				A81CA49B2D1652CA00A3AAC8 /* TSHomeVC.swift in Sources */,
@@ -1578,6 +1630,7 @@
 				A86857C22DF926ED0089D222 /* TSPhotoSizeHelper.swift in Sources */,
 				A839463A2D1D6E3000ABFF0D /* TSRandomWallpaperTutorialsVC.swift in Sources */,
 				A84C239F2D1E88CD00B61B55 /* TSFileManagerTool.swift in Sources */,
+				A8FD8F3C2DFC0A72008CAACF /* HighlightedText.swift in Sources */,
 				A86857D52DF97A2A0089D222 /* TSAIExpandChangeView.swift in Sources */,
 				A81F5B562D1982BF00740085 /* TSImageDataCenter.swift in Sources */,
 				A86857A82DF9204B0089D222 /* TSPhotoPickerManager.swift in Sources */,
@@ -1644,13 +1697,13 @@
 				ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor;
 				CODE_SIGN_IDENTITY = "Apple Development";
 				CODE_SIGN_STYLE = Automatic;
-				CURRENT_PROJECT_VERSION = 3;
+				CURRENT_PROJECT_VERSION = 1;
 				DEVELOPMENT_TEAM = 65UD255J84;
 				ENABLE_APP_SANDBOX = NO;
 				ENABLE_USER_SCRIPT_SANDBOXING = NO;
 				GENERATE_INFOPLIST_FILE = YES;
 				INFOPLIST_FILE = TSLiveWallpaper/Info.plist;
-				INFOPLIST_KEY_CFBundleDisplayName = "Old-Time\n";
+				INFOPLIST_KEY_CFBundleDisplayName = "Old Photo\n";
 				INFOPLIST_KEY_NSLocationWhenInUseUsageDescription = "This app needs to access your location information while you're using it to provide relevant location services and features. We promise to only obtain your location information when you're using the app and to use it solely for providing services and features.";
 				INFOPLIST_KEY_NSPhotoLibraryUsageDescription = "Allow us to access Photos in order to save wallpapers to your device.";
 				INFOPLIST_KEY_UIApplicationSupportsIndirectInputEvents = YES;
@@ -1661,7 +1714,7 @@
 					"$(inherited)",
 					"@executable_path/Frameworks",
 				);
-				MARKETING_VERSION = 3.4;
+				MARKETING_VERSION = 3.6.1;
 				PRODUCT_BUNDLE_IDENTIFIER = musicplayer.offline.com;
 				PRODUCT_NAME = "$(TARGET_NAME)";
 				PROVISIONING_PROFILE_SPECIFIER = "";
@@ -1684,13 +1737,13 @@
 				ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor;
 				CODE_SIGN_IDENTITY = "Apple Development";
 				CODE_SIGN_STYLE = Automatic;
-				CURRENT_PROJECT_VERSION = 3;
+				CURRENT_PROJECT_VERSION = 1;
 				DEVELOPMENT_TEAM = 65UD255J84;
 				ENABLE_APP_SANDBOX = NO;
 				ENABLE_USER_SCRIPT_SANDBOXING = NO;
 				GENERATE_INFOPLIST_FILE = YES;
 				INFOPLIST_FILE = TSLiveWallpaper/Info.plist;
-				INFOPLIST_KEY_CFBundleDisplayName = "Old-Time\n";
+				INFOPLIST_KEY_CFBundleDisplayName = "Old Photo\n";
 				INFOPLIST_KEY_NSLocationWhenInUseUsageDescription = "This app needs to access your location information while you're using it to provide relevant location services and features. We promise to only obtain your location information when you're using the app and to use it solely for providing services and features.";
 				INFOPLIST_KEY_NSPhotoLibraryUsageDescription = "Allow us to access Photos in order to save wallpapers to your device.";
 				INFOPLIST_KEY_UIApplicationSupportsIndirectInputEvents = YES;
@@ -1701,7 +1754,7 @@
 					"$(inherited)",
 					"@executable_path/Frameworks",
 				);
-				MARKETING_VERSION = 3.4;
+				MARKETING_VERSION = 3.6.1;
 				PRODUCT_BUNDLE_IDENTIFIER = musicplayer.offline.com;
 				PRODUCT_NAME = "$(TARGET_NAME)";
 				PROVISIONING_PROFILE_SPECIFIER = "";
@@ -1859,6 +1912,25 @@
 			defaultConfigurationName = Release;
 		};
 /* End XCConfigurationList section */
+
+/* Begin XCRemoteSwiftPackageReference section */
+		A8FD8F3D2DFC10CF008CAACF /* XCRemoteSwiftPackageReference "SwiftUIX" */ = {
+			isa = XCRemoteSwiftPackageReference;
+			repositoryURL = "https://github.com/SwiftUIX/SwiftUIX.git";
+			requirement = {
+				kind = upToNextMajorVersion;
+				minimumVersion = 0.2.4;
+			};
+		};
+/* End XCRemoteSwiftPackageReference section */
+
+/* Begin XCSwiftPackageProductDependency section */
+		A8FD8F3E2DFC10CF008CAACF /* SwiftUIX */ = {
+			isa = XCSwiftPackageProductDependency;
+			package = A8FD8F3D2DFC10CF008CAACF /* XCRemoteSwiftPackageReference "SwiftUIX" */;
+			productName = SwiftUIX;
+		};
+/* End XCSwiftPackageProductDependency section */
 	};
 	rootObject = A8E56BCC2D1520DD003C54AF /* Project object */;
 }

+ 15 - 0
TSLiveWallpaper.xcworkspace/xcshareddata/swiftpm/Package.resolved

@@ -0,0 +1,15 @@
+{
+  "originHash" : "81d2e580ba9932bbf94c74a60282a1d23a575ec90655203f2e82c84e3edc604c",
+  "pins" : [
+    {
+      "identity" : "swiftuix",
+      "kind" : "remoteSourceControl",
+      "location" : "https://github.com/SwiftUIX/SwiftUIX.git",
+      "state" : {
+        "revision" : "d9f903b214b9d56e3c1e4533b03359aee94acd5d",
+        "version" : "0.2.4"
+      }
+    }
+  ],
+  "version" : 3
+}

+ 2 - 3
TSLiveWallpaper/Assets.xcassets/Vip/Cloud_Music.imageset/Contents.json → TSLiveWallpaper/Assets.xcassets/AIList/aiList_Enlighten.imageset/Contents.json

@@ -1,17 +1,16 @@
 {
   "images" : [
     {
-      "filename" : "Cloud_Music@1x.png",
       "idiom" : "universal",
       "scale" : "1x"
     },
     {
-      "filename" : "Cloud_Music@2x.png",
+      "filename" : "aiList_Enlighten@2x.png",
       "idiom" : "universal",
       "scale" : "2x"
     },
     {
-      "filename" : "Cloud_Music@3x.png",
+      "filename" : "aiList_Enlighten@3x.png",
       "idiom" : "universal",
       "scale" : "3x"
     }

BIN
TSLiveWallpaper/Assets.xcassets/AIList/aiList_Enlighten.imageset/aiList_Enlighten@2x.png


BIN
TSLiveWallpaper/Assets.xcassets/AIList/aiList_Enlighten.imageset/aiList_Enlighten@3x.png


+ 22 - 0
TSLiveWallpaper/Assets.xcassets/AIList/aiList_Recreate.imageset/Contents.json

@@ -0,0 +1,22 @@
+{
+  "images" : [
+    {
+      "idiom" : "universal",
+      "scale" : "1x"
+    },
+    {
+      "filename" : "aiList_Recreate@2x.png",
+      "idiom" : "universal",
+      "scale" : "2x"
+    },
+    {
+      "filename" : "aiList_Recreate@3x.png",
+      "idiom" : "universal",
+      "scale" : "3x"
+    }
+  ],
+  "info" : {
+    "author" : "xcode",
+    "version" : 1
+  }
+}

BIN
TSLiveWallpaper/Assets.xcassets/AIList/aiList_Recreate.imageset/aiList_Recreate@2x.png


BIN
TSLiveWallpaper/Assets.xcassets/AIList/aiList_Recreate.imageset/aiList_Recreate@3x.png


+ 22 - 0
TSLiveWallpaper/Assets.xcassets/Common/gray_right_arrow.imageset/Contents.json

@@ -0,0 +1,22 @@
+{
+  "images" : [
+    {
+      "idiom" : "universal",
+      "scale" : "1x"
+    },
+    {
+      "filename" : "gray_right_arrow@2x.png",
+      "idiom" : "universal",
+      "scale" : "2x"
+    },
+    {
+      "filename" : "gray_right_arrow@3x.png",
+      "idiom" : "universal",
+      "scale" : "3x"
+    }
+  ],
+  "info" : {
+    "author" : "xcode",
+    "version" : 1
+  }
+}

BIN
TSLiveWallpaper/Assets.xcassets/Common/gray_right_arrow.imageset/gray_right_arrow@2x.png


BIN
TSLiveWallpaper/Assets.xcassets/Common/gray_right_arrow.imageset/gray_right_arrow@3x.png


+ 6 - 0
TSLiveWallpaper/Assets.xcassets/Comparison/Contents.json

@@ -0,0 +1,6 @@
+{
+  "info" : {
+    "author" : "xcode",
+    "version" : 1
+  }
+}

+ 1 - 2
TSLiveWallpaper/Assets.xcassets/Vip/vip_big_bg.imageset/Contents.json → TSLiveWallpaper/Assets.xcassets/Comparison/image_comparison_new_0.imageset/Contents.json

@@ -5,12 +5,11 @@
       "scale" : "1x"
     },
     {
-      "filename" : "vip_big_bg@2x.png",
       "idiom" : "universal",
       "scale" : "2x"
     },
     {
-      "filename" : "vip_big_bg@3x.png",
+      "filename" : "image_comparison_new_0@3x.png",
       "idiom" : "universal",
       "scale" : "3x"
     }

BIN
TSLiveWallpaper/Assets.xcassets/Comparison/image_comparison_new_0.imageset/image_comparison_new_0@3x.png


+ 1 - 2
TSLiveWallpaper/Assets.xcassets/Vip/noVip_big_bg.imageset/Contents.json → TSLiveWallpaper/Assets.xcassets/Comparison/image_comparison_new_1.imageset/Contents.json

@@ -5,12 +5,11 @@
       "scale" : "1x"
     },
     {
-      "filename" : "noVip_big_bg@2x.png",
       "idiom" : "universal",
       "scale" : "2x"
     },
     {
-      "filename" : "noVip_big_bg@3x.png",
+      "filename" : "image_comparison_new_1@3x.png",
       "idiom" : "universal",
       "scale" : "3x"
     }

BIN
TSLiveWallpaper/Assets.xcassets/Comparison/image_comparison_new_1.imageset/image_comparison_new_1@3x.png


+ 1 - 2
TSLiveWallpaper/Assets.xcassets/Vip/vip_big_icon.imageset/Contents.json → TSLiveWallpaper/Assets.xcassets/Comparison/image_comparison_new_2.imageset/Contents.json

@@ -5,12 +5,11 @@
       "scale" : "1x"
     },
     {
-      "filename" : "vip_big_icon@2x.png",
       "idiom" : "universal",
       "scale" : "2x"
     },
     {
-      "filename" : "vip_big_icon@3x.png",
+      "filename" : "image_comparison_new_2@3x.png",
       "idiom" : "universal",
       "scale" : "3x"
     }

BIN
TSLiveWallpaper/Assets.xcassets/Comparison/image_comparison_new_2.imageset/image_comparison_new_2@3x.png


+ 21 - 0
TSLiveWallpaper/Assets.xcassets/Comparison/image_comparison_new_3.imageset/Contents.json

@@ -0,0 +1,21 @@
+{
+  "images" : [
+    {
+      "idiom" : "universal",
+      "scale" : "1x"
+    },
+    {
+      "idiom" : "universal",
+      "scale" : "2x"
+    },
+    {
+      "filename" : "image_comparison_new_3@3x.png",
+      "idiom" : "universal",
+      "scale" : "3x"
+    }
+  ],
+  "info" : {
+    "author" : "xcode",
+    "version" : 1
+  }
+}

BIN
TSLiveWallpaper/Assets.xcassets/Comparison/image_comparison_new_3.imageset/image_comparison_new_3@3x.png


+ 21 - 0
TSLiveWallpaper/Assets.xcassets/Comparison/image_comparison_old_0.imageset/Contents.json

@@ -0,0 +1,21 @@
+{
+  "images" : [
+    {
+      "idiom" : "universal",
+      "scale" : "1x"
+    },
+    {
+      "idiom" : "universal",
+      "scale" : "2x"
+    },
+    {
+      "filename" : "image_comparison_old_0@3x.png",
+      "idiom" : "universal",
+      "scale" : "3x"
+    }
+  ],
+  "info" : {
+    "author" : "xcode",
+    "version" : 1
+  }
+}

BIN
TSLiveWallpaper/Assets.xcassets/Comparison/image_comparison_old_0.imageset/image_comparison_old_0@3x.png


+ 21 - 0
TSLiveWallpaper/Assets.xcassets/Comparison/image_comparison_old_1.imageset/Contents.json

@@ -0,0 +1,21 @@
+{
+  "images" : [
+    {
+      "idiom" : "universal",
+      "scale" : "1x"
+    },
+    {
+      "idiom" : "universal",
+      "scale" : "2x"
+    },
+    {
+      "filename" : "image_comparison_old_1@3x.png",
+      "idiom" : "universal",
+      "scale" : "3x"
+    }
+  ],
+  "info" : {
+    "author" : "xcode",
+    "version" : 1
+  }
+}

BIN
TSLiveWallpaper/Assets.xcassets/Comparison/image_comparison_old_1.imageset/image_comparison_old_1@3x.png


+ 21 - 0
TSLiveWallpaper/Assets.xcassets/Comparison/image_comparison_old_2.imageset/Contents.json

@@ -0,0 +1,21 @@
+{
+  "images" : [
+    {
+      "idiom" : "universal",
+      "scale" : "1x"
+    },
+    {
+      "idiom" : "universal",
+      "scale" : "2x"
+    },
+    {
+      "filename" : "image_comparison_old_2@3x.png",
+      "idiom" : "universal",
+      "scale" : "3x"
+    }
+  ],
+  "info" : {
+    "author" : "xcode",
+    "version" : 1
+  }
+}

BIN
TSLiveWallpaper/Assets.xcassets/Comparison/image_comparison_old_2.imageset/image_comparison_old_2@3x.png


+ 21 - 0
TSLiveWallpaper/Assets.xcassets/Comparison/image_comparison_old_3.imageset/Contents.json

@@ -0,0 +1,21 @@
+{
+  "images" : [
+    {
+      "idiom" : "universal",
+      "scale" : "1x"
+    },
+    {
+      "idiom" : "universal",
+      "scale" : "2x"
+    },
+    {
+      "filename" : "image_comparison_old_3@3x.png",
+      "idiom" : "universal",
+      "scale" : "3x"
+    }
+  ],
+  "info" : {
+    "author" : "xcode",
+    "version" : 1
+  }
+}

BIN
TSLiveWallpaper/Assets.xcassets/Comparison/image_comparison_old_3.imageset/image_comparison_old_3@3x.png


+ 22 - 0
TSLiveWallpaper/Assets.xcassets/Hint/hint_Enlighten_bad.imageset/Contents.json

@@ -0,0 +1,22 @@
+{
+  "images" : [
+    {
+      "idiom" : "universal",
+      "scale" : "1x"
+    },
+    {
+      "filename" : "hint_Enlighten_bad@2x.png",
+      "idiom" : "universal",
+      "scale" : "2x"
+    },
+    {
+      "filename" : "hint_Enlighten_bad@3x.png",
+      "idiom" : "universal",
+      "scale" : "3x"
+    }
+  ],
+  "info" : {
+    "author" : "xcode",
+    "version" : 1
+  }
+}

BIN
TSLiveWallpaper/Assets.xcassets/Hint/hint_Enlighten_bad.imageset/hint_Enlighten_bad@2x.png


BIN
TSLiveWallpaper/Assets.xcassets/Hint/hint_Enlighten_bad.imageset/hint_Enlighten_bad@3x.png


+ 22 - 0
TSLiveWallpaper/Assets.xcassets/Hint/hint_Enlighten_good.imageset/Contents.json

@@ -0,0 +1,22 @@
+{
+  "images" : [
+    {
+      "idiom" : "universal",
+      "scale" : "1x"
+    },
+    {
+      "filename" : "hint_Enlighten_good@2x.png",
+      "idiom" : "universal",
+      "scale" : "2x"
+    },
+    {
+      "filename" : "hint_Enlighten_good@3x.png",
+      "idiom" : "universal",
+      "scale" : "3x"
+    }
+  ],
+  "info" : {
+    "author" : "xcode",
+    "version" : 1
+  }
+}

BIN
TSLiveWallpaper/Assets.xcassets/Hint/hint_Enlighten_good.imageset/hint_Enlighten_good@2x.png


BIN
TSLiveWallpaper/Assets.xcassets/Hint/hint_Enlighten_good.imageset/hint_Enlighten_good@3x.png


+ 22 - 0
TSLiveWallpaper/Assets.xcassets/Mine/mine_cell_about.imageset/Contents.json

@@ -0,0 +1,22 @@
+{
+  "images" : [
+    {
+      "idiom" : "universal",
+      "scale" : "1x"
+    },
+    {
+      "filename" : "mine_cell_about@2x.png",
+      "idiom" : "universal",
+      "scale" : "2x"
+    },
+    {
+      "filename" : "mine_cell_about@3x.png",
+      "idiom" : "universal",
+      "scale" : "3x"
+    }
+  ],
+  "info" : {
+    "author" : "xcode",
+    "version" : 1
+  }
+}

BIN
TSLiveWallpaper/Assets.xcassets/Mine/mine_cell_about.imageset/mine_cell_about@2x.png


BIN
TSLiveWallpaper/Assets.xcassets/Mine/mine_cell_about.imageset/mine_cell_about@3x.png


+ 22 - 0
TSLiveWallpaper/Assets.xcassets/Mine/mine_cell_privacy.imageset/Contents.json

@@ -0,0 +1,22 @@
+{
+  "images" : [
+    {
+      "idiom" : "universal",
+      "scale" : "1x"
+    },
+    {
+      "filename" : "mine_cell_privacy@2x.png",
+      "idiom" : "universal",
+      "scale" : "2x"
+    },
+    {
+      "filename" : "mine_cell_privacy@3x.png",
+      "idiom" : "universal",
+      "scale" : "3x"
+    }
+  ],
+  "info" : {
+    "author" : "xcode",
+    "version" : 1
+  }
+}

BIN
TSLiveWallpaper/Assets.xcassets/Mine/mine_cell_privacy.imageset/mine_cell_privacy@2x.png


BIN
TSLiveWallpaper/Assets.xcassets/Mine/mine_cell_privacy.imageset/mine_cell_privacy@3x.png


+ 22 - 0
TSLiveWallpaper/Assets.xcassets/Mine/mine_cell_rateUs.imageset/Contents.json

@@ -0,0 +1,22 @@
+{
+  "images" : [
+    {
+      "idiom" : "universal",
+      "scale" : "1x"
+    },
+    {
+      "filename" : "mine_cell_rateUs@2x.png",
+      "idiom" : "universal",
+      "scale" : "2x"
+    },
+    {
+      "filename" : "mine_cell_rateUs@3x.png",
+      "idiom" : "universal",
+      "scale" : "3x"
+    }
+  ],
+  "info" : {
+    "author" : "xcode",
+    "version" : 1
+  }
+}

BIN
TSLiveWallpaper/Assets.xcassets/Mine/mine_cell_rateUs.imageset/mine_cell_rateUs@2x.png


BIN
TSLiveWallpaper/Assets.xcassets/Mine/mine_cell_rateUs.imageset/mine_cell_rateUs@3x.png


+ 22 - 0
TSLiveWallpaper/Assets.xcassets/Mine/mine_cell_share.imageset/Contents.json

@@ -0,0 +1,22 @@
+{
+  "images" : [
+    {
+      "idiom" : "universal",
+      "scale" : "1x"
+    },
+    {
+      "filename" : "mine_cell_share@2x.png",
+      "idiom" : "universal",
+      "scale" : "2x"
+    },
+    {
+      "filename" : "mine_cell_share@3x.png",
+      "idiom" : "universal",
+      "scale" : "3x"
+    }
+  ],
+  "info" : {
+    "author" : "xcode",
+    "version" : 1
+  }
+}

BIN
TSLiveWallpaper/Assets.xcassets/Mine/mine_cell_share.imageset/mine_cell_share@2x.png


BIN
TSLiveWallpaper/Assets.xcassets/Mine/mine_cell_share.imageset/mine_cell_share@3x.png


+ 22 - 0
TSLiveWallpaper/Assets.xcassets/Mine/mine_cell_useragree.imageset/Contents.json

@@ -0,0 +1,22 @@
+{
+  "images" : [
+    {
+      "idiom" : "universal",
+      "scale" : "1x"
+    },
+    {
+      "filename" : "mine_cell_useragree@2x.png",
+      "idiom" : "universal",
+      "scale" : "2x"
+    },
+    {
+      "filename" : "mine_cell_useragree@3x.png",
+      "idiom" : "universal",
+      "scale" : "3x"
+    }
+  ],
+  "info" : {
+    "author" : "xcode",
+    "version" : 1
+  }
+}

BIN
TSLiveWallpaper/Assets.xcassets/Mine/mine_cell_useragree.imageset/mine_cell_useragree@2x.png


BIN
TSLiveWallpaper/Assets.xcassets/Mine/mine_cell_useragree.imageset/mine_cell_useragree@3x.png


+ 6 - 0
TSLiveWallpaper/Assets.xcassets/Purchase/Contents.json

@@ -0,0 +1,6 @@
+{
+  "info" : {
+    "author" : "xcode",
+    "version" : 1
+  }
+}

+ 22 - 0
TSLiveWallpaper/Assets.xcassets/Purchase/purchase_bg_shade.imageset/Contents.json

@@ -0,0 +1,22 @@
+{
+  "images" : [
+    {
+      "idiom" : "universal",
+      "scale" : "1x"
+    },
+    {
+      "filename" : "purchase_bg_shade@2x.png",
+      "idiom" : "universal",
+      "scale" : "2x"
+    },
+    {
+      "filename" : "purchase_bg_shade@3x.png",
+      "idiom" : "universal",
+      "scale" : "3x"
+    }
+  ],
+  "info" : {
+    "author" : "xcode",
+    "version" : 1
+  }
+}

BIN
TSLiveWallpaper/Assets.xcassets/Purchase/purchase_bg_shade.imageset/purchase_bg_shade@2x.png


BIN
TSLiveWallpaper/Assets.xcassets/Purchase/purchase_bg_shade.imageset/purchase_bg_shade@3x.png


BIN
TSLiveWallpaper/Assets.xcassets/Vip/Cloud_Music.imageset/Cloud_Music@1x.png


BIN
TSLiveWallpaper/Assets.xcassets/Vip/Cloud_Music.imageset/Cloud_Music@2x.png


BIN
TSLiveWallpaper/Assets.xcassets/Vip/Cloud_Music.imageset/Cloud_Music@3x.png


BIN
TSLiveWallpaper/Assets.xcassets/Vip/Cloud_Music_Pro.imageset/Cloud_Music_Pro@1x.png


BIN
TSLiveWallpaper/Assets.xcassets/Vip/Cloud_Music_Pro.imageset/Cloud_Music_Pro@2x.png


BIN
TSLiveWallpaper/Assets.xcassets/Vip/Cloud_Music_Pro.imageset/Cloud_Music_Pro@3x.png


+ 0 - 23
TSLiveWallpaper/Assets.xcassets/Vip/Cloud_Music_Pro.imageset/Contents.json

@@ -1,23 +0,0 @@
-{
-  "images" : [
-    {
-      "filename" : "Cloud_Music_Pro@1x.png",
-      "idiom" : "universal",
-      "scale" : "1x"
-    },
-    {
-      "filename" : "Cloud_Music_Pro@2x.png",
-      "idiom" : "universal",
-      "scale" : "2x"
-    },
-    {
-      "filename" : "Cloud_Music_Pro@3x.png",
-      "idiom" : "universal",
-      "scale" : "3x"
-    }
-  ],
-  "info" : {
-    "author" : "xcode",
-    "version" : 1
-  }
-}

+ 0 - 23
TSLiveWallpaper/Assets.xcassets/Vip/Dmanager_pro.imageset/Contents.json

@@ -1,23 +0,0 @@
-{
-  "images" : [
-    {
-      "filename" : "Dmanager_pro@1x.png",
-      "idiom" : "universal",
-      "scale" : "1x"
-    },
-    {
-      "filename" : "Dmanager_pro@2x.png",
-      "idiom" : "universal",
-      "scale" : "2x"
-    },
-    {
-      "filename" : "Dmanager_pro@3x.png",
-      "idiom" : "universal",
-      "scale" : "3x"
-    }
-  ],
-  "info" : {
-    "author" : "xcode",
-    "version" : 1
-  }
-}

BIN
TSLiveWallpaper/Assets.xcassets/Vip/Dmanager_pro.imageset/Dmanager_pro@1x.png


BIN
TSLiveWallpaper/Assets.xcassets/Vip/Dmanager_pro.imageset/Dmanager_pro@2x.png


BIN
TSLiveWallpaper/Assets.xcassets/Vip/Dmanager_pro.imageset/Dmanager_pro@3x.png


+ 0 - 23
TSLiveWallpaper/Assets.xcassets/Vip/Old-Tim_pro.imageset/Contents.json

@@ -1,23 +0,0 @@
-{
-  "images" : [
-    {
-      "filename" : "Old-Tim_pro@1x.png",
-      "idiom" : "universal",
-      "scale" : "1x"
-    },
-    {
-      "filename" : "Old-Tim_pro@2x.png",
-      "idiom" : "universal",
-      "scale" : "2x"
-    },
-    {
-      "filename" : "Old-Tim_pro@3x.png",
-      "idiom" : "universal",
-      "scale" : "3x"
-    }
-  ],
-  "info" : {
-    "author" : "xcode",
-    "version" : 1
-  }
-}

BIN
TSLiveWallpaper/Assets.xcassets/Vip/Old-Tim_pro.imageset/Old-Tim_pro@1x.png


BIN
TSLiveWallpaper/Assets.xcassets/Vip/Old-Tim_pro.imageset/Old-Tim_pro@2x.png


BIN
TSLiveWallpaper/Assets.xcassets/Vip/Old-Tim_pro.imageset/Old-Tim_pro@3x.png


BIN
TSLiveWallpaper/Assets.xcassets/Vip/noVip_big_bg.imageset/noVip_big_bg@2x.png


BIN
TSLiveWallpaper/Assets.xcassets/Vip/noVip_big_bg.imageset/noVip_big_bg@3x.png


+ 22 - 0
TSLiveWallpaper/Assets.xcassets/Vip/setting_purchase_bg.imageset/Contents.json

@@ -0,0 +1,22 @@
+{
+  "images" : [
+    {
+      "idiom" : "universal",
+      "scale" : "1x"
+    },
+    {
+      "filename" : "setting_purchase_bg@2x.png",
+      "idiom" : "universal",
+      "scale" : "2x"
+    },
+    {
+      "filename" : "setting_purchase_bg@3x.png",
+      "idiom" : "universal",
+      "scale" : "3x"
+    }
+  ],
+  "info" : {
+    "author" : "xcode",
+    "version" : 1
+  }
+}

BIN
TSLiveWallpaper/Assets.xcassets/Vip/setting_purchase_bg.imageset/setting_purchase_bg@2x.png


BIN
TSLiveWallpaper/Assets.xcassets/Vip/setting_purchase_bg.imageset/setting_purchase_bg@3x.png


+ 22 - 0
TSLiveWallpaper/Assets.xcassets/Vip/setting_purchase_vip_bg.imageset/Contents.json

@@ -0,0 +1,22 @@
+{
+  "images" : [
+    {
+      "idiom" : "universal",
+      "scale" : "1x"
+    },
+    {
+      "filename" : "setting_purchase_vip_bg@2x.png",
+      "idiom" : "universal",
+      "scale" : "2x"
+    },
+    {
+      "filename" : "setting_purchase_vip_bg@3x.png",
+      "idiom" : "universal",
+      "scale" : "3x"
+    }
+  ],
+  "info" : {
+    "author" : "xcode",
+    "version" : 1
+  }
+}

BIN
TSLiveWallpaper/Assets.xcassets/Vip/setting_purchase_vip_bg.imageset/setting_purchase_vip_bg@2x.png


BIN
TSLiveWallpaper/Assets.xcassets/Vip/setting_purchase_vip_bg.imageset/setting_purchase_vip_bg@3x.png


BIN
TSLiveWallpaper/Assets.xcassets/Vip/vip_big_bg.imageset/vip_big_bg@2x.png


BIN
TSLiveWallpaper/Assets.xcassets/Vip/vip_big_bg.imageset/vip_big_bg@3x.png


BIN
TSLiveWallpaper/Assets.xcassets/Vip/vip_big_icon.imageset/vip_big_icon@2x.png


BIN
TSLiveWallpaper/Assets.xcassets/Vip/vip_big_icon.imageset/vip_big_icon@3x.png


+ 8 - 18
TSLiveWallpaper/Base.lproj/LaunchScreen.storyboard

@@ -5,7 +5,6 @@
         <deployment identifier="iOS"/>
         <plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="23506"/>
         <capability name="Safe area layout guides" minToolsVersion="9.0"/>
-        <capability name="System colors in document resources" minToolsVersion="11.0"/>
         <capability name="documents saved in the Xcode 8 format" minToolsVersion="8.0"/>
     </dependencies>
     <scenes>
@@ -17,22 +16,17 @@
                         <rect key="frame" x="0.0" y="0.0" width="393" height="852"/>
                         <autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
                         <subviews>
-                            <imageView clipsSubviews="YES" userInteractionEnabled="NO" contentMode="scaleToFill" horizontalHuggingPriority="251" verticalHuggingPriority="251" image="view_main_bg" translatesAutoresizingMaskIntoConstraints="NO" id="k6m-Z3-ud5">
-                                <rect key="frame" x="-10" y="-10" width="413" height="872"/>
-                            </imageView>
-                            <imageView clipsSubviews="YES" userInteractionEnabled="NO" contentMode="scaleAspectFit" horizontalHuggingPriority="251" verticalHuggingPriority="251" image="Flash-old-Time.png" translatesAutoresizingMaskIntoConstraints="NO" id="hat-TL-4Cc">
-                                <rect key="frame" x="70" y="405" width="253" height="42"/>
+                            <imageView clipsSubviews="YES" userInteractionEnabled="NO" contentMode="scaleAspectFit" horizontalHuggingPriority="251" verticalHuggingPriority="251" image="launch1.png" translatesAutoresizingMaskIntoConstraints="NO" id="JeO-0Z-rkP">
+                                <rect key="frame" x="0.0" y="0.0" width="393" height="852"/>
                             </imageView>
                         </subviews>
                         <viewLayoutGuide key="safeArea" id="6Tk-OE-BBY"/>
-                        <color key="backgroundColor" systemColor="systemBackgroundColor"/>
+                        <color key="backgroundColor" white="0.0" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
                         <constraints>
-                            <constraint firstItem="hat-TL-4Cc" firstAttribute="centerX" secondItem="Ze5-6b-2t3" secondAttribute="centerX" id="2Eb-IB-Uz4"/>
-                            <constraint firstItem="k6m-Z3-ud5" firstAttribute="leading" secondItem="Ze5-6b-2t3" secondAttribute="leading" constant="-10" id="74o-H6-w94"/>
-                            <constraint firstAttribute="bottom" secondItem="k6m-Z3-ud5" secondAttribute="bottom" constant="-10" id="RaH-rc-r5t"/>
-                            <constraint firstAttribute="trailing" secondItem="k6m-Z3-ud5" secondAttribute="trailing" constant="-10" id="a2g-2x-V75"/>
-                            <constraint firstItem="k6m-Z3-ud5" firstAttribute="top" secondItem="Ze5-6b-2t3" secondAttribute="top" constant="-10" id="rdL-FS-whC"/>
-                            <constraint firstItem="hat-TL-4Cc" firstAttribute="centerY" secondItem="Ze5-6b-2t3" secondAttribute="centerY" id="xat-IC-xej"/>
+                            <constraint firstItem="JeO-0Z-rkP" firstAttribute="top" secondItem="Ze5-6b-2t3" secondAttribute="top" id="X65-Dm-JHY"/>
+                            <constraint firstItem="JeO-0Z-rkP" firstAttribute="leading" secondItem="Ze5-6b-2t3" secondAttribute="leading" id="lAO-C0-uao"/>
+                            <constraint firstAttribute="trailing" secondItem="JeO-0Z-rkP" secondAttribute="trailing" id="qqY-1W-uPW"/>
+                            <constraint firstAttribute="bottom" secondItem="JeO-0Z-rkP" secondAttribute="bottom" id="tal-D0-rov"/>
                         </constraints>
                     </view>
                 </viewController>
@@ -42,10 +36,6 @@
         </scene>
     </scenes>
     <resources>
-        <image name="Flash-old-Time.png" width="253" height="42"/>
-        <image name="view_main_bg" width="375" height="812"/>
-        <systemColor name="systemBackgroundColor">
-            <color white="1" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
-        </systemColor>
+        <image name="launch1.png" width="750" height="1624"/>
     </resources>
 </document>

+ 36 - 12
TSLiveWallpaper/Business/BusinessView/TSAppBtnView.swift

@@ -186,21 +186,45 @@ extension TSAppBtnView{
     }
     
 }
+
 //常用提交按钮
-func kCreateNormalSubmitBtn(title:String,frame:CGRect,action: (() -> Void)? = nil) -> UIButton {
-    let btn = TSNormalSubmitBtn()
-    btn.frame = frame
-    btn.setUpButton(title:title,font: UIFont.font(size: 16,weight: .medium),titleColor:.black,corner: frame.height/2,action: action)
+func kCreateNormalSubmitBtn(
+    title:String,
+    font:UIFont = UIFont.font(name: .ZillaSlab,size: 18,weight: .bold),
+    frame:CGRect? = nil,
+    action: (() -> Void)? = nil
+)-> UIButton {
+    let btn = UIButton.createButton(title:title,font: font,titleColor:"#111111".uiColor,corner: 0,action: action)
+    
+    if let frame = frame {
+        btn.frame = frame
+    }
+
+//    buttonBgImage = buttongImage.resizableImage(withCapInsets: UIEdgeInsets(top:24, left: 24, bottom: 24, right: 24), resizingMode: .stretch)
+    btn.setBackgroundImage(kSubmitBtnbg, for: .normal)
+//    buttonDisBgImage = buttonDisBgImage.resizableImage(withCapInsets: UIEdgeInsets(top:24, left: 24, bottom: 24, right: 24), resizingMode: .stretch)
+    btn.setBackgroundImage(kSubmitBtnbg, for: .disabled)
     btn.setTitleImageSpace(spacing: 8)
+    return btn
+}
 
-    var buttonBgImage = UIImage(named: "submit_btn_bg")!
-    buttonBgImage = buttonBgImage.resizableImage(withCapInsets: UIEdgeInsets(top:24, left: 24, bottom: 24, right: 24), resizingMode: .stretch)
-    btn.setBackgroundImage(buttonBgImage, for: .normal)
-    
-    var buttonDisBgImage = UIImage(named: "submit_btn_dis_bg")!
-    buttonDisBgImage = buttonDisBgImage.resizableImage(withCapInsets: UIEdgeInsets(top:24, left: 24, bottom: 24, right: 24), resizingMode: .stretch)
-    btn.setBackgroundImage(buttonDisBgImage, for: .disabled)
-    
+
+let kSubmitBtnbg = UIImage(named: "submit_btn_bg")
+let kSubmitBtnSmallBg = UIImage(named: "submit_btn_small_bg")
+let kSubmitBtnNormalbg = UIImage(named: "submit_btn_normal_bg")
+
+//常用取消按钮
+func kCreateNormalCancelBtn(title:String, action: (() -> Void)? = nil) -> UIButton {
+    let btn = UIButton.createButton(title:title,backgroundColor: .fromHex("#FFFFFF", alpha: 0.4),font: UIFont.font(size: 14,weight: .medium),titleColor:.white,corner: 30,action: action)
+    return btn
+}
+//常用确定按钮
+func kCreateNormalConfirmBtn(title:String, action: (() -> Void)? = nil) -> UIButton {
+    let btn = UIButton.createButton(title:title,backgroundImage:UIImage(named: "submit_btn_small_bg"),font: UIFont.font(size: 14,weight: .medium),titleColor:.white,corner: 30,action: action)
     return btn
 }
 
+//给按钮设置 vip 图标
+func kSetBtnVipIcon(btn:UIButton,show:Bool){
+    btn.setImage(show ? UIImage(named:"btnImage_vip") : nil, for: .normal)
+}

+ 172 - 0
TSLiveWallpaper/Business/BusinessView/TSImageComparisonView.swift

@@ -0,0 +1,172 @@
+//
+//  TSImageComparisonView.swift
+//  testApp
+//
+//  Created by 100Years on 2025/5/11.
+//
+
+import UIKit
+
+class TSImageComparisonView: UIView {
+    // MARK: - 属性
+    private let oldImageView = UIImageView()
+    private let newImageView = UIImageView()
+    private let lineView = UIView()
+    private var displayLink: CADisplayLink?
+    private var animationStartTime: CFTimeInterval = 0
+    var duration: TimeInterval = 3.0
+    
+    var isRunloop:Bool = false //是否循环播放,从右到左,在从左到右
+    private var reverse:Bool = false //动画反转(进度反转)
+    
+    // 动画方向枚举
+     enum AnimationDirection {
+         case leftToRight  // 从左到右(默认)
+         case rightToLeft  // 从右到左
+     }
+    private var maskLayer = CAShapeLayer()
+    var direction:AnimationDirection = .leftToRight
+    // MARK: - 初始化
+    override init(frame: CGRect) {
+        super.init(frame: frame)
+        setupViews()
+    }
+    
+    required init?(coder: NSCoder) {
+        super.init(coder: coder)
+        setupViews()
+    }
+    
+    // MARK: - 视图设置
+    private func setupViews() {
+        // 旧图片视图(初始显示)
+        oldImageView.contentMode = .scaleAspectFill
+        oldImageView.clipsToBounds = true
+        addSubview(oldImageView)
+        
+        // 新图片视图(初始隐藏)
+        newImageView.contentMode = .scaleAspectFill
+        newImageView.clipsToBounds = true
+        addSubview(newImageView)
+        resetNewImageView()
+        // 分割线样式
+        lineView.backgroundColor = .white
+        lineView.alpha = 0 // 初始隐藏
+        addSubview(lineView)
+    }
+    
+    // MARK: - 布局
+    override func layoutSubviews() {
+        super.layoutSubviews()
+        oldImageView.frame = bounds
+        newImageView.frame = bounds
+        lineView.frame = CGRect(x: 0, y: 0, width: 1, height: bounds.height)
+    }
+    
+    // MARK: - 公开方法
+    func configure(oldImage: UIImage?, newImage: UIImage?) {
+        oldImageView.image = oldImage
+        newImageView.image = newImage
+        reset()
+    }
+    
+    func startAnimation(duration: TimeInterval = 1.5,direction:AnimationDirection = .leftToRight) {
+
+        reset()
+        
+        self.duration = duration
+        self.direction = direction
+        lineView.alpha = 1
+        
+        startAnimationTime()
+    }
+    
+    
+    private func startAnimationTime(){
+        // 启动动画
+        animationStartTime = CACurrentMediaTime()
+        displayLink = CADisplayLink(target: self, selector: #selector(updateAnimation))
+        displayLink?.add(to: .main, forMode: .common)
+    }
+    
+    func stopAnimation() {
+        displayLink?.invalidate()
+        displayLink = nil
+    }
+    
+    func animationComplete() {
+        if isRunloop {
+            stopAnimation()
+            lineView.alpha = 0.0
+            DispatchQueue.main.asyncAfter(deadline: .now()+0.2){
+                self.reverse = !self.reverse
+                self.lineView.alpha = 1.0
+                self.startAnimationTime()
+            }
+        } else {
+            reset()
+        }
+    }
+    func reset() {
+        stopAnimation()
+        lineView.alpha = 0
+        lineView.frame.origin.x = 0
+        self.newImageView.layer.mask = nil
+        reverse = false
+    }
+    
+    func resetNewImageView(){
+        maskLayer.path = UIBezierPath(rect: CGRect(
+            x: 0,
+            y: 0,
+            width: x,
+            height: bounds.height
+        )).cgPath
+        newImageView.layer.mask = maskLayer
+    }
+    
+    // MARK: - 动画更新
+    @objc private func updateAnimation() {
+        guard displayLink != nil else { return }
+        
+        let elapsed = CACurrentMediaTime() - animationStartTime
+        let duration = self.duration
+        var progress = min(CGFloat(elapsed / duration), 1.0)
+        
+        if reverse { //反转进度
+            progress = 1.0 - progress
+        }
+        
+        var x = bounds.width * progress - lineView.frame.size.width
+        var path = UIBezierPath(rect: CGRect(
+            x: 0,
+            y: 0,
+            width: x,
+            height: bounds.height
+        ))
+
+        if self.direction == .rightToLeft {
+            x = bounds.width - x
+            path = UIBezierPath(rect: CGRect(
+                x: x,
+                y: 0,
+                width: bounds.width - x,
+                height: bounds.height
+            ))
+        }
+        
+        // 更新分割线位置
+        lineView.frame.origin.x = x
+        
+        // 更新新图片显示区域
+        maskLayer.path = path.cgPath
+        newImageView.layer.mask = maskLayer
+//        dePrint("progress = \(progress)")
+        if progress == ((reverse == true) ? 0.0 : 1.0)  { //因为反转了进度,所以结果也要反转
+//            dePrint("animationComplete")
+            animationComplete()
+        }
+
+    }
+
+}

+ 0 - 0
TSLiveWallpaper/Business/TSAIListVC/TSAIPhotoDetailsVC/View/TSImageIPanComparisonView.swift → TSLiveWallpaper/Business/BusinessView/TSImageIPanComparisonView.swift


+ 0 - 36
TSLiveWallpaper/Business/BusinessView/TSView.swift

@@ -20,42 +20,6 @@ func createBlurEffectView(style:UIBlurEffect.Style,backgroundColor:UIColor? = ni
     return blurEffectView
 }
 
-//常用提交按钮
-func kCreateNormalSubmitBtn(title:String, action: (() -> Void)? = nil) -> UIButton {
-    let btn = UIButton.createButton(title:title,font: UIFont.font(name: .ZillaSlabBold,size: 16,weight: .bold),titleColor:.black,corner: 0,action: action)
-    
-    var buttonBgImage = UIImage(named: "submit_btn_bg")!
-    buttonBgImage = buttonBgImage.resizableImage(withCapInsets: UIEdgeInsets(top:24, left: 24, bottom: 24, right: 24), resizingMode: .stretch)
-    btn.setBackgroundImage(buttonBgImage, for: .normal)
-    
-    var buttonDisBgImage = UIImage(named: "submit_btn_dis_bg")!
-    buttonDisBgImage = buttonDisBgImage.resizableImage(withCapInsets: UIEdgeInsets(top:24, left: 24, bottom: 24, right: 24), resizingMode: .stretch)
-    btn.setBackgroundImage(buttonDisBgImage, for: .disabled)
-    btn.setTitleImageSpace(spacing: 8)
-    return btn
-}
-
-
-let kSubmitBtnbg = UIImage(named: "submit_btn_bg")
-let kSubmitBtnSmallBg = UIImage(named: "submit_btn_small_bg")
-let kSubmitBtnNormalbg = UIImage(named: "submit_btn_normal_bg")
-
-//常用取消按钮
-func kCreateNormalCancelBtn(title:String, action: (() -> Void)? = nil) -> UIButton {
-    let btn = UIButton.createButton(title:title,backgroundColor: .fromHex("#FFFFFF", alpha: 0.4),font: UIFont.font(size: 14,weight: .medium),titleColor:.white,corner: 30,action: action)
-    return btn
-}
-//常用确定按钮
-func kCreateNormalConfirmBtn(title:String, action: (() -> Void)? = nil) -> UIButton {
-    let btn = UIButton.createButton(title:title,backgroundImage:UIImage(named: "submit_btn_small_bg"),font: UIFont.font(size: 14,weight: .medium),titleColor:.white,corner: 30,action: action)
-    return btn
-}
-
-//给按钮设置 vip 图标
-func kSetBtnVipIcon(btn:UIButton,show:Bool){
-    btn.setImage(show ? UIImage(named:"btnImage_vip") : nil, for: .normal)
-}
-
 let kPlaceholderImage = UIImage(named: "placeholderImage")
 
 

+ 172 - 0
TSLiveWallpaper/Business/BusinessView/TYCycleImageComparisonView.swift

@@ -0,0 +1,172 @@
+//
+//  TYCycleImageComparisonView.swift
+//  AIEmoji
+//
+//  Created by 100Years on 2025/5/12.
+//
+
+import TYCyclePagerView
+
+
+
+class TSImageComparisonModel {
+    var oldImage:UIImage   //下层图片
+    var newImage:UIImage     //上层图片
+    
+    init(oldImage: UIImage, newImage: UIImage) {
+        self.oldImage = oldImage
+        self.newImage = newImage
+    }
+}
+
+
+class TYCycleImageComparisonView: TSBaseView {
+    var lastIndex:Int = 0
+    var itemSize:CGSize = UIScreen.main.bounds.size
+    var itemModelArray:[TSImageComparisonModel] = [TSImageComparisonModel](){
+        didSet{
+            itemSize = self.bounds.size
+            cyclePagerView.reloadData()
+        }
+    }
+        
+    lazy var titleLabel: UILabel = {
+        let titleLabel = UILabel.createLabel(text: "Anime Effect".localized,font: .font(size: 14.0),textColor: .white.withAlphaComponent(0.6))
+        return titleLabel
+    }()
+    
+    var titleArray:[String] = []
+    lazy var blurEffect: UIView = {
+        let bgView = UIView()
+        
+        let blurEffect = createBlurEffectView(style: .dark)
+        blurEffect.cornerRadius = 13.0
+        bgView.addSubview(blurEffect)
+        blurEffect.snp.makeConstraints { make in
+            make.edges.equalToSuperview()
+        }
+
+        bgView.addSubview(titleLabel)
+        titleLabel.snp.makeConstraints { make in
+            make.edges.equalTo(UIEdgeInsets(top: 6, left: 12, bottom: 6, right: 12))
+        }
+        
+        return bgView
+    }()
+    
+    lazy var cyclePagerView: TYCyclePagerView = {
+        let pagerView = TYCyclePagerView()
+        pagerView.isInfiniteLoop = true
+        pagerView.autoScrollInterval = 1.7
+        pagerView.delegate = self
+        pagerView.dataSource = self
+        pagerView.layout.layoutType = TYCyclePagerTransformLayoutType.linear
+        pagerView.register(TSCycleImageComparisonCell.classForCoder(), forCellWithReuseIdentifier: TSCycleImageComparisonCell.reuseIdentifier)
+        return pagerView
+    }()
+    
+    
+    override func creatUI() {
+
+        addSubview(cyclePagerView)
+        cyclePagerView.snp.makeConstraints { make in
+            make.edges.equalToSuperview()
+        }
+        
+        addSubview(blurEffect)
+        blurEffect.snp.makeConstraints { make in
+            make.top.equalTo(k_Height_statusBar()+12.0)
+            make.centerX.equalToSuperview()
+            make.height.equalTo(26.0)
+        }
+    
+    }
+
+}
+
+
+extension TYCycleImageComparisonView : TYCyclePagerViewDelegate, TYCyclePagerViewDataSource{
+    
+    func numberOfItems(in pageView: TYCyclePagerView) -> Int {
+        return itemModelArray.count
+    }
+    
+    func pagerView(_ pagerView: TYCyclePagerView, cellForItemAt index: Int) -> UICollectionViewCell {
+        let cell = pagerView.dequeueReusableCell(withReuseIdentifier: TSCycleImageComparisonCell.reuseIdentifier, for: index) as! TSCycleImageComparisonCell
+        
+        if let itemModel = itemModelArray.safeObj(At: index) {
+            cell.itemModel = itemModel
+        }
+        
+        return cell
+    }
+    
+    func layout(for pageView: TYCyclePagerView) -> TYCyclePagerViewLayout {
+        let layout = TYCyclePagerViewLayout()
+        layout.itemSize = itemSize
+        layout.itemSpacing = 0
+        layout.itemHorizontalCenter = true
+        layout.layoutType = .normal
+        return layout
+    }
+
+
+    func pagerView(_ pageView: TYCyclePagerView, didSelectedItemCell cell: UICollectionViewCell, at index: Int) {
+ 
+    }
+    
+    func pagerViewDidScroll(_ pageView: TYCyclePagerView) {
+        
+        titleLabel.text = titleArray.safeString(At: pageView.curIndex)
+        if let oldCell = cyclePagerView.collectionView?.cellForItem(at: IndexPath(item: lastIndex, section: 0)) as? TSCycleImageComparisonCell{
+            oldCell.stopAnimation()
+        }
+        
+        if let curCell = cyclePagerView.collectionView?.cellForItem(at: IndexPath(item: pageView.curIndex, section: 0)) as? TSCycleImageComparisonCell{
+            curCell.startAnimation()
+        }
+        
+        lastIndex = pageView.curIndex
+    }
+   
+}
+
+
+
+//MARK: TSCycleImageComparisonCell
+class TSCycleImageComparisonCell: TSBaseCollectionCell {
+    static let reuseIdentifier = "TSCycleImageComparisonCell"
+
+    var itemModel:TSImageComparisonModel?{
+        didSet{
+            comparisonView.configure(
+                oldImage: itemModel?.oldImage,
+                newImage: itemModel?.newImage
+            )
+            comparisonView.frame = self.bounds
+            comparisonView.startAnimation(direction: .rightToLeft)
+        }
+    }
+    
+    lazy var comparisonView: TSImageComparisonView = {
+        let comparisonView = TSImageComparisonView(frame: CGRect(x: 0, y: 300, width: 300, height: 400))
+        comparisonView.configure(
+            oldImage: UIImage(named: "old_photo"),
+            newImage: UIImage(named: "new_photo")
+        )
+        return comparisonView
+    }()
+
+    override func creatUI() {
+        addSubview(comparisonView)
+    }
+    
+    func startAnimation() {
+        comparisonView.startAnimation(direction: .rightToLeft)
+    }
+    
+    func stopAnimation() {
+        comparisonView.stopAnimation()
+    }
+}
+

+ 25 - 1
TSLiveWallpaper/Business/TSAIListVC/TSAIAgeImageHintVC/TSAIListHintBaseVC.swift

@@ -78,6 +78,30 @@ class TSAIListHintBaseVC: TSBaseVC {
                           badText: "Unsuitable".localized,
                           badInfoText: "High-resolution, Not damaged, and Clear photos".localized)
         }
+        
+        static var enlightenConfig:Config {
+            return Config(imageMaxBitSize: kUploadImageMaxBit10Size,
+                          goodImageNamed: "hint_Enlighten_good",
+                          badImageNamed: "hint_Enlighten_bad",
+                          titleText: "Descratch Tips".localized,
+                          titleSubText: "",
+                          goodText: "Suitable".localized,
+                          goodInfoText: "Over-dark or over-light, overexposed, or underexposed photos".localized,
+                          badText: "Unsuitable".localized,
+                          badInfoText: "Well-exposed or severely damaged photos".localized)
+        }
+        
+        static var recreateConfig:Config {
+            return Config(imageMaxBitSize: kUploadImageMaxBit10Size,
+                          goodImageNamed: "hint_Descratch_good",
+                          badImageNamed: "hint_Enhance_bad",
+                          titleText: "Descratch Tips".localized,
+                          titleSubText: "",
+                          goodText: "Suitable".localized,
+                          goodInfoText: "Portraits, Low-resolution and photos, faces should be visible".localized,
+                          badText: "Unsuitable".localized,
+                          badInfoText: "High resulotion, Severaly damaged and Difficult to recognize the face".localized)
+        }
     }
     
     var config:Config = Config.enhanceConfig
@@ -147,7 +171,7 @@ class TSAIListHintBaseVC: TSBaseVC {
        let fullText = config.titleText+config.titleSubText
        let attString = NSMutableAttributedString(string: fullText)
 //        let mainRange = NSRange(location: 0, length: config.titleText.count)
-       attString.addAttributes([.font:UIFont.font(name:.ZillaSlabBold ,size: 26,weight: .bold),.foregroundColor:UIColor.white], range: NSRange(location: 0, length: config.titleText.count))
+       attString.addAttributes([.font:UIFont.font(name:.ZillaSlab ,size: 26,weight: .bold),.foregroundColor:UIColor.white], range: NSRange(location: 0, length: config.titleText.count))
        attString.addAttributes([.font:UIFont.font(size: 12),.foregroundColor:UIColor.white.withAlphaComponent(0.6)], range: NSRange(location: config.titleText.count, length: config.titleSubText.count))
 
         let titleLabel = UILabel.createLabel(numberOfLines: 0)

+ 10 - 14
TSLiveWallpaper/Business/TSAIListVC/TSAIList+Enmu.swift

@@ -9,14 +9,15 @@ enum TSGeneratorImageStyle:String {
     case enhance = "enhance"   //照片变高清
     case colorize = "colorize"   //黑白变颜色
     case descratch = "descratch"   //旧照片修复
+    
+    case enlighten = "enlighten"   //调整光线
+    case recreate = "recreate"   //修复和上色老照片
 
     var imageMaxKb:Int{
         switch self {
         case .descratch:
             return 5*1024
-        case .colorize:
-            return 10*1024
-        case .enhance:
+        default:
             return 10*1024
         }
     }
@@ -25,22 +26,13 @@ enum TSGeneratorImageStyle:String {
         switch self {
         case .descratch:
             return kUploadImageMaxBit5Size
-        case .colorize:
-            return kUploadImageMaxBit10Size
-        case .enhance:
+        default:
             return kUploadImageMaxBit10Size
         }
     }
     
     var userDefaultsKey:String{
-        switch self {
-        case .enhance:
-            return "isFirstEnhanceHintVC"
-        case .colorize:
-            return "isFirstColorizeHintVC"
-        case .descratch:
-            return "isFirstDescratchHintVC"
-        }
+        return self.rawValue
     }
     
     var config:TSAIListHintBaseVC.Config{
@@ -51,6 +43,10 @@ enum TSGeneratorImageStyle:String {
             return .colorizeConfig
         case .enhance:
             return .enhanceConfig
+        case .enlighten:
+            return .enlightenConfig
+        case .recreate:
+            return .recreateConfig
         }
     }
     

+ 2 - 2
TSLiveWallpaper/Business/TSAIListVC/TSAIListVC/TSAILIstCell.swift

@@ -28,7 +28,7 @@ class TSAILIstCell: TSBaseCollectionCell {
     
     
     lazy var titleLab: UILabel = {
-        let titleLab = UILabel.createLabel(font: .font(name: .ZillaSlabBold,size: 18,weight: .bold),textColor:.fromHex("FFFFFF"),numberOfLines: 0)
+        let titleLab = UILabel.createLabel(font: .font(name: .ZillaSlab,size: 18,weight: .bold),textColor:.fromHex("FFFFFF"),numberOfLines: 0)
         return titleLab
     }()
     
@@ -39,7 +39,7 @@ class TSAILIstCell: TSBaseCollectionCell {
     
     
     lazy var tryBtn: UIButton = {
-        let tryBtn = UIButton.createButton(title: "Try".localized,font: .font(name: .ZillaSlabBold,size: 14,weight: .medium),titleColor: "#121212".uiColor,corner: 13)
+        let tryBtn = UIButton.createButton(title: "Try".localized,font: .font(name: .ZillaSlab,size: 14,weight: .medium),titleColor: "#121212".uiColor,corner: 13)
         tryBtn.isUserInteractionEnabled = false
         tryBtn.contentEdgeInsets = UIEdgeInsets(top: 6, left: 20, bottom: 6, right: 20)
         kMainAsync {

+ 30 - 0
TSLiveWallpaper/Business/TSAIListVC/TSAIListVC/TSAIListVC.swift

@@ -13,6 +13,36 @@ class TSAIListVC: TSBaseVC {
         let sectionModel = TSBasicSectionModel()
         dataArray.append(sectionModel)
         
+        //调整光线
+        sectionModel.addSubItemModel(
+            createItemModel(
+                leftImageName:"aiList_Enlighten",
+                leftTitle: "Enlighten".localized,
+                leftSubTitle: "Remove scratches and dirt".localized,
+                rightViewStyle: 0,
+                tapBlock: { [weak self] model, _, _ in
+                   guard let self = self else { return }
+                    enterSelectPhotos(style: .enlighten) { image in
+                    let baseVc = TSAIUploadPhotoVC(titleString: model.leftTitle ?? "",upLoadImage: image, generatorStyle: .enlighten)
+                        kPushVC(target: self, modelVC: baseVc)
+                    }
+        }))
+        
+        //修复和上色老照片
+        sectionModel.addSubItemModel(
+            createItemModel(
+                leftImageName:"aiList_Recreate",
+                leftTitle: "Recreate".localized,
+                leftSubTitle: "Remove scratches and dirt".localized,
+                rightViewStyle: 0,
+                tapBlock: { [weak self] model, _, _ in
+                   guard let self = self else { return }
+                    enterSelectPhotos(style: .recreate) { image in
+                    let baseVc = TSAIUploadPhotoVC(titleString: model.leftTitle ?? "",upLoadImage: image, generatorStyle: .recreate)
+                        kPushVC(target: self, modelVC: baseVc)
+                    }
+        }))
+        
         //照片高清修复
         sectionModel.addSubItemModel(
             createItemModel(

+ 7 - 0
TSLiveWallpaper/Business/TSAIListVC/TSAIPhotoGeneratorVC/TSAIListPhotoGeneratorVM.swift

@@ -169,6 +169,13 @@ class TSAIListPhotoGeneratorBaseVM {
         case .descratch:
             urlType = .imageRewrite
             postDict["prompt"] = "Remove the photo's scratches and dirt"
+        case .enlighten:
+            urlType = .imageRewrite
+            postDict["prompt"] = "Adjust the light and darkness of the photo to make the overall look coordinated"
+            
+        case .recreate:
+            urlType = .imageRewrite
+            postDict["prompt"] = "Recreate damaged portraits and added suitable color for photo"
         }
         
         creatRequest = TSNetworkShared.post(urlType: urlType,parameters: postDict) { [weak self] data,error in

+ 22 - 1
TSLiveWallpaper/Business/TSAIListVC/TSAIUploadPhotoVC/TSAIUploadPhotoVC.swift

@@ -263,7 +263,25 @@ extension TSAIUploadPhotoVC {
     }
     
     var generatingText:String{
-        return "Generate".localized
+        
+        
+        switch generatorStyle {
+        case .enhance:
+            return "Enhance Photo".localized
+        case .colorize:
+            return "Colorize Photo".localized
+        case .descratch:
+            return "Descratch Photo".localized
+        case .enlighten:
+            return "Enlighten Photo".localized
+        case .recreate:
+            return "Recreate Photo".localized
+        default:
+            return "Generate".localized
+        }
+        
+        
+        
     }
 }
 
@@ -303,6 +321,9 @@ extension TSAIUploadPhotoVC {
             additionalPrompt = ""
 //        }
         let gennerateVC = TSAIListPhotoGeneratorVC(generatorModel: TSAIListPhotoGeneratorModel(upLoadImage: upLoadImage, generatorStyle: generatorStyle,additionalPrompt: additionalPrompt)){ [weak self] model in
+            guard let self = self else { return }
+            var infoModel = model
+            infoModel.generateStyle = self.generatorStyle.rawValue
             TSRMShared.aiListDB.updateData(model)
         }
         

+ 1 - 1
TSLiveWallpaper/Business/TSEditLiveVC/TSEditLiveVC.swift

@@ -75,7 +75,7 @@ class TSEditLiveVC: TSBaseVC, UINavigationControllerDelegate {
     }()
 
     override func createView() {
-        setViewBgImageNamed(named: "view_main_bg")
+        //setViewBgImageNamed(named: "view_main_bg")
         navBarContentView.addSubview(navBarView)
         navBarContentView.snp.remakeConstraints { make in
             make.top.equalTo(view.safeAreaLayoutGuide.snp.top)

+ 1 - 1
TSLiveWallpaper/Business/TSHomeVC/TSHomeVC.swift

@@ -76,7 +76,7 @@ class TSHomeVC: TSBaseVC {
 
     var dataArray: [TSComponent] = kImageDataCenterShared.liveBannerArray + kImageDataCenterShared.liveListArray
     override func createView() {
-        setViewBgImageNamed(named: "view_main_bg")
+        //setViewBgImageNamed(named: "view_main_bg")
 
         navBarContentView.addSubview(navBarView)
         navBarView.snp.makeConstraints { make in

+ 17 - 10
TSLiveWallpaper/Business/TSMineVC/TSMineCell.swift

@@ -7,12 +7,16 @@
 
 class TSMineCell: TSSimpleTableViewCell {
 
+    lazy var leftImageView: UIImageView = {
+        return UIImageView()
+    }()
+    
     lazy var leftLab: UILabel = {
-        return UILabel.createLabel(font: .font(size: 16),textColor: .white)
+        return UILabel.createLabel(font: .font(name:.ZillaSlab,size: 16),textColor: .white)
     }()
     
     lazy var rightLab: UILabel = {
-        return UILabel.createLabel(font: .font(size: 16),textColor: .fromHex("FFFFFF", alpha: 0.4))
+        return UILabel.createLabel(font: .font(name:.ZillaSlab,size: 16),textColor: .white)
     }()
     
     lazy var rightImageView: UIImageView = {
@@ -21,6 +25,7 @@ class TSMineCell: TSSimpleTableViewCell {
     
     override var itemModel:TSBasicItemModel{
         didSet{
+            leftImageView.image = itemModel.leftImage
             leftLab.text = itemModel.leftTitle
             rightLab.text = itemModel.rightString
             
@@ -35,19 +40,21 @@ class TSMineCell: TSSimpleTableViewCell {
     }
     
     override func creatUI() {
-        bgContentView.cornerRadius = 10
-        bgContentView.backgroundColor = UIColor.fromHex("FFFFFF", alpha: 0.1)
-        bgContentView.snp.updateConstraints { make in
-            make.top.equalTo(16)
-        }
-        
+        bgContentView.backgroundColor = .white.withAlphaComponent(0.1)
+        bgContentView.addSubview(leftImageView)
         bgContentView.addSubview(leftLab)
         bgContentView.addSubview(rightLab)
         bgContentView.addSubview(rightImageView)
         
-        leftLab.snp.makeConstraints { make in
+        leftImageView.snp.makeConstraints { make in
             make.leading.equalTo(16)
             make.centerY.equalToSuperview()
+            make.width.height.equalTo(20)
+        }
+        
+        leftLab.snp.makeConstraints { make in
+            make.leading.equalTo(leftImageView.snp.trailing).offset(12)
+            make.centerY.equalToSuperview()
         }
         
         rightLab.snp.makeConstraints { make in
@@ -58,7 +65,7 @@ class TSMineCell: TSSimpleTableViewCell {
         rightImageView.snp.makeConstraints { make in
             make.trailing.equalTo(-16)
             make.centerY.equalToSuperview()
-            make.width.height.equalTo(24)
+            make.width.height.equalTo(16)
         }
     }
 

+ 88 - 150
TSLiveWallpaper/Business/TSMineVC/TSMineVC.swift

@@ -4,75 +4,16 @@
 //
 //  Created by 100Years on 2024/12/20.
 //
-let appid = "6740220736"
+let appid = "6447607955"
 class TSMineVC: TSBaseVC {
-    lazy var navBarView: TSBaseNavContentBarView = {
-        let navBarView = TSBaseNavContentBarView()
-        let titleImageView = UIImageView.createImageView(imageName: "nav_title_setting", contentMode: .scaleToFill)
-
-        navBarView.barView.addSubview(titleImageView)
-        titleImageView.snp.makeConstraints { make in
-            make.centerY.equalToSuperview()
-            make.left.equalTo(16)
-        }
-        return navBarView
-    }()
-
-    lazy var vipBgImageView: UIImageView = {
-        let vipBgImageView = UIImageView.createImageView(imageName: "noVip_big_bg", contentMode: .scaleToFill)
-        vipBgImageView.isUserInteractionEnabled = true
-        return vipBgImageView
-    }()
-
-    lazy var vipTimeLabel: UILabel = {
-        let vipTimeLabel = UILabel.createLabel(text: "Limited Time Discount", font: .font(size: 14), textColor: .lesserText)
-        return vipTimeLabel
-    }()
-
-    lazy var upgradeBtn: UIButton = {
-        let upgradeBtn = TSViewTool.createNormalSubmitBtn(title: "Upgrade".localized) { [weak self] in
+    
+    lazy var headerView: TSMineTopView = {
+        let headerView = TSMineTopView()
+        headerView.frame = CGRect(x: 0, y: 0, width: k_ScreenWidth - 32, height: 134)
+        headerView.clickUpgrade = { [weak self]  in
             guard let self = self else { return }
-            TSPurchaseVC.show(target: self) { [weak self] in
-                guard let self = self else { return }
-                updateVipView()
-            }
+            TSPurchaseVC.show(target: self)
         }
-        upgradeBtn.cornerRadius = 13
-        upgradeBtn.titleLabel?.font = .font(size: 14)
-        return upgradeBtn
-    }()
-
-    lazy var headerView: UIView = {
-        let headerView = UIView()
-        headerView.frame = CGRect(x: 0, y: 0, width: k_ScreenWidth, height: 88)
-        headerView.addSubview(vipBgImageView)
-        vipBgImageView.snp.makeConstraints { make in
-            make.top.equalTo(0)
-            make.leading.trailing.bottom.equalTo(0)
-        }
-
-        let liveImageView = UIImageView.createImageView(imageName: "Old-Tim_pro")
-        vipBgImageView.addSubview(liveImageView)
-        liveImageView.snp.makeConstraints { make in
-            make.leading.equalTo(16)
-            make.top.equalTo(19)
-        }
-
-        vipBgImageView.addSubview(vipTimeLabel)
-        vipTimeLabel.snp.makeConstraints { make in
-            make.leading.equalTo(16)
-            make.bottom.equalTo(-19)
-            make.height.equalTo(14.0)
-        }
-
-        vipBgImageView.addSubview(upgradeBtn)
-        upgradeBtn.snp.makeConstraints { make in
-            make.width.equalTo(86)
-            make.height.equalTo(26)
-            make.trailing.equalTo(-29)
-            make.centerY.equalToSuperview()
-        }
-
         return headerView
     }()
 
@@ -89,49 +30,28 @@ class TSMineVC: TSBaseVC {
         let sectionModel = TSBasicSectionModel()
         dataArray.append(sectionModel)
 
-        sectionModel.addSubItemModel(
-            TSBasicItemModel.createItemModel(
-                leftTitle: "Update".localized,
-                rightViewStyle: 0,
-                rightString: "",
-                rightIsHave: true,
-                height: 80,
-                rectCorner: .allCorners,
-                tapBlock: { [weak self] _, _, _ in
-                    let httpAppStoreLink = "https://apps.apple.com/app/id\(appid)"
-                    guard let appStoreURL = URL(string: httpAppStoreLink) else { return }
-
-                    if UIApplication.shared.canOpenURL(appStoreURL) {
-                        UIApplication.shared.open(appStoreURL, options: [:], completionHandler: nil)
-                    }
-                }))
-
-        sectionModel.addSubItemModel(
-            TSBasicItemModel.createItemModel(
-                leftTitle: "Rate us".localized,
-                rightViewStyle: 0,
-                rightString: "",
-                rightIsHave: true,
-                height: 80,
-                rectCorner: .allCorners,
-                tapBlock: { [weak self] _, _, _ in
-
-                    guard let self = self else { return }
-                    let appStoreLink = "itms-apps://itunes.apple.com/app/id\(appid)"
-                    if let url = URL(string: appStoreLink + "?action=write-review"),
-                       UIApplication.shared.canOpenURL(url) {
-                        UIApplication.shared.open(url)
-                    }
-                }))
+//        sectionModel.addSubItemModel(
+//            createItemModel(
+//                leftImage: .mineCellShare,
+//                leftTitle: "Update".localized,
+//                rightViewStyle: 0,
+//                rightString: "",
+//                rightIsHave: true,
+//                height: 80,
+//                rectCorner: .allCorners,
+//                tapBlock: { [weak self] _, _, _ in
+//                    let httpAppStoreLink = "https://apps.apple.com/app/id\(appid)"
+//                    guard let appStoreURL = URL(string: httpAppStoreLink) else { return }
+//
+//                    if UIApplication.shared.canOpenURL(appStoreURL) {
+//                        UIApplication.shared.open(appStoreURL, options: [:], completionHandler: nil)
+//                    }
+//                }))
 
         sectionModel.addSubItemModel(
-            TSBasicItemModel.createItemModel(
+            createItemModel(
+                leftImage: .mineCellShare,
                 leftTitle: "Share us".localized,
-                rightViewStyle: 0,
-                rightString: "",
-                rightIsHave: true,
-                height: 80,
-                rectCorner: .allCorners,
                 tapBlock: { [weak self] _, _, _ in
                     guard let self = self else { return }
 
@@ -157,48 +77,54 @@ class TSMineVC: TSBaseVC {
                     self.present(vc, animated: true)
 
                 }))
+        
+        
+        sectionModel.addSubItemModel(
+            createItemModel(
+                leftImage: .mineCellRateUs,
+                leftTitle: "Rate us".localized,
+                tapBlock: { [weak self] _, _, _ in
 
+                    guard let self = self else { return }
+                    let appStoreLink = "itms-apps://itunes.apple.com/app/id\(appid)"
+                    if let url = URL(string: appStoreLink + "?action=write-review"),
+                       UIApplication.shared.canOpenURL(url) {
+                        UIApplication.shared.open(url)
+                    }
+                }))
+        
         sectionModel.addSubItemModel(
-            TSBasicItemModel.createItemModel(
-                leftTitle: "Privacy Policy".localized,
-                rightViewStyle: 0,
-                rightString: "",
-                rightIsHave: true,
-                height: 80,
-                rectCorner: .allCorners,
+            createItemModel(
+                leftImage: .mineCellUseragree,
+                leftTitle: "User Agreement".localized,
                 tapBlock: { [weak self] _, _, _ in
                     guard let self = self else { return }
-                    let vc = TSBusinessWebVC(urlType: .privacy)
+                    let vc = TSBusinessWebVC(urlType: .terms)
                     vc.hidesBottomBarWhenPushed = true
                     navigationController?.pushViewController(vc, animated: true)
                 }))
-
+        
         sectionModel.addSubItemModel(
-            TSBasicItemModel.createItemModel(
-                leftTitle: "Terms of Service".localized,
-                rightViewStyle: 0,
-                rightString: "",
-                rightIsHave: true,
-                height: 80,
-                rectCorner: .allCorners,
+            createItemModel(
+                leftImage: .mineCellPrivacy,
+                leftTitle: "Privacy Policy".localized,
                 tapBlock: { [weak self] _, _, _ in
                     guard let self = self else { return }
-                    let vc = TSBusinessWebVC(urlType: .terms)
+                    let vc = TSBusinessWebVC(urlType: .privacy)
                     vc.hidesBottomBarWhenPushed = true
                     navigationController?.pushViewController(vc, animated: true)
                 }))
 
+
+
         sectionModel.addSubItemModel(
-            TSBasicItemModel.createItemModel(
+            createItemModel(
+                leftImage: .mineCellAbout,
                 leftTitle: "About us".localized,
-                rightViewStyle: 0,
                 rightString: appVersion(),
                 rightIsHave: false,
-                height: 80,
-                rectCorner: .allCorners,
                 tapBlock: { [weak self] _, _, _ in
                     guard let self = self else { return }
-
                     #if DEBUG
                         let vc = TSPurchaseVC()
                         vc.hidesBottomBarWhenPushed = true
@@ -212,38 +138,50 @@ class TSMineVC: TSBaseVC {
     }()
 
     override func createView() {
-        setViewBgImageNamed(named: "view_main_bg")
-
-        navBarContentView.addSubview(navBarView)
-        navBarView.snp.makeConstraints { make in
-            make.edges.equalToSuperview()
-        }
-
+        setNavBarViewHidden(true)
         contentView.addSubview(simpleTableView.tableView)
         simpleTableView.tableView.snp.makeConstraints { make in
             make.leading.equalTo(16)
             make.trailing.equalTo(-16)
-            make.top.equalTo(16)
+            make.top.equalTo(20+k_Height_StatusBar)
             make.bottom.equalTo(0)
         }
     }
 
-    override func viewWillAppear(_ animated: Bool) {
+    override func dealThings() {
+        NotificationCenter.default.addObserver(self, selector: #selector(updateVipView), name: .kPurchaseDidChanged, object: nil)
         updateVipView()
+        
     }
-
-    func updateVipView() {
-        vipTimeLabel.text = PurchaseManager.default.expiredDateString
-        vipBgImageView.image = UIImage(named: PurchaseManager.default.isVip ? "vip_big_bg" : "noVip_big_bg")
-
-        if PurchaseManager.default.isVip {
-            vipTimeLabel.text = "Due Date: \(PurchaseManager.default.expiredDateString)"
-            vipBgImageView.image = UIImage(named: "vip_big_bg")
-            upgradeBtn.isHidden = true
-        } else {
-            vipTimeLabel.text = "Limited Time Discount"
-            vipBgImageView.image = UIImage(named: "noVip_big_bg")
-            upgradeBtn.isHidden = false
+    
+    @objc func updateVipView() {
+        kMainAsync {
+            self.headerView.updateVipView()
+            self.simpleTableView.tableView.reloadData()
         }
     }
 }
+
+
+extension TSMineVC {
+    func createItemModel(
+        leftImage:UIImage,
+        leftTitle: String,
+        rightViewStyle: Int = 0,
+        rightString: String = "",
+        rightIsHave: Bool = true,
+        height: CGFloat = 64,
+        tapBlock: @escaping ((TSBasicItemModel, Int, Any?) -> Void))
+    -> TSBasicItemModel
+    {
+        let model = TSBasicItemModel()
+        model.leftImage = leftImage
+        model.leftTitle = leftTitle
+        model.rightViewStyle = rightViewStyle
+        model.rightString = rightString
+        model.rightIsHave = rightIsHave
+        model.height = height
+        model.tapBlock = tapBlock
+        return model
+    }
+}

+ 153 - 0
TSLiveWallpaper/Business/TSMineVC/View/TSMineTopView.swift

@@ -0,0 +1,153 @@
+//
+//  TSMineTopView.swift
+//  TSLiveWallpaper
+//
+//  Created by 100Years on 2025/6/12.
+//
+
+class TSMineTopView: TSBaseView {
+    
+    var clickUpgrade:(()->Void)?
+    lazy var saveView: UIButton = {
+        let saveLabel = UIButton.createButton(title: "Save", backgroundColor:"#E83E3E".uiColor, font: .font(name: .ZillaSlab,size: 12), titleColor: .mainText,corner: 4.0)
+        saveLabel.contentEdgeInsets = UIEdgeInsets(top: 0, left: 12, bottom: 0, right: 12)
+        return saveLabel
+    }()
+    
+ 
+    lazy var titleLabel: UILabel = {
+        let titleLabel = UILabel.createLabel(text: "Update to PRO", font: .font(name: .ZillaSlabBoldItalic,size: 24,weight: .bold), textColor: .mainText)
+        return titleLabel
+    }()
+    
+    lazy var timeLabel: UILabel = {
+        let timeLabel = UILabel.createLabel(text: "Limited Time Discount", font: .font(name: .ZillaSlab,size: 14), textColor: .lesserText)
+        return timeLabel
+    }()
+
+    lazy var upgradeBtn: UIButton = {
+        let upgradeBtn = kCreateNormalSubmitBtn(title: "Upgrade".localized,font: .font(size: 18,weight: .medium)){ [weak self] in
+            guard let self = self else { return }
+            clickUpgrade?()
+        }
+        return upgradeBtn
+    }()
+    
+    lazy var noVipView: UIView = {
+        let contentView = UIView()
+        let vipBgImageView = UIImageView.createImageView(image: .settingPurchaseBg, contentMode: .scaleToFill)
+        contentView.addSubview(vipBgImageView)
+        vipBgImageView.snp.makeConstraints { make in
+            make.top.equalTo(0)
+            make.leading.trailing.bottom.equalTo(0)
+        }
+        
+        contentView.addSubview(upgradeBtn)
+        upgradeBtn.snp.makeConstraints { make in
+            make.leading.equalTo(16)
+            make.height.equalTo(38)
+            make.trailing.equalTo(-16)
+            make.bottom.equalTo(-12)
+        }
+    
+        contentView.addSubview(titleLabel)
+        titleLabel.snp.makeConstraints { make in
+            make.leading.equalTo(16)
+            make.top.equalTo(20)
+            make.height.equalTo(18)
+        }
+
+        contentView.addSubview(timeLabel)
+        timeLabel.snp.makeConstraints { make in
+            make.leading.equalTo(16)
+//            make.top.equalTo(titleLabel.snp.bottom).offset(18)
+            make.bottom.equalTo(upgradeBtn.snp.top).offset(-14)
+        }
+
+        contentView.addSubview(saveView)
+        saveView.snp.makeConstraints { make in
+            make.trailing.equalTo(-13)
+            make.top.equalTo(20)
+            make.height.equalTo(28)
+        }
+        
+        saveView.setRotation(angle: 15)
+        
+
+        return contentView
+    }()
+    
+
+    
+    lazy var vipTitleLabel: UILabel = {
+        let titleLabel = UILabel.createLabel(text: kAppName, font: .font(name: .ZillaSlabBoldItalic,size: 36,weight: .bold), textColor: .mainText)
+        kMainAsync {
+            titleLabel.applyGradient(colors: ["#F1D3AB".uiColor,"#E4A858".uiColor])
+        }
+        return titleLabel
+    }()
+    
+    lazy var vipTimeLabel: UILabel = {
+        let timeLabel = UILabel.createLabel(text: "Limited Time Discount", font: .font(size: 14), textColor: .lesserText)
+        return timeLabel
+    }()
+    
+    
+    lazy var vipView: UIView = {
+        let contentView = UIView()
+        
+        let vipBgImageView = UIImageView.createImageView(image: .settingPurchaseVipBg, contentMode: .scaleToFill)
+        contentView.addSubview(vipBgImageView)
+        vipBgImageView.snp.makeConstraints { make in
+            make.top.equalTo(0)
+            make.leading.trailing.bottom.equalTo(0)
+        }
+        
+        contentView.addSubview(vipTitleLabel)
+        vipTitleLabel.snp.makeConstraints { make in
+            make.top.equalTo(24)
+            make.centerX.equalToSuperview()
+        }
+
+        contentView.addSubview(vipTimeLabel)
+        vipTimeLabel.snp.makeConstraints { make in
+            make.centerX.equalToSuperview()
+            make.top.equalTo(vipTitleLabel.snp.bottom).offset(20)
+        }
+        contentView.isHidden = true
+        return contentView
+    }()
+    
+
+    override func creatUI() {
+
+        contentView.snp.updateConstraints { make in
+            make.bottom.equalTo(-16)
+        }
+        
+        contentView.addSubview(noVipView)
+        noVipView.snp.makeConstraints { make in
+            make.edges.equalToSuperview()
+        }
+        
+        contentView.addSubview(vipView)
+        vipView.snp.makeConstraints { make in
+            make.edges.equalToSuperview()
+        }
+        updateVipView()
+    }
+    
+    func updateVipView() {
+        if PurchaseManager.default.isVip {
+            self.height = 120 + 16
+            noVipView.isHidden = true
+            vipView.isHidden = false
+            vipTimeLabel.text = "Due Date: \(PurchaseManager.default.expiredDateString)"
+        } else {
+            self.height = 134 + 16
+            noVipView.isHidden = false
+            vipView.isHidden = true
+            saveView.setTitle("Save" + " " + PurchaseManager.default.vipType.saveString, for: .normal)
+        }
+    }
+}

+ 137 - 63
TSLiveWallpaper/Business/TSPurchaseMembershipVC/TSPurchaseVC.swift

@@ -7,7 +7,7 @@
 
 import Combine
 import SwiftUI
-
+import SwiftUIX
 class PurchaseViewModel : ObservableObject{
     
     @Published var selectedType: PremiumPeriod = .year//.lifetime
@@ -41,10 +41,25 @@ class TSPurchaseVC: TSBaseVC {
         return vc
     }()
     
+    
+    lazy var imageComparisonView: TYCycleImageComparisonView = {
+        let imageComparisonView = TYCycleImageComparisonView()
+        imageComparisonView.frame = CGRect(x: 0, y: 0, width: k_ScreenWidth, height: 532*kDesignScale)
+        imageComparisonView.titleArray = ["Descratch".localized,"Colorize".localized,"Enhance".localized,"Recreate".localized]
+        imageComparisonView.itemModelArray = [
+            TSImageComparisonModel(oldImage: UIImage(named: "image_comparison_old_0")!, newImage: UIImage(named: "image_comparison_new_0")!),
+            TSImageComparisonModel(oldImage: UIImage(named: "image_comparison_old_1")!, newImage: UIImage(named: "image_comparison_new_1")!),
+            TSImageComparisonModel(oldImage: UIImage(named: "image_comparison_old_2")!, newImage: UIImage(named: "image_comparison_new_2")!),
+            TSImageComparisonModel(oldImage: UIImage(named: "image_comparison_old_3")!, newImage: UIImage(named: "image_comparison_new_3")!)
+        ]
+        return imageComparisonView
+    }()
+    
     override func createView() {
         addNormalNavBarView()
         _ = setNavigationItem("", imageName: "close_gray", direction: .left, action: #selector(closePage))
-        setViewBgImageNamed(named: "view_main_bg")
+        setViewBgImageNamed(named: "purchase_bg_shade")
+        view.insertSubview(imageComparisonView, at: 0)
         
         contentView.addSubview(hostVc.view)
         hostVc.view.snp.makeConstraints { make in
@@ -190,7 +205,7 @@ class TSPurchaseVC: TSBaseVC {
 
 extension TSPurchaseVC{
     
-    static func show(target:UIViewController,closePageBlock:(()->Void)?){
+    static func show(target:UIViewController,closePageBlock:(()->Void)? = nil){
         let vc = TSPurchaseVC()
         vc.closePageBlock = closePageBlock
         let navi = TSBaseNavigationC(rootViewController: vc)
@@ -206,77 +221,72 @@ struct PurchaseView :View {
     @ObservedObject var viewModel: PurchaseViewModel
     
     var body: some View {
-        ScrollView {
-            Spacer().frame(height: 20)
+        let vipType = PurchaseManager.default.vipType
+        VStack {
+            Spacer()
             
             VStack {
-                Image("vip_big_icon").resizable().frame(width: 124, height: 102)
-                Spacer().frame(height: 12)
-                Image("Old-Tim_pro")
                 
-                Spacer().frame(height: 40)
+//                let text = vipType == .none ? "Get PRO Access".localized : "Super Offer for Yearly Pro".localized
+                // 自定义颜色
+                HighlightedText("Get PRO Access",
+                              highlighted: "PRO",
+                              baseColor: .gray,
+                              highlightColor: .yellow)
+                    .multilineTextAlignment(.center)
+                    .font(.font(name: .ZillaSlabBoldItalic,size: 36))
+//                    .foregroundColor(UIColor.white.color)
+                    .frame(width: k_ScreenWidth - 32, alignment: .center)
                 
-                ZStack {
-                    VStack(alignment: .leading,spacing: 8) {
-                        HStack(spacing: 8) {
-                            Image("check").resizable().frame(width: 24, height: 24)
-                            Text("Unlimited Restore Photos".localized())
-                        }
-                        HStack(spacing: 8) {
-                            Image("check").resizable().frame(width: 24, height: 24)
-                            Text("Enhance & Colorize at High Quality".localized())
-                        }
-                        
-                        HStack(spacing: 8) {
-                            Image("check").resizable().frame(width: 24, height: 24)
-                            Text("100% No Ads".localized()).multilineTextAlignment(.leading)
-                        }
-                    }.font(.font(size: 16)).foregroundColor(UIColor.lesserText.color)
-                }
-         
+                
+
             }
             
-            Spacer().frame(height: 72)
-            
-            
+            Spacer().frame(height: 30)
+ 
             VStack(spacing: 12) {
-//                PurchaseItemView(title: "Lifetime", type: .lifetime, selectedType: $viewModel.selectedType).onTapGesture {
-//                    viewModel.selectedType = .lifetime
-//                }
-//                HStack {
-//                    PurchaseItemView(title: "Yearly", type: .year, selectedType: $viewModel.selectedType).onTapGesture {
+                
+//                if vipType == .none {
+                    ZStack(alignment: .topTrailing) {
+//                    //增加月付费
+//                        PurchaseItemView(title: "One Month".localized, type: .month, selectedType: $viewModel.selectedType).onTapGesture {
+//                            viewModel.selectedType = .month
+                        PurchaseItemView(title: "YEARLY ACCESS".localized, type: .year, selectedType: $viewModel.selectedType).onTapGesture {
 //                        viewModel.selectedType = .year
-//                    }
-//                    
-//                    PurchaseItemView(title: "Monthly", type: .month, selectedType: $viewModel.selectedType).onTapGesture {
-//                        viewModel.selectedType = .month
+//                        viewModel.buyPublisher.send(true)
+                        }
+                        TSVipRecView(save: vipType.saveString)
+                            .offset(x:-30,y:-14)
+                    }
+                    
+                PurchaseItemView(title: "MONTH ACCESS".localized, type: .month, selectedType: $viewModel.selectedType).onTapGesture {
+                        viewModel.selectedType = .month
+                        viewModel.buyPublisher.send(true)
+                    }
+                    
+//                }else{
+//                    PurchaseItemTypeOneView(title: "One Year".localized, type: .year, selectedType: $viewModel.selectedType).onTapGesture {
+//                        viewModel.selectedType = .year
+//                        viewModel.buyPublisher.send(true)
 //                    }
 //                }
-                
-                PurchaseItemView(title: "Yearly", type: .year, selectedType: $viewModel.selectedType).onTapGesture {
-                    viewModel.selectedType = .year
-                }
-                
-                PurchaseItemView(title: "Monthly", type: .month, selectedType: $viewModel.selectedType).onTapGesture {
-                    viewModel.selectedType = .month
-                }
-                
+
                 Button {
                     viewModel.buyPublisher.send(true)
                 } label: {
                     ZStack {
-                        Image("normal_submit_bg").resizable().aspectRatio(contentMode: .fill)
+                        Image("submit_btn_bg").resizable().aspectRatio(contentMode: .fill)
                         Text("Continue")
                             .font(.system(size: 16))
-                            .foregroundColor(.hex("#010101"))
+                            .foregroundColor(.hex("#111111"))
                             
                     }.frame(maxWidth: .infinity ,maxHeight: 48.0)
-                        .cornerRadius(24.0)
+                        .cornerRadius(0.0)
                 }
             
                 HStack {
                     Text("Recurring billing, cancel anytime")
-                        .foregroundColor(Color.hex("#12FFF7")) +
+                        .foregroundColor(UIColor.themeColor.color) +
                         Text(", Payment will be charged to your iTunes account at confirmation of purchase. Subscriptions automatically renew for the same applicable term and price, unless auto-renew is turned off at least 24 hours before the end of the current period.")
                         .foregroundColor(UIColor.lesserText.color)
                 }
@@ -302,35 +312,99 @@ struct PurchaseView :View {
                         }
                 }.font(.system(size: 12)).foregroundColor(.hex("#999999"))
             }.padding(.horizontal)
+            
+            Spacer().frame(height:9+k_Height_safeAreaInsetsBottom())
         }
     }
 }
 
 
+
 struct PurchaseItemView: View {
     var title: String
     var type: PremiumPeriod
     @Binding var selectedType: PremiumPeriod
 
     var body: some View {
+        let textColor = Color.white.opacity(0.6)
+        
         ZStack {
             Color.white.opacity(0.1)
             HStack {
-                VStack(alignment: .leading, spacing: 8) {
-                    Text(title).font(.font(size: 14)).foregroundColor(UIColor.textAssist.color)
-                    Text(PurchaseManager.default.price(for: type) ?? "--").font(.font(size: 18,weight: .medium)).foregroundColor(UIColor.mainText.color)
+                //左边加个
+                VStack(alignment: .leading, spacing: 14) {
+                    Text(title).font(.font(size: 16,weight: .medium)).foregroundColor(type == selectedType ? UIColor.themeColor.color : textColor)
+                    Text(priceString()).font(.font(size: 14))
                 }
+
                 Spacer()
-                if type == selectedType {
-                    Image(.radioboxSelected)
-                }
+
+                //右边每周的💰
+                VStack(alignment: .trailing, spacing: 2) {
+                    Text("\(PurchaseManager.default.averageWeekly(for:type) ?? "--")")
+                    Text("Per week".localized)
+
+                }.font(.font(size: 16,weight: .regular)).foregroundColor(Color.white.opacity(0.6))
+
             }.padding(.horizontal)
         }
+        .foregroundColor(textColor)
         .frame(height: 74) // 设置高度
-        .cornerRadius(16.0) // 圆角
-//        .overlay(
-//            RoundedRectangle(cornerRadius: 12)
-//                .stroke(Color.hex("#6EF4F4"), lineWidth: type == selectedType ? 1 : 0) // 边框
-//        )
+        .overlay(
+            RoundedRectangle(cornerRadius: 0)
+                .stroke(UIColor.themeColor.color, lineWidth: type == selectedType ? 1 : 0) // 边框
+        )
     }
+    
+    func priceString()->String{
+        switch type {
+        case .year:
+            return "Just \(PurchaseManager.default.price(for: type) ?? "--") Per Year"
+        case .month:
+            return "Just \(PurchaseManager.default.price(for: type) ?? "--") Per Week"
+        default:
+            return "--"
+        }
+        
+    }
+}
+
+//推荐选择view
+struct TSVipRecView: View {
+    var save:String
+    var body: some View {
+        HStack(spacing: 4) {
+//            Image("upvote_black").resizable().frame(width: 16, height: 16)
+            Text(save + " " + "OFF".localized).font(.font(size: 12,weight: .medium)).foregroundColor(.hex("#111111"))
+        }
+        .padding(EdgeInsets(top: 6, leading: 6, bottom: 6, trailing: 6))
+//        .background(Color.hex("#FECB34"))
+//        .background(
+        .linearGradientBackground(colors: ["#F1D3AB".uiColor.color,"#E4A858".uiColor.color])
+        .frame(height: 24) // 设置高度
+        .cornerRadius(12.0)
+//        .cornerRadius([.topLeading, .topTrailing, .bottomLeading, .bottomTrailing], 16.0)
+    }
+}
+extension View {
+    /// 添加线性渐变背景
+    /// - Parameters:
+    ///   - colors: 渐变颜色数组
+    ///   - startPoint: 渐变起点 (默认 .top)
+    ///   - endPoint: 渐变终点 (默认 .bottom)
+    ///   - cornerRadius: 圆角半径 (默认 0)
+    func linearGradientBackground(colors: [Color],
+                                  startPoint: UnitPoint = .leading,
+                                  endPoint: UnitPoint = .trailing,
+                                  cornerRadius: CGFloat = 0) -> some View {
+        self.background(
+            LinearGradient(
+                gradient: Gradient(colors: colors),
+                startPoint: startPoint,
+                endPoint: endPoint
+            )
+            .cornerRadius(cornerRadius)
+        )
+    }
+    
 }

Some files were not shown because too many files changed in this diff