Преглед на файлове

3.6.17(1)
1.新增改变年纪
2.新增神奇文字
3.新增世界名画

100Years преди 16 часа
родител
ревизия
08d02f8004
променени са 97 файла, в които са добавени 1504 реда и са изтрити 162 реда
  1. 47 7
      TSLiveWallpaper.xcodeproj/project.pbxproj
  2. 6 0
      TSLiveWallpaper/Assets.xcassets/AIList/home/age/Contents.json
  3. 22 0
      TSLiveWallpaper/Assets.xcassets/AIList/home/age/alistHome_age_Adult.imageset/Contents.json
  4. BIN
      TSLiveWallpaper/Assets.xcassets/AIList/home/age/alistHome_age_Adult.imageset/alistHome_age_Adult@2x.png
  5. BIN
      TSLiveWallpaper/Assets.xcassets/AIList/home/age/alistHome_age_Adult.imageset/alistHome_age_Adult@3x.png
  6. 22 0
      TSLiveWallpaper/Assets.xcassets/AIList/home/age/alistHome_age_Baby.imageset/Contents.json
  7. BIN
      TSLiveWallpaper/Assets.xcassets/AIList/home/age/alistHome_age_Baby.imageset/alistHome_age_Baby@2x.png
  8. BIN
      TSLiveWallpaper/Assets.xcassets/AIList/home/age/alistHome_age_Baby.imageset/alistHome_age_Baby@3x.png
  9. 22 0
      TSLiveWallpaper/Assets.xcassets/AIList/home/age/alistHome_age_Child.imageset/Contents.json
  10. BIN
      TSLiveWallpaper/Assets.xcassets/AIList/home/age/alistHome_age_Child.imageset/alistHome_age_Child@2x.png
  11. BIN
      TSLiveWallpaper/Assets.xcassets/AIList/home/age/alistHome_age_Child.imageset/alistHome_age_Child@3x.png
  12. 22 0
      TSLiveWallpaper/Assets.xcassets/AIList/home/age/alistHome_age_Customize.imageset/Contents.json
  13. BIN
      TSLiveWallpaper/Assets.xcassets/AIList/home/age/alistHome_age_Customize.imageset/alistHome_age_Customize@2x.png
  14. BIN
      TSLiveWallpaper/Assets.xcassets/AIList/home/age/alistHome_age_Customize.imageset/alistHome_age_Customize@3x.png
  15. 22 0
      TSLiveWallpaper/Assets.xcassets/AIList/home/age/alistHome_age_MiddleAge.imageset/Contents.json
  16. BIN
      TSLiveWallpaper/Assets.xcassets/AIList/home/age/alistHome_age_MiddleAge.imageset/alistHome_age_MiddleAge@2x.png
  17. BIN
      TSLiveWallpaper/Assets.xcassets/AIList/home/age/alistHome_age_MiddleAge.imageset/alistHome_age_MiddleAge@3x.png
  18. 22 0
      TSLiveWallpaper/Assets.xcassets/AIList/home/age/alistHome_age_Senior.imageset/Contents.json
  19. BIN
      TSLiveWallpaper/Assets.xcassets/AIList/home/age/alistHome_age_Senior.imageset/alistHome_age_Senior@2x.png
  20. BIN
      TSLiveWallpaper/Assets.xcassets/AIList/home/age/alistHome_age_Senior.imageset/alistHome_age_Senior@3x.png
  21. 22 0
      TSLiveWallpaper/Assets.xcassets/AIList/home/age/alistHome_age_Teen.imageset/Contents.json
  22. BIN
      TSLiveWallpaper/Assets.xcassets/AIList/home/age/alistHome_age_Teen.imageset/alistHome_age_Teen@2x.png
  23. BIN
      TSLiveWallpaper/Assets.xcassets/AIList/home/age/alistHome_age_Teen.imageset/alistHome_age_Teen@3x.png
  24. 22 0
      TSLiveWallpaper/Assets.xcassets/AIList/home/age/alistHome_age_Youth.imageset/Contents.json
  25. BIN
      TSLiveWallpaper/Assets.xcassets/AIList/home/age/alistHome_age_Youth.imageset/alistHome_age_Youth@2x.png
  26. BIN
      TSLiveWallpaper/Assets.xcassets/AIList/home/age/alistHome_age_Youth.imageset/alistHome_age_Youth@3x.png
  27. 21 0
      TSLiveWallpaper/Assets.xcassets/AIList/home/alistHome_0_GirlPearlEarring.imageset/Contents.json
  28. BIN
      TSLiveWallpaper/Assets.xcassets/AIList/home/alistHome_0_GirlPearlEarring.imageset/alistHome_0_GirlPearlEarring@3x.png
  29. 21 0
      TSLiveWallpaper/Assets.xcassets/AIList/home/alistHome_0_HelenaFourment.imageset/Contents.json
  30. BIN
      TSLiveWallpaper/Assets.xcassets/AIList/home/alistHome_0_HelenaFourment.imageset/alistHome_0_HelenaFourment@3x.png
  31. 21 0
      TSLiveWallpaper/Assets.xcassets/AIList/home/alistHome_0_MonaLisa.imageset/Contents.json
  32. BIN
      TSLiveWallpaper/Assets.xcassets/AIList/home/alistHome_0_MonaLisa.imageset/alistHome_0_MonaLisa@3x.png
  33. 21 0
      TSLiveWallpaper/Assets.xcassets/AIList/home/alistHome_0_PortraitAdeleBlochBauerI.imageset/Contents.json
  34. BIN
      TSLiveWallpaper/Assets.xcassets/AIList/home/alistHome_0_PortraitAdeleBlochBauerI.imageset/alistHome_0_PortraitAdeleBlochBauerI@3x.png
  35. 21 0
      TSLiveWallpaper/Assets.xcassets/AIList/home/alistHome_0_PortraitUnknownWoman.imageset/Contents.json
  36. BIN
      TSLiveWallpaper/Assets.xcassets/AIList/home/alistHome_0_PortraitUnknownWoman.imageset/alistHome_0_PortraitUnknownWoman@3x.png
  37. 21 0
      TSLiveWallpaper/Assets.xcassets/AIList/home/alistHome_0_RedBoy.imageset/Contents.json
  38. BIN
      TSLiveWallpaper/Assets.xcassets/AIList/home/alistHome_0_RedBoy.imageset/alistHome_0_RedBoy@3x.png
  39. 21 0
      TSLiveWallpaper/Assets.xcassets/AIList/home/alistHome_0_SelfPortrait.imageset/Contents.json
  40. BIN
      TSLiveWallpaper/Assets.xcassets/AIList/home/alistHome_0_SelfPortrait.imageset/alistHome_0_SelfPortrait@3x.png
  41. 21 0
      TSLiveWallpaper/Assets.xcassets/AIList/home/alistHome_0_SelfPortraitBandagedEar.imageset/Contents.json
  42. BIN
      TSLiveWallpaper/Assets.xcassets/AIList/home/alistHome_0_SelfPortraitBandagedEar.imageset/alistHome_0_SelfPortraitBandagedEar@3x.png
  43. 21 0
      TSLiveWallpaper/Assets.xcassets/AIList/home/alistHome_0_SelfPortraitStrawHat.imageset/Contents.json
  44. BIN
      TSLiveWallpaper/Assets.xcassets/AIList/home/alistHome_0_SelfPortraitStrawHat.imageset/alistHome_0_SelfPortraitStrawHat@3x.png
  45. 21 0
      TSLiveWallpaper/Assets.xcassets/AIList/home/alistHome_0_TheArnolfiniPortrait.imageset/Contents.json
  46. BIN
      TSLiveWallpaper/Assets.xcassets/AIList/home/alistHome_0_TheArnolfiniPortrait.imageset/alistHome_0_TheArnolfiniPortrait@3x.png
  47. 21 0
      TSLiveWallpaper/Assets.xcassets/AIList/home/alistHome_0_TheMilkmaid.imageset/Contents.json
  48. BIN
      TSLiveWallpaper/Assets.xcassets/AIList/home/alistHome_0_TheMilkmaid.imageset/alistHome_0_TheMilkmaid@3x.png
  49. 21 0
      TSLiveWallpaper/Assets.xcassets/AIList/home/alistHome_0_WomanVeil.imageset/Contents.json
  50. BIN
      TSLiveWallpaper/Assets.xcassets/AIList/home/alistHome_0_WomanVeil.imageset/alistHome_0_WomanVeil@3x.png
  51. 21 0
      TSLiveWallpaper/Assets.xcassets/AIList/home/alistHome_1_GirlPearlEarring.imageset/Contents.json
  52. BIN
      TSLiveWallpaper/Assets.xcassets/AIList/home/alistHome_1_GirlPearlEarring.imageset/alistHome_1_GirlPearlEarring@3x.png
  53. 21 0
      TSLiveWallpaper/Assets.xcassets/AIList/home/alistHome_1_HelenaFourment.imageset/Contents.json
  54. BIN
      TSLiveWallpaper/Assets.xcassets/AIList/home/alistHome_1_HelenaFourment.imageset/alistHome_1_HelenaFourment@3x.png
  55. 21 0
      TSLiveWallpaper/Assets.xcassets/AIList/home/alistHome_1_MonaLisa.imageset/Contents.json
  56. BIN
      TSLiveWallpaper/Assets.xcassets/AIList/home/alistHome_1_MonaLisa.imageset/alistHome_1_MonaLisa@3x.png
  57. 21 0
      TSLiveWallpaper/Assets.xcassets/AIList/home/alistHome_1_PortraitAdeleBlochBauerI.imageset/Contents.json
  58. BIN
      TSLiveWallpaper/Assets.xcassets/AIList/home/alistHome_1_PortraitAdeleBlochBauerI.imageset/alistHome_1_PortraitAdeleBlochBauerI@3x.png
  59. 21 0
      TSLiveWallpaper/Assets.xcassets/AIList/home/alistHome_1_PortraitUnknownWoman.imageset/Contents.json
  60. BIN
      TSLiveWallpaper/Assets.xcassets/AIList/home/alistHome_1_PortraitUnknownWoman.imageset/alistHome_1_PortraitUnknownWoman@3x.png
  61. 21 0
      TSLiveWallpaper/Assets.xcassets/AIList/home/alistHome_1_RedBoy.imageset/Contents.json
  62. BIN
      TSLiveWallpaper/Assets.xcassets/AIList/home/alistHome_1_RedBoy.imageset/alistHome_1_RedBoy@3x.png
  63. 21 0
      TSLiveWallpaper/Assets.xcassets/AIList/home/alistHome_1_SelfPortrait.imageset/Contents.json
  64. BIN
      TSLiveWallpaper/Assets.xcassets/AIList/home/alistHome_1_SelfPortrait.imageset/alistHome_1_SelfPortrait@3x.png
  65. 21 0
      TSLiveWallpaper/Assets.xcassets/AIList/home/alistHome_1_SelfPortraitBandagedEar.imageset/Contents.json
  66. BIN
      TSLiveWallpaper/Assets.xcassets/AIList/home/alistHome_1_SelfPortraitBandagedEar.imageset/alistHome_1_SelfPortraitBandagedEar@3x.png
  67. 21 0
      TSLiveWallpaper/Assets.xcassets/AIList/home/alistHome_1_SelfPortraitStrawHat.imageset/Contents.json
  68. BIN
      TSLiveWallpaper/Assets.xcassets/AIList/home/alistHome_1_SelfPortraitStrawHat.imageset/alistHome_1_SelfPortraitStrawHat@3x.png
  69. 21 0
      TSLiveWallpaper/Assets.xcassets/AIList/home/alistHome_1_TheArnolfiniPortrait.imageset/Contents.json
  70. BIN
      TSLiveWallpaper/Assets.xcassets/AIList/home/alistHome_1_TheArnolfiniPortrait.imageset/alistHome_1_TheArnolfiniPortrait@3x.png
  71. 21 0
      TSLiveWallpaper/Assets.xcassets/AIList/home/alistHome_1_TheMilkmaid.imageset/Contents.json
  72. BIN
      TSLiveWallpaper/Assets.xcassets/AIList/home/alistHome_1_TheMilkmaid.imageset/alistHome_1_TheMilkmaid@3x.png
  73. 21 0
      TSLiveWallpaper/Assets.xcassets/AIList/home/alistHome_1_WomanVeil.imageset/Contents.json
  74. BIN
      TSLiveWallpaper/Assets.xcassets/AIList/home/alistHome_1_WomanVeil.imageset/alistHome_1_WomanVeil@3x.png
  75. 4 0
      TSLiveWallpaper/Business/BusinessView/TSAppBtnView.swift
  76. 1 0
      TSLiveWallpaper/Business/TSAIListVC/TSAIList+Enmu.swift
  77. 5 1
      TSLiveWallpaper/Business/TSAIListVC/TSAIListVC/TSAIListStyleMoreVC/TSAIListStyleMoreVC.swift
  78. 11 7
      TSLiveWallpaper/Business/TSAIListVC/TSAIListVC/TSAIListVC.swift
  79. 32 8
      TSLiveWallpaper/Business/TSAIListVC/TSAIListVC/VM/TSAIListDataModel.swift
  80. 238 0
      TSLiveWallpaper/Business/TSAIListVC/TSAIListVC/VM/TSAIListDataVM+Dic.swift
  81. 112 11
      TSLiveWallpaper/Business/TSAIListVC/TSAIListVC/VM/TSAIListDataVM.swift
  82. 39 0
      TSLiveWallpaper/Business/TSAIListVC/TSAIUploadPhotoVC/TSAIUploadPhotoVC+ImageTextView.swift
  83. 1 0
      TSLiveWallpaper/Business/TSAIListVC/TSAIUploadPhotoVC/TSAIUploadPhotoVC+Video.swift
  84. 2 2
      TSLiveWallpaper/Business/TSAIListVC/TSAIUploadPhotoVC/TSAIUploadPhotoVC+VideoStyle.swift
  85. 0 74
      TSLiveWallpaper/Business/TSAIListVC/TSAIUploadPhotoVC/TSAIUploadPhotoVC+View.swift
  86. 53 14
      TSLiveWallpaper/Business/TSAIListVC/TSAIUploadPhotoVC/TSAIUploadPhotoVC.swift
  87. 12 0
      TSLiveWallpaper/Business/TSAIListVC/TSAIUploadPhotoVC/View/TSAIUploadPhotoTextView.swift
  88. 99 35
      TSLiveWallpaper/Business/TSAIListVC/TSAIUploadPhotoVC/View/TSAIUploadPhotoVideoStyleView.swift
  89. 50 0
      TSLiveWallpaper/Business/TSPurchaseMembershipVC/TSPurchaseRroPageView/TSPurchaseRroPageVM.swift
  90. 109 0
      TSLiveWallpaper/Business/TSPurchaseMembershipVC/TSPurchaseRroPageView/TSPurchaseRroPageView.swift
  91. 3 3
      TSLiveWallpaper/Common/Purchase/TSPurchaseManager.swift
  92. BIN
      TSLiveWallpaper/Resource/Gif/Magic Text.gif
  93. 0 0
      TSLiveWallpaper/Resource/Gif/generat_loading.gif
  94. 0 0
      TSLiveWallpaper/Resource/video/New Smile.mp4
  95. 0 0
      TSLiveWallpaper/Resource/video/aiList SendRose Banner.mp4
  96. BIN
      TSLiveWallpaper/Resource/video/change age.mp4
  97. BIN
      TSLiveWallpaper/Resource/video/magic text.mp4

+ 47 - 7
TSLiveWallpaper.xcodeproj/project.pbxproj

@@ -174,6 +174,12 @@
 		A8F9F2FA2E375FE7007FE237 /* TSAIPhotoDetailsVC+Expand.swift in Sources */ = {isa = PBXBuildFile; fileRef = A8F9F2F92E375FD7007FE237 /* TSAIPhotoDetailsVC+Expand.swift */; };
 		A8F9F30F2E379AA8007FE237 /* TSPurchaseBusiness+Limit.swift in Sources */ = {isa = PBXBuildFile; fileRef = A8F9F30E2E379AA3007FE237 /* TSPurchaseBusiness+Limit.swift */; };
 		A8F9F3112E379B2D007FE237 /* KeychainManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = A8F9F3102E379B2D007FE237 /* KeychainManager.swift */; };
+		A8FCAF762E556F6B00682F4C /* Magic Text.gif in Resources */ = {isa = PBXBuildFile; fileRef = A8FCAF752E556F6B00682F4C /* Magic Text.gif */; };
+		A8FCAF7A2E5570A700682F4C /* change age.mp4 in Resources */ = {isa = PBXBuildFile; fileRef = A8FCAF782E5570A700682F4C /* change age.mp4 */; };
+		A8FCAF7B2E5570A700682F4C /* magic text.mp4 in Resources */ = {isa = PBXBuildFile; fileRef = A8FCAF792E5570A700682F4C /* magic text.mp4 */; };
+		A8FCAF7D2E55A37700682F4C /* TSAIUploadPhotoVC+ImageTextView.swift in Sources */ = {isa = PBXBuildFile; fileRef = A8FCAF7C2E55A36900682F4C /* TSAIUploadPhotoVC+ImageTextView.swift */; };
+		A8FCAF802E55CA4B00682F4C /* TSPurchaseRroPageView.swift in Sources */ = {isa = PBXBuildFile; fileRef = A8FCAF7F2E55CA4A00682F4C /* TSPurchaseRroPageView.swift */; };
+		A8FCAF822E55CB6E00682F4C /* TSPurchaseRroPageVM.swift in Sources */ = {isa = PBXBuildFile; fileRef = A8FCAF812E55CB6600682F4C /* TSPurchaseRroPageVM.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 */; };
@@ -385,6 +391,12 @@
 		A8F9F2F92E375FD7007FE237 /* TSAIPhotoDetailsVC+Expand.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "TSAIPhotoDetailsVC+Expand.swift"; sourceTree = "<group>"; };
 		A8F9F30E2E379AA3007FE237 /* TSPurchaseBusiness+Limit.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "TSPurchaseBusiness+Limit.swift"; sourceTree = "<group>"; };
 		A8F9F3102E379B2D007FE237 /* KeychainManager.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = KeychainManager.swift; sourceTree = "<group>"; };
+		A8FCAF752E556F6B00682F4C /* Magic Text.gif */ = {isa = PBXFileReference; lastKnownFileType = image.gif; path = "Magic Text.gif"; sourceTree = "<group>"; };
+		A8FCAF782E5570A700682F4C /* change age.mp4 */ = {isa = PBXFileReference; lastKnownFileType = file; path = "change age.mp4"; sourceTree = "<group>"; };
+		A8FCAF792E5570A700682F4C /* magic text.mp4 */ = {isa = PBXFileReference; lastKnownFileType = file; path = "magic text.mp4"; sourceTree = "<group>"; };
+		A8FCAF7C2E55A36900682F4C /* TSAIUploadPhotoVC+ImageTextView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "TSAIUploadPhotoVC+ImageTextView.swift"; sourceTree = "<group>"; };
+		A8FCAF7F2E55CA4A00682F4C /* TSPurchaseRroPageView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TSPurchaseRroPageView.swift; sourceTree = "<group>"; };
+		A8FCAF812E55CB6600682F4C /* TSPurchaseRroPageVM.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TSPurchaseRroPageVM.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>"; };
@@ -547,8 +559,8 @@
 		A81CA4B12D1695F300A3AAC8 /* Resource */ = {
 			isa = PBXGroup;
 			children = (
+				A8FCAF772E55708800682F4C /* video */,
 				A83F28962E16503C009A4975 /* Gif */,
-				A86857D62DF983620089D222 /* generat_loading.gif */,
 				606372D62D545E55005C82CF /* Example */,
 				A81F5B502D19684D00740085 /* Json */,
 				A81CA4B22D1695F800A3AAC8 /* Font */,
@@ -635,8 +647,7 @@
 		A83F28962E16503C009A4975 /* Gif */ = {
 			isa = PBXGroup;
 			children = (
-				A8A2F0D72E3B47AE00E7B86B /* aiList SendRose Banner.mp4 */,
-				A8A2F0D82E3B47AE00E7B86B /* New Smile.mp4 */,
+				A8FCAF752E556F6B00682F4C /* Magic Text.gif */,
 				A8EB1A3F2E307572001F58D7 /* aiList_Angry.gif */,
 				A8EB1A402E307572001F58D7 /* aiList_Applaud.gif */,
 				A8EB1A412E307572001F58D7 /* aiList_Cheers.gif */,
@@ -659,6 +670,7 @@
 				A83F289C2E165043009A4975 /* aiList_SayHi.gif */,
 				A83F289D2E165043009A4975 /* aiList_Smile.gif */,
 				A83F289E2E165043009A4975 /* aiList_Stroll.gif */,
+				A86857D62DF983620089D222 /* generat_loading.gif */,
 			);
 			path = Gif;
 			sourceTree = "<group>";
@@ -834,6 +846,7 @@
 				A8F8BCD22E03FD4A00EF4AA6 /* TSAIUploadPhotoVC+Video.swift */,
 				A83F28A82E165B17009A4975 /* TSAIUploadPhotoVC+Style.swift */,
 				A8A2F0D12E3B167800E7B86B /* TSAIUploadPhotoVC+VideoStyle.swift */,
+				A8FCAF7C2E55A36900682F4C /* TSAIUploadPhotoVC+ImageTextView.swift */,
 			);
 			path = TSAIUploadPhotoVC;
 			sourceTree = "<group>";
@@ -1031,6 +1044,7 @@
 		A8F76C3A2D35022300AA6E93 /* TSPurchaseMembershipVC */ = {
 			isa = PBXGroup;
 			children = (
+				A8FCAF7E2E55CA2D00682F4C /* TSPurchaseRroPageView */,
 				A8F76C4C2D3747AB00AA6E93 /* TSPurchaseVC.swift */,
 				A81CA4A22D16747900A3AAC8 /* TSViewTool */,
 			);
@@ -1114,6 +1128,26 @@
 			path = View;
 			sourceTree = "<group>";
 		};
+		A8FCAF772E55708800682F4C /* video */ = {
+			isa = PBXGroup;
+			children = (
+				A8FCAF782E5570A700682F4C /* change age.mp4 */,
+				A8FCAF792E5570A700682F4C /* magic text.mp4 */,
+				A8A2F0D72E3B47AE00E7B86B /* aiList SendRose Banner.mp4 */,
+				A8A2F0D82E3B47AE00E7B86B /* New Smile.mp4 */,
+			);
+			path = video;
+			sourceTree = "<group>";
+		};
+		A8FCAF7E2E55CA2D00682F4C /* TSPurchaseRroPageView */ = {
+			isa = PBXGroup;
+			children = (
+				A8FCAF7F2E55CA4A00682F4C /* TSPurchaseRroPageView.swift */,
+				A8FCAF812E55CB6600682F4C /* TSPurchaseRroPageVM.swift */,
+			);
+			path = TSPurchaseRroPageView;
+			sourceTree = "<group>";
+		};
 		A8FD8F362DFBD650008CAACF /* View */ = {
 			isa = PBXGroup;
 			children = (
@@ -1248,7 +1282,10 @@
 				A83F28A52E165043009A4975 /* aiList_Stroll.gif in Resources */,
 				A83F28A62E165043009A4975 /* aiList_ForeheadKiss.gif in Resources */,
 				A8E56BF92D1520EC003C54AF /* Assets.xcassets in Resources */,
+				A8FCAF7A2E5570A700682F4C /* change age.mp4 in Resources */,
+				A8FCAF7B2E5570A700682F4C /* magic text.mp4 in Resources */,
 				A81F5B522D19685900740085 /* response.json in Resources */,
+				A8FCAF762E556F6B00682F4C /* Magic Text.gif in Resources */,
 				A8E56BFB2D1520EC003C54AF /* LaunchScreen.storyboard in Resources */,
 				A8EE92D62E0005F70077DFFD /* Pacifico-Regular.ttf in Resources */,
 			);
@@ -1342,6 +1379,7 @@
 				A8F9F30F2E379AA8007FE237 /* TSPurchaseBusiness+Limit.swift in Sources */,
 				A8E56BF62D1520EC003C54AF /* AppDelegate.swift in Sources */,
 				A8F778B42D1BB8F600BF55D5 /* PhotoManager.swift in Sources */,
+				A8FCAF7D2E55A37700682F4C /* TSAIUploadPhotoVC+ImageTextView.swift in Sources */,
 				A83A6A862E1FC99E0084197A /* LanguageManager.swift in Sources */,
 				A8F3D6552E2F2F5400DE6C9D /* ImageCompositor.swift in Sources */,
 				A8F3D64D2E2E399600DE6C9D /* TSAIPhotoRemoveVC.swift in Sources */,
@@ -1351,6 +1389,7 @@
 				A83F28B02E168237009A4975 /* UIView+Ex.swift in Sources */,
 				A8F8BCDA2E040D8100EF4AA6 /* TSDownloadManager.swift in Sources */,
 				A86857B02DF921970089D222 /* TSAppBtnView.swift in Sources */,
+				A8FCAF802E55CA4B00682F4C /* TSPurchaseRroPageView.swift in Sources */,
 				A8843B272E40D36900C9B01D /* TSUserdPhotoDiskTool.swift in Sources */,
 				A81CA4B82D16A6BD00A3AAC8 /* View+Ex.swift in Sources */,
 				A8F76C422D350A9600AA6E93 /* TSPurchaseManager.swift in Sources */,
@@ -1434,6 +1473,7 @@
 				A8A2F0D62E3B44C800E7B86B /* TSVideoPlayer.swift in Sources */,
 				A8F8BCDE2E0420EE00EF4AA6 /* TSAIPhotoDetailsVC+Image.swift in Sources */,
 				A8EE84462E33931100CA04F0 /* KFImageView.swift in Sources */,
+				A8FCAF822E55CB6E00682F4C /* TSPurchaseRroPageVM.swift in Sources */,
 				A86857AC2DF921160089D222 /* TSAIListHintBaseVC.swift in Sources */,
 				A8F8BCDC2E040D9E00EF4AA6 /* TSBusinessFileManager.swift in Sources */,
 				A8F3D6532E2E540C00DE6C9D /* TSColorPickerVC.swift in Sources */,
@@ -1509,7 +1549,7 @@
 				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;
@@ -1527,7 +1567,7 @@
 					"$(inherited)",
 					"@executable_path/Frameworks",
 				);
-				MARKETING_VERSION = 3.6.16;
+				MARKETING_VERSION = 3.6.17;
 				PRODUCT_BUNDLE_IDENTIFIER = musicplayer.offline.com;
 				PRODUCT_NAME = "$(TARGET_NAME)";
 				PROVISIONING_PROFILE_SPECIFIER = "";
@@ -1550,7 +1590,7 @@
 				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;
@@ -1568,7 +1608,7 @@
 					"$(inherited)",
 					"@executable_path/Frameworks",
 				);
-				MARKETING_VERSION = 3.6.16;
+				MARKETING_VERSION = 3.6.17;
 				PRODUCT_BUNDLE_IDENTIFIER = musicplayer.offline.com;
 				PRODUCT_NAME = "$(TARGET_NAME)";
 				PROVISIONING_PROFILE_SPECIFIER = "";

+ 6 - 0
TSLiveWallpaper/Assets.xcassets/AIList/home/age/Contents.json

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

+ 22 - 0
TSLiveWallpaper/Assets.xcassets/AIList/home/age/alistHome_age_Adult.imageset/Contents.json

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

BIN
TSLiveWallpaper/Assets.xcassets/AIList/home/age/alistHome_age_Adult.imageset/alistHome_age_Adult@2x.png


BIN
TSLiveWallpaper/Assets.xcassets/AIList/home/age/alistHome_age_Adult.imageset/alistHome_age_Adult@3x.png


+ 22 - 0
TSLiveWallpaper/Assets.xcassets/AIList/home/age/alistHome_age_Baby.imageset/Contents.json

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

BIN
TSLiveWallpaper/Assets.xcassets/AIList/home/age/alistHome_age_Baby.imageset/alistHome_age_Baby@2x.png


BIN
TSLiveWallpaper/Assets.xcassets/AIList/home/age/alistHome_age_Baby.imageset/alistHome_age_Baby@3x.png


+ 22 - 0
TSLiveWallpaper/Assets.xcassets/AIList/home/age/alistHome_age_Child.imageset/Contents.json

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

BIN
TSLiveWallpaper/Assets.xcassets/AIList/home/age/alistHome_age_Child.imageset/alistHome_age_Child@2x.png


BIN
TSLiveWallpaper/Assets.xcassets/AIList/home/age/alistHome_age_Child.imageset/alistHome_age_Child@3x.png


+ 22 - 0
TSLiveWallpaper/Assets.xcassets/AIList/home/age/alistHome_age_Customize.imageset/Contents.json

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

BIN
TSLiveWallpaper/Assets.xcassets/AIList/home/age/alistHome_age_Customize.imageset/alistHome_age_Customize@2x.png


BIN
TSLiveWallpaper/Assets.xcassets/AIList/home/age/alistHome_age_Customize.imageset/alistHome_age_Customize@3x.png


+ 22 - 0
TSLiveWallpaper/Assets.xcassets/AIList/home/age/alistHome_age_MiddleAge.imageset/Contents.json

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

BIN
TSLiveWallpaper/Assets.xcassets/AIList/home/age/alistHome_age_MiddleAge.imageset/alistHome_age_MiddleAge@2x.png


BIN
TSLiveWallpaper/Assets.xcassets/AIList/home/age/alistHome_age_MiddleAge.imageset/alistHome_age_MiddleAge@3x.png


+ 22 - 0
TSLiveWallpaper/Assets.xcassets/AIList/home/age/alistHome_age_Senior.imageset/Contents.json

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

BIN
TSLiveWallpaper/Assets.xcassets/AIList/home/age/alistHome_age_Senior.imageset/alistHome_age_Senior@2x.png


BIN
TSLiveWallpaper/Assets.xcassets/AIList/home/age/alistHome_age_Senior.imageset/alistHome_age_Senior@3x.png


+ 22 - 0
TSLiveWallpaper/Assets.xcassets/AIList/home/age/alistHome_age_Teen.imageset/Contents.json

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

BIN
TSLiveWallpaper/Assets.xcassets/AIList/home/age/alistHome_age_Teen.imageset/alistHome_age_Teen@2x.png


BIN
TSLiveWallpaper/Assets.xcassets/AIList/home/age/alistHome_age_Teen.imageset/alistHome_age_Teen@3x.png


+ 22 - 0
TSLiveWallpaper/Assets.xcassets/AIList/home/age/alistHome_age_Youth.imageset/Contents.json

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

BIN
TSLiveWallpaper/Assets.xcassets/AIList/home/age/alistHome_age_Youth.imageset/alistHome_age_Youth@2x.png


BIN
TSLiveWallpaper/Assets.xcassets/AIList/home/age/alistHome_age_Youth.imageset/alistHome_age_Youth@3x.png


+ 21 - 0
TSLiveWallpaper/Assets.xcassets/AIList/home/alistHome_0_GirlPearlEarring.imageset/Contents.json

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

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


+ 21 - 0
TSLiveWallpaper/Assets.xcassets/AIList/home/alistHome_0_HelenaFourment.imageset/Contents.json

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

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


+ 21 - 0
TSLiveWallpaper/Assets.xcassets/AIList/home/alistHome_0_MonaLisa.imageset/Contents.json

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

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


+ 21 - 0
TSLiveWallpaper/Assets.xcassets/AIList/home/alistHome_0_PortraitAdeleBlochBauerI.imageset/Contents.json

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

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


+ 21 - 0
TSLiveWallpaper/Assets.xcassets/AIList/home/alistHome_0_PortraitUnknownWoman.imageset/Contents.json

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

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


+ 21 - 0
TSLiveWallpaper/Assets.xcassets/AIList/home/alistHome_0_RedBoy.imageset/Contents.json

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

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


+ 21 - 0
TSLiveWallpaper/Assets.xcassets/AIList/home/alistHome_0_SelfPortrait.imageset/Contents.json

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

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


+ 21 - 0
TSLiveWallpaper/Assets.xcassets/AIList/home/alistHome_0_SelfPortraitBandagedEar.imageset/Contents.json

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

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


+ 21 - 0
TSLiveWallpaper/Assets.xcassets/AIList/home/alistHome_0_SelfPortraitStrawHat.imageset/Contents.json

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

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


+ 21 - 0
TSLiveWallpaper/Assets.xcassets/AIList/home/alistHome_0_TheArnolfiniPortrait.imageset/Contents.json

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

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


+ 21 - 0
TSLiveWallpaper/Assets.xcassets/AIList/home/alistHome_0_TheMilkmaid.imageset/Contents.json

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

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


+ 21 - 0
TSLiveWallpaper/Assets.xcassets/AIList/home/alistHome_0_WomanVeil.imageset/Contents.json

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

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


+ 21 - 0
TSLiveWallpaper/Assets.xcassets/AIList/home/alistHome_1_GirlPearlEarring.imageset/Contents.json

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

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


+ 21 - 0
TSLiveWallpaper/Assets.xcassets/AIList/home/alistHome_1_HelenaFourment.imageset/Contents.json

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

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


+ 21 - 0
TSLiveWallpaper/Assets.xcassets/AIList/home/alistHome_1_MonaLisa.imageset/Contents.json

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

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


+ 21 - 0
TSLiveWallpaper/Assets.xcassets/AIList/home/alistHome_1_PortraitAdeleBlochBauerI.imageset/Contents.json

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

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


+ 21 - 0
TSLiveWallpaper/Assets.xcassets/AIList/home/alistHome_1_PortraitUnknownWoman.imageset/Contents.json

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

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


+ 21 - 0
TSLiveWallpaper/Assets.xcassets/AIList/home/alistHome_1_RedBoy.imageset/Contents.json

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

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


+ 21 - 0
TSLiveWallpaper/Assets.xcassets/AIList/home/alistHome_1_SelfPortrait.imageset/Contents.json

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

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


+ 21 - 0
TSLiveWallpaper/Assets.xcassets/AIList/home/alistHome_1_SelfPortraitBandagedEar.imageset/Contents.json

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

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


+ 21 - 0
TSLiveWallpaper/Assets.xcassets/AIList/home/alistHome_1_SelfPortraitStrawHat.imageset/Contents.json

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

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


+ 21 - 0
TSLiveWallpaper/Assets.xcassets/AIList/home/alistHome_1_TheArnolfiniPortrait.imageset/Contents.json

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

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


+ 21 - 0
TSLiveWallpaper/Assets.xcassets/AIList/home/alistHome_1_TheMilkmaid.imageset/Contents.json

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

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


+ 21 - 0
TSLiveWallpaper/Assets.xcassets/AIList/home/alistHome_1_WomanVeil.imageset/Contents.json

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

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


+ 4 - 0
TSLiveWallpaper/Business/BusinessView/TSAppBtnView.swift

@@ -206,6 +206,10 @@ func kCreateNormalSubmitBtn(
     return btn
 }
 
+func kSetUpSubmitBtn(btn:UIButton,enabled:Bool){
+    btn.isEnabled = enabled
+    btn.alpha = enabled ? 1.0 : 0.4
+}
 
 let kSubmitBtnbg = UIImage(named: "submit_btn_bg")
 let kSubmitBtnSmallBg = UIImage(named: "submit_btn_small_bg")

+ 1 - 0
TSLiveWallpaper/Business/TSAIListVC/TSAIList+Enmu.swift

@@ -20,6 +20,7 @@ enum TSGeneratorImageStyle:String {
     case removeBg = "removeBg"      //删除图片的背景
     case removeWatermark = "RemoveWatermark"      //移除水印
     case photoExpand = "ExpandPhoto"      // AI扩图
+    case magicText = "MagicText"      // 神奇文字,也就是自定义提示词图生图
     
     var imageMaxKb:Int{
         switch self {

+ 5 - 1
TSLiveWallpaper/Business/TSAIListVC/TSAIListVC/TSAIListStyleMoreVC/TSAIListStyleMoreVC.swift

@@ -152,7 +152,11 @@ class TSAILIstStyleMoreImageCell: TSAILIstStyleMoreBaseCell {
     override var model:TSDiscoverItemModel? {
         didSet {
             guard let model = model else { return }
-            imageView.image = UIImage(named: model.viewModel.imageNamed)
+            if model.viewModel.imageNamed.isEmpty,let imageName = model.generateModel?.imageName  {
+                imageView.image = UIImage(named: imageName)
+            }else{
+                imageView.image = UIImage(named: model.viewModel.imageNamed)
+            }
             textLabel.text = model.name
         }
     }

+ 11 - 7
TSLiveWallpaper/Business/TSAIListVC/TSAIListVC/TSAIListVC.swift

@@ -126,7 +126,12 @@ extension TSAIListVC: UICollectionViewDataSource ,UICollectionViewDelegate,UICol
             cell.clickBlock = { [weak self] model  in
                 guard let self = self else { return }
                 if let secModel = viewModel.listDatas.safeObj(At:indexPath.section) {
-                    Self.clickCell(target: self,indexPath: indexPath, itemModel:model,secModel: secModel)
+                    //遇到点击banner的age,直接跳转到 see all 页面
+                    if secModel.style == .banner, model.viewModel.title == "Age Transformation"{
+                        clickHeader(indexPath:IndexPath(item: 0, section: 0),sectionModel:viewModel.ageSection)
+                    }else{
+                        Self.clickCell(target: self,indexPath: indexPath, itemModel:model,secModel: secModel)
+                    }
                 }
             }
             return cell
@@ -230,7 +235,7 @@ extension TSAIListVC {
         }
         
         //全新的特殊 push 分类,以后会将下面的,都改成这种的
-        if secModel.title == "Photo Filter",
+        if secModel.uiStyle == .effectPreview,
            let itemModels = secModel.items.first as? [TSDiscoverItemModel]
         {
             let startIndex = itemModels.firstIndex(where: {$0.name == itemModel.name}) ?? 0
@@ -258,19 +263,18 @@ extension TSAIListVC {
                 }
             }else{
                 var disCoverItemModels:[TSDiscoverItemModel] = []
-                
                 //心累了,场景太复杂了,直接 暴力判断吧,反正这种场景很少见
-                if itemModel.generateModel?.imageText == "Send Rose" {
+                if itemModel.viewModel.uiStyle == .sendRose {
                     disCoverItemModels = TSAIListDataVM.shared.loveScenesItems
-                }else if itemModel.generateModel?.imageText == "Smile" {
+                }else if itemModel.viewModel.uiStyle == .smile {
                     disCoverItemModels = TSAIListDataVM.shared.emotionItems
                 }else if let items = secModel.items as? [TSDiscoverItemModel] {
                     disCoverItemModels = items
                 }else if let items = secModel.items as? [[TSDiscoverItemModel]],let itemss = items.safeObj(At: indexPath.item){
                     disCoverItemModels = itemss
                 }
-     
-                target.push(TSAIUploadPhotoVC(titleString: itemModel.name,upLoadImage: images.first!, generatorStyle: itemModel.style,disCoverItemModel: itemModel,disCoverItemModels:disCoverItemModels),animated: false) {
+
+                target.push(TSAIUploadPhotoVC(titleString: itemModel.name,upLoadImage: images.first!, generatorStyle: itemModel.style,disCoverItemModel: itemModel,disCoverItemModels:disCoverItemModels,isShowMoreStyle: secModel.uploadImageShowMore),animated: false) {
                     closeSelectPhotos()
                 }
             }

+ 32 - 8
TSLiveWallpaper/Business/TSAIListVC/TSAIListVC/VM/TSAIListDataModel.swift

@@ -6,7 +6,17 @@
 //
 
 
-//MARK: 枚举
+//MARK: 枚举 UI 层 特殊 UI 展示类型
+enum TSDiscoverItemUIStyle:CaseIterable {
+    case none
+    case changeAge
+    case changeAgeCustom
+    case smile      //banner 上的笑容
+    case sendRose   //banner 上的送花
+    case effectPreview //展示全屏效果预览
+}
+
+//MARK: 枚举 UI 层 动画类型
 enum TSDiscoverItemAnimationStyle:CaseIterable {
     case none
     case comparison
@@ -58,23 +68,26 @@ class TSDiscoverBaseItemVM {
     var title:String = ""
     var imageNamed:String = ""
     var info:String = ""
-
-    init(title: String = "", imageNamed: String = "", info: String = "") {
+    var uiStyle:TSDiscoverItemUIStyle = .none
+    init(title: String = "", imageNamed: String = "", info: String = "",uiStyle:TSDiscoverItemUIStyle = .none) {
         self.title = title
         self.imageNamed = imageNamed
         self.info = info
+        self.uiStyle = uiStyle
     }
 }
 
 class TSDiscoverAnimationItemVM:TSDiscoverBaseItemVM{
     var style:TSDiscoverItemAnimationStyle = .none
     var imageNameds:[String] = []
-    var index:Int = 0 
-    init(title: String = "", info: String = "",style: TSDiscoverItemAnimationStyle = .comparison, imageNameds: [String] = []) {
+    var index:Int = 0
+    init(title: String = "", info: String = "",style: TSDiscoverItemAnimationStyle = .comparison, imageNameds: [String] = [],uiStyle:TSDiscoverItemUIStyle = .none) {
         self.style = style
         self.imageNameds = imageNameds
-        super.init(title: title, imageNamed: "")
+        super.init(title: title, imageNamed: "",uiStyle: uiStyle)
     }
+    
+
 }
 //MARK: 分区
 
@@ -86,11 +99,13 @@ class TSDiscoverSectionModel {
     var style:TSDiscoverViewStyle = .styleMore
     var items:[Any] = []
     var sectionEdge:UIEdgeInsets = UIEdgeInsets(top: 10, left: kDiscoverSection.left, bottom: 0, right: kDiscoverSection.right)
-
-    func setTitle(imageNamed:String = "",title:String,style:TSDiscoverViewStyle = .styleMore) {
+    var uploadImageShowMore:Bool = false //在上传图片页面是否展示更多的 style
+    var uiStyle:TSDiscoverItemUIStyle = .none
+    func setTitle(imageNamed:String = "",title:String,style:TSDiscoverViewStyle = .styleMore,uiStyle:TSDiscoverItemUIStyle = .none) {
         self.imageNamed = imageNamed
         self.title = title
         self.style = style
+        self.uiStyle = uiStyle
     }
 }
 
@@ -120,6 +135,15 @@ class TSDiscoverItemModel {
         if !viewModel.imageNamed.isEmpty {
             return viewModel.imageNamed
         }
+        
+        
+        if let animationVM = viewModel as? TSDiscoverAnimationItemVM,
+           let named = animationVM.imageNameds.first,
+           !named.isEmpty
+        {
+            return named
+        }
+        
         return ""
     }
     

+ 238 - 0
TSLiveWallpaper/Business/TSAIListVC/TSAIListVC/VM/TSAIListDataVM+Dic.swift

@@ -21,6 +21,8 @@ private let input = "input"
 
 //MARK: 功能性模型
 
+private let ageUnionType:Int = 3
+private let paintingMe:Int = 4
 
 extension TSAIListDataVM {
     
@@ -367,6 +369,242 @@ extension TSAIListDataVM {
 
 //MARK: kie模型
 extension TSAIListDataVM {
+    var ptp_MonaLisa:[String:Any]{
+        [
+            imageName: "alistHome_0_MonaLisa",
+            imageText: "Mona Lisa",
+            prompt:"Replace the face of Mona Lisa with my face, keeping the Renaissance painting style, background, and lighting consistent.",
+            isVip: false,
+            unionType: paintingMe,
+            model:kie
+        ]
+    }
+    
+    var ptp_GirlPearlEarring:[String:Any]{
+        [
+            imageName: "alistHome_0_GirlPearlEarring",
+            imageText: "Girl with a Pearl Earring",
+            prompt:"Replace the girl’s face of Girl with a Pearl Earring (Johannes Vermeer, 1665) with my face while preserving the delicate lighting, headscarf, and pearl earring.",
+            isVip: false,
+            unionType: paintingMe,
+            model:kie
+        ]
+    }
+    
+    var ptp_PortraitUnknownWoman:[String:Any]{
+        [
+            imageName: "alistHome_0_PortraitUnknownWoman",
+            imageText: "Portrait of an Unknown Woman",
+            prompt:"Replace the face of the woman in Ivan Kramskoi’s Unknown Woman with the face of the person in the uploaded photo. Keep the original painting style, background, and clothing unchanged.",
+            isVip: false,
+            unionType: paintingMe,
+            model:kie
+        ]
+    }
+    
+    var ptp_PortraitAdeleBlochBauerI:[String:Any]{
+        [
+            imageName: "alistHome_0_PortraitAdeleBlochBauerI",
+            imageText: "Portrait of Adele Bloch-Bauer I",
+            prompt:"ReplacePortrait of Adele Bloch-Bauer I (The Woman in Gold) (Gustav Klimt, 1907) with my face, keeping the golden Art Nouveau style, decorative patterns, and luxurious details.",
+            isVip: false,
+            unionType: paintingMe,
+            model:kie
+        ]
+    }
+    
+    var ptp_SelfPortraitBandagedEar:[String:Any]{
+        [
+            imageName: "alistHome_0_SelfPortraitBandagedEar",
+            imageText: "Self-Portrait with Bandaged Ear",
+            prompt:"Replace Self-Portrait with Bandaged Ear (Vincent van Gogh, 1889) with my face, keeping the thick brush strokes, post-impressionist style, and bandaged ear.",
+            isVip: false,
+            unionType: paintingMe,
+            model:kie
+        ]
+    }
+    
+    var ptp_SelfPortraitStrawHat:[String:Any]{
+        [
+            imageName: "alistHome_0_SelfPortraitStrawHat",
+            imageText: "Self-Portrait with Straw Hat",
+            prompt:"Replace Self-Portrait with Straw Hat (Vincent van Gogh, 1887) with my face, while preserving the straw hat, impressionist brushwork, and color palette.",
+            isVip: false,
+            unionType: paintingMe,
+            model:kie
+        ]
+    }
+    
+    var ptp_HelenaFourment:[String:Any]{
+        [
+            imageName: "alistHome_0_HelenaFourment",
+            imageText: "Helena Fourment",
+            prompt:"Replace the face of Helena Fourment in Peter Paul Rubens’ portrait with the face of the person in the uploaded photo. Retain the Baroque style, clothing, and background unchanged.",
+            isVip: false,
+            unionType: paintingMe,
+            model:kie
+        ]
+    }
+    
+    var ptp_WomanVeil:[String:Any]{
+        [
+            imageName: "alistHome_0_WomanVeil",
+            imageText: "The woman with the veil",
+            prompt:"Replace the face of the girl in Raphael’s Girl with a Veil with the face of the person in the uploaded photo. Keep the Renaissance painting style, veil, and background exactly the same.",
+            isVip: false,
+            unionType: paintingMe,
+            model:kie
+        ]
+    }
+    
+    var ptp_RedBoy:[String:Any]{
+        [
+            imageName: "alistHome_0_RedBoy",
+            imageText: "The Red Boy",
+            prompt:"Replace the face of The Red Boy by Sir Thomas Lawrence with the face of the person in the uploaded photo. Keep the original red clothing, brushstrokes, and background intact.",
+            isVip: false,
+            unionType: paintingMe,
+            model:kie
+        ]
+    }
+    
+    var ptp_SelfPortrait:[String:Any]{
+        [
+            imageName: "alistHome_0_SelfPortrait",
+            imageText: "Self-Portrait",
+            prompt:"Replace Self-Portrait (Rembrandt, 1660) with my face, keeping the dramatic Baroque lighting and oil painting texture.",
+            isVip: false,
+            unionType: paintingMe,
+            model:kie
+        ]
+    }
+    
+    var ptp_TheMilkmaid:[String:Any]{
+        [
+            imageName: "alistHome_0_TheMilkmaid",
+            imageText: "The Milkmaid",
+            prompt:"Replace the face of the woman in Johannes Vermeer’s The Milkmaid with the face of the person in the uploaded photo. Preserve the painting’s style, lighting, and background exactly.",
+            isVip: false,
+            unionType: paintingMe,
+            model:kie
+        ]
+    }
+    
+    var ptp_TheArnolfiniPortrait:[String:Any]{
+        [
+            imageName: "alistHome_0_TheArnolfiniPortrait",
+            imageText: "The Arnolfini Portrait",
+            prompt:"Replace The Arnolfini Portrait – Female figure (Jan van Eyck, 1434) with my face, while keeping the medieval costume, detailed textures, and mirror reflection.",
+            isVip: false,
+            unionType: paintingMe,
+            model:kie
+        ]
+    }
+
+}
+
+extension TSAIListDataVM {
+    
+    var ptp_ageBaby:[String:Any]{
+        [
+            imageName: "alistHome_age_Baby",
+            imageText: "Baby",
+            prompt:"Transform the person of uploaded photo into 3 years old",
+            isVip: false,
+            unionType: ageUnionType,
+            model:kie
+        ]
+    }
+    
+    var ptp_ageChild:[String:Any]{
+        [
+            imageName: "alistHome_age_Child",
+            imageText: "Child",
+            prompt:"Transform the person of uploaded photo into 8 years old",
+            isVip: false,
+            unionType: ageUnionType,
+            model:kie
+        ]
+    }
+    
+    var ptp_ageTeen:[String:Any]{
+        [
+            imageName: "alistHome_age_Teen",
+            imageText: "Teen",
+            prompt:"Transform the person of uploaded photo into 18 years old",
+            isVip: false,
+            unionType: ageUnionType,
+            model:kie
+        ]
+    }
+    
+    var ptp_ageYouth:[String:Any]{
+        [
+            imageName: "alistHome_age_Youth",
+            imageText: "Youth",
+            prompt:"Transform the person of uploaded photo into 25 years old",
+            isVip: false,
+            unionType: ageUnionType,
+            model:kie
+        ]
+    }
+    
+    var ptp_ageMiddleAge:[String:Any]{
+        [
+            imageName: "alistHome_age_MiddleAge",
+            imageText: "Middle Age",
+            prompt:"Transform the person of uploaded photo into 35 years old",
+            isVip: false,
+            unionType: ageUnionType,
+            model:kie
+        ]
+    }
+    
+    var ptp_ageAdult:[String:Any]{
+        [
+            imageName: "alistHome_age_Adult",
+            imageText: "Adult",
+            prompt:"Transform the person of uploaded photo into 50 years old",
+            isVip: false,
+            unionType: ageUnionType,
+            model:kie
+        ]
+    }
+    
+    var ptp_ageSenior:[String:Any]{
+        [
+            imageName: "alistHome_age_Senior",
+            imageText: "Senior",
+            prompt:"Transform the person of uploaded photo into 80 years old",
+            isVip: false,
+            unionType: ageUnionType,
+            model:kie
+        ]
+    }
+    
+    var ptp_ageCustomize:[String:Any]{
+        [
+            imageName: "alistHome_age_Customize",
+            imageText: "Customize",
+            prompt:"Transform the person of uploaded photo into %@ years old",
+            isVip: false,
+            unionType: ageUnionType,
+            model:kie
+        ]
+    }
+}
+extension TSAIListDataVM {
+    
+    var ptp_MagicText:[String:Any]{
+        [
+            imageName: "",
+            imageText: "Magic Text",
+            prompt:"",
+            isVip: false,
+            unionType: 2,
+            model:flux
+        ]
+    }
     
     var ptp_Anime:[String:Any]{
         [

+ 112 - 11
TSLiveWallpaper/Business/TSAIListVC/TSAIListVC/VM/TSAIListDataVM.swift

@@ -22,16 +22,23 @@ class TSAIListDataVM {
                                 generateModel: TSGenerateModel(json: ptp_Recreate)),
             
 //            TSDiscoverItemModel(style: .creatVideo,
-//                                viewModel: TSDiscoverAnimationItemVM(style: .video,imageNameds: ["aiList SendRose Banner.mp4"]),
+//                                viewModel: TSDiscoverAnimationItemVM(style: .video,imageNameds: ["aiList SendRose Banner.mp4"],uiStyle: .sendRose),
 //                                generateModel: TSGenerateModel(json: video_SendRose)),
+
+            TSDiscoverItemModel(style: .ptp,
+                                viewModel: TSDiscoverAnimationItemVM(title:"Age Transformation",style: .video, imageNameds: ["change age.mp4"])),
             
+            TSDiscoverItemModel(style: .magicText,
+                                viewModel: TSDiscoverAnimationItemVM(style: .video, imageNameds: ["magic text.mp4"]),
+                                generateModel: TSGenerateModel(json: ptp_MagicText)),
+            
+            TSDiscoverItemModel(style: .creatVideo,
+                                viewModel: TSDiscoverAnimationItemVM(style: .video,imageNameds: ["New Smile.mp4"],uiStyle: .smile),
+                                generateModel: TSGenerateModel(json: video_Smile)),
             
             TSDiscoverItemModel(style: .removeWatermark,
                                 viewModel: TSDiscoverAnimationItemVM(style: .comparison, imageNameds: ["alistHome_0_banner_RemoveWatermark","alistHome_1_banner_RemoveWatermark"]),
                                 generateModel: TSGenerateModel(json: ptp_RemoveWatermark)),
-            TSDiscoverItemModel(style: .creatVideo,
-                                viewModel: TSDiscoverAnimationItemVM(style: .video,imageNameds: ["New Smile.mp4"]),
-                                generateModel: TSGenerateModel(json: video_Smile)),
         ]
     }()
     
@@ -49,8 +56,6 @@ class TSAIListDataVM {
             TSDiscoverItemModel(style: .enhance,
                                 viewModel: TSDiscoverAnimationItemVM(title: "",style: .comparison, imageNameds: ["alistHome_0_Enhance","alistHome_1_Enhance"]),
                                 generateModel: TSGenerateModel(json: ptp_Enhance)),
-            
-            
             TSDiscoverItemModel(style: .descratch,
                                 viewModel: TSDiscoverAnimationItemVM(title: "",style: .comparison, imageNameds: ["alistHome_0_Descratch","alistHome_1_Descratch"]),
                                 generateModel: TSGenerateModel(json: ptp_Descratch)),
@@ -108,13 +113,104 @@ class TSAIListDataVM {
     }()
     lazy var photoFilterSection: TSDiscoverSectionModel = {
         let section = TSDiscoverSectionModel()
-        section.setTitle(imageNamed: "🎆",title: "Photo Filter")
+        section.setTitle(imageNamed: "🎆",title: "Photo Filter",uiStyle: .effectPreview)
         section.sectionEdge =  UIEdgeInsets(top: 0, left: kDiscoverSection.left, bottom: 0, right: kDiscoverSection.right)
         section.items = [photoFilterItems]
         return section
     }()
     
+    
+    lazy var mePaintingItems: [TSDiscoverItemModel] = {
+        return [
+            TSDiscoverItemModel(style: .ptp,
+                                viewModel: TSDiscoverAnimationItemVM(title: "",style: .comparison, imageNameds: ["alistHome_0_MonaLisa","alistHome_1_MonaLisa"]),
+                                generateModel: TSGenerateModel(json: ptp_MonaLisa)),
+            TSDiscoverItemModel(style: .ptp,
+                                viewModel: TSDiscoverAnimationItemVM(title: "",style: .comparison, imageNameds: ["alistHome_0_GirlPearlEarring","alistHome_1_GirlPearlEarring"]),
+                                generateModel: TSGenerateModel(json: ptp_GirlPearlEarring)),
+            TSDiscoverItemModel(style: .ptp,
+                                viewModel: TSDiscoverAnimationItemVM(title: "",style: .comparison, imageNameds: ["alistHome_0_PortraitUnknownWoman","alistHome_1_PortraitUnknownWoman"]),
+                                generateModel: TSGenerateModel(json: ptp_PortraitUnknownWoman)),
+            TSDiscoverItemModel(style: .ptp,
+                                viewModel: TSDiscoverAnimationItemVM(title: "",style: .comparison, imageNameds: ["alistHome_0_PortraitAdeleBlochBauerI","alistHome_1_PortraitAdeleBlochBauerI"]),
+                                generateModel: TSGenerateModel(json: ptp_PortraitAdeleBlochBauerI)),
+            TSDiscoverItemModel(style: .ptp,
+                                viewModel: TSDiscoverAnimationItemVM(title: "",style: .comparison, imageNameds: ["alistHome_0_SelfPortraitBandagedEar","alistHome_1_SelfPortraitBandagedEar"]),
+                                generateModel: TSGenerateModel(json: ptp_SelfPortraitBandagedEar)),
+            TSDiscoverItemModel(style: .ptp,
+                                viewModel: TSDiscoverAnimationItemVM(title: "",style: .comparison, imageNameds: ["alistHome_0_SelfPortraitStrawHat","alistHome_1_SelfPortraitStrawHat"]),
+                                generateModel: TSGenerateModel(json: ptp_SelfPortraitStrawHat)),
+            TSDiscoverItemModel(style: .ptp,
+                                viewModel: TSDiscoverAnimationItemVM(title: "",style: .comparison, imageNameds: ["alistHome_0_HelenaFourment","alistHome_1_HelenaFourment"]),
+                                generateModel: TSGenerateModel(json: ptp_HelenaFourment)),
+            TSDiscoverItemModel(style: .ptp,
+                                viewModel: TSDiscoverAnimationItemVM(title: "",style: .comparison, imageNameds: ["alistHome_0_WomanVeil","alistHome_1_WomanVeil"]),
+                                generateModel: TSGenerateModel(json: ptp_WomanVeil)),
+            TSDiscoverItemModel(style: .ptp,
+                                viewModel: TSDiscoverAnimationItemVM(title: "",style: .comparison, imageNameds: ["alistHome_0_RedBoy","alistHome_1_RedBoy"]),
+                                generateModel: TSGenerateModel(json: ptp_RedBoy)),
+            TSDiscoverItemModel(style: .ptp,
+                                viewModel: TSDiscoverAnimationItemVM(title: "",style: .comparison, imageNameds: ["alistHome_0_SelfPortrait","alistHome_1_SelfPortrait"]),
+                                generateModel: TSGenerateModel(json: ptp_SelfPortrait)),
+            TSDiscoverItemModel(style: .ptp,
+                                viewModel: TSDiscoverAnimationItemVM(title: "",style: .comparison, imageNameds: ["alistHome_0_TheMilkmaid","alistHome_1_TheMilkmaid"]),
+                                generateModel: TSGenerateModel(json: ptp_TheMilkmaid)),
+            TSDiscoverItemModel(style: .ptp,
+                                viewModel: TSDiscoverAnimationItemVM(title: "",style: .comparison, imageNameds: ["alistHome_0_TheArnolfiniPortrait","alistHome_1_TheArnolfiniPortrait"]),
+                                generateModel: TSGenerateModel(json: ptp_TheArnolfiniPortrait))
+        ]
+    }()
+    lazy var mePaintingSection: TSDiscoverSectionModel = {
+        let section = TSDiscoverSectionModel()
+        section.setTitle(imageNamed: "👨🏼‍🎨",title: "Me in a Famous Painting",uiStyle: .effectPreview)
+        section.sectionEdge =  UIEdgeInsets(top: 0, left: kDiscoverSection.left, bottom: 0, right: kDiscoverSection.right)
+        section.items = [mePaintingItems]
+        return section
+    }()
+    
+    
+    lazy var ageItems: [TSDiscoverItemModel] = {
+        return [
+            TSDiscoverItemModel(style: .ptp,
+                                viewModel: TSDiscoverBaseItemVM(uiStyle: .changeAge),
+                                generateModel: TSGenerateModel(json: ptp_ageBaby)),
+            TSDiscoverItemModel(style: .ptp,
+                                viewModel: TSDiscoverBaseItemVM(uiStyle: .changeAge),
+                                generateModel: TSGenerateModel(json: ptp_ageChild)),
+            TSDiscoverItemModel(style: .ptp,
+                                viewModel: TSDiscoverBaseItemVM(uiStyle: .changeAge),
+                                generateModel: TSGenerateModel(json: ptp_ageTeen)),
+            TSDiscoverItemModel(style: .ptp,
+                                viewModel: TSDiscoverBaseItemVM(uiStyle: .changeAge),
+                                generateModel: TSGenerateModel(json: ptp_ageYouth)),
+            TSDiscoverItemModel(style: .ptp,
+                                viewModel: TSDiscoverBaseItemVM(uiStyle: .changeAge),
+                                generateModel: TSGenerateModel(json: ptp_ageMiddleAge)),
+            TSDiscoverItemModel(style: .ptp,
+                                viewModel: TSDiscoverBaseItemVM(uiStyle: .changeAge),
+                                generateModel: TSGenerateModel(json: ptp_ageAdult)),
+            TSDiscoverItemModel(style: .ptp,
+                                viewModel: TSDiscoverBaseItemVM(uiStyle: .changeAge),
+                                generateModel: TSGenerateModel(json: ptp_ageSenior)),
+            TSDiscoverItemModel(style: .ptp,
+                                viewModel: TSDiscoverBaseItemVM(uiStyle: .changeAgeCustom),
+                                generateModel: TSGenerateModel(json: ptp_ageCustomize))
+        ]
+    }()
+    lazy var ageSection: TSDiscoverSectionModel = {
+        let section = TSDiscoverSectionModel()
+        section.setTitle(imageNamed: "👶🏼",title: "Age Transformation")
+        section.sectionEdge =  UIEdgeInsets(top: 0, left: kDiscoverSection.left, bottom: 0, right: kDiscoverSection.right)
+        section.items = [ageItems]
+        section.uploadImageShowMore = true
+        return section
+    }()
 
+    
+    
+    
+    
+    
     lazy var loveScenesItems: [TSDiscoverItemModel] = {
         return [
             TSDiscoverItemModel(style: .creatVideo,
@@ -143,13 +239,11 @@ class TSAIListDataVM {
         section.setTitle(imageNamed: "💓",title: "Love Scenes")
         section.sectionEdge =  UIEdgeInsets(top: 0, left: kDiscoverSection.left, bottom: 0, right: kDiscoverSection.right)
         section.items = [loveScenesItems]
+        section.uploadImageShowMore = true
         return section
     }()
     
-    
-    
-    
-    
+
     lazy var emotionItems: [TSDiscoverItemModel] = {
         return [
             TSDiscoverItemModel(style: .creatVideo,
@@ -178,6 +272,7 @@ class TSAIListDataVM {
         section.setTitle(imageNamed: "😊",title: "Emotion")
         section.sectionEdge =  UIEdgeInsets(top: 0, left: kDiscoverSection.left, bottom: 0, right: kDiscoverSection.right)
         section.items = [emotionItems]
+        section.uploadImageShowMore = true
         return section
     }()
 
@@ -189,6 +284,9 @@ class TSAIListDataVM {
             TSDiscoverItemModel(style: .removeWatermark,
                                 viewModel: TSDiscoverAnimationItemVM(style: .crossDissolve, imageNameds: ["alistHome_0_RemoveWatermark","alistHome_1_RemoveWatermark"]),
                                 generateModel: TSGenerateModel(json: ptp_RemoveWatermark)),
+            TSDiscoverItemModel(style: .magicText,
+                                viewModel: TSDiscoverAnimationItemVM(style: .gif, imageNameds: ["Magic Text.gif"]),
+                                generateModel: TSGenerateModel(json: ptp_MagicText)),
             TSDiscoverItemModel(style: .portraitFusion,
                                 viewModel: TSDiscoverBaseItemVM(imageNamed: "alistHome_0_PortraitFusion"),
                                 generateModel: TSGenerateModel(json: ptp_PortraitFusion)),
@@ -251,6 +349,7 @@ class TSAIListDataVM {
         section.setTitle(imageNamed: "📽️",title: "Old Photo Animation")
         section.sectionEdge =  UIEdgeInsets(top: 0, left: kDiscoverSection.left, bottom: k_TabBar_Height+10, right: kDiscoverSection.right)
         section.items = [oldPhotoAnimationItems]
+        section.uploadImageShowMore = true
         return section
     }()
     
@@ -262,6 +361,8 @@ class TSAIListDataVM {
             restoreOldPhotoSection,
 //            loveScenesSection,//love场景审核不通过,先去掉
             photoFilterSection,
+            mePaintingSection,
+            ageSection,
             emotionSection,
             editPhotoSection,
             oldPhotoAnimationSection,

+ 39 - 0
TSLiveWallpaper/Business/TSAIListVC/TSAIUploadPhotoVC/TSAIUploadPhotoVC+ImageTextView.swift

@@ -0,0 +1,39 @@
+//
+//  TSAIUploadPhotoVC+ImageTextView.swift
+//  TSLiveWallpaper
+//
+//  Created by 100Years on 2025/8/19.
+//
+
+
+extension TSAIUploadPhotoVC {
+    func setUpChangeAgeCustomImageTextView(){
+        setUpCommonImageTextView()
+        self.textView.predicate = NSPredicate(format: "SELF MATCHES %@", "^[0-9]*$")
+        self.textView.titleLabel.text = "Age".localized
+        self.textView.infoLabel.text = ""
+        self.textView.placeholderTextView.placeholder = "Please enter the age you want to change...".localized
+        self.textView.placeholderTextView.keyboardType = .numberPad
+    }
+    
+    func setUpMagicTextImageTextView(){
+        setUpCommonImageTextView()
+        self.textView.titleLabel.text = "Description".localized
+        self.textView.infoLabel.text = ""
+        self.textView.placeholderTextView.placeholder = "Describe what you want to change...".localized
+    }
+}
+
+extension TSAIUploadPhotoVC {
+    func setUpCommonImageTextView(){
+        uploadImageViewMaxHeight = k_ScreenHeight-212-k_Height_safeAreaInsetsBottom()-k_Nav_Height
+        
+        cusStackView.addSubviewToStack(uploadImageBgView)
+        uploadImageBgView.snp.makeConstraints { make in
+            make.width.equalTo(k_ScreenWidth)
+            make.height.equalTo(k_ScreenHeight-212-k_Height_safeAreaInsetsBottom()-k_Nav_Height)
+        }
+        cusStackView.addSpacing(length: 32)
+        cusStackView.addSubviewToStack(self.textView)
+    }
+}

+ 1 - 0
TSLiveWallpaper/Business/TSAIListVC/TSAIUploadPhotoVC/TSAIUploadPhotoVC+Video.swift

@@ -12,6 +12,7 @@ extension TSAIUploadPhotoVC {
         textView.placeholderTextView.textViewTextChanged = { [weak self] text in
             guard let self = self else { return }
             additionalPrompt = text
+            updateSubmitBtnEnabled()
         }
         return textView
     }

+ 2 - 2
TSLiveWallpaper/Business/TSAIListVC/TSAIUploadPhotoVC/TSAIUploadPhotoVC+VideoStyle.swift

@@ -8,8 +8,8 @@
 
 extension TSAIUploadPhotoVC {
     
-    func creatVideoStyleBarView() -> TSAIUploadPhotoVideoStyleView {
-        let styleBarView = TSAIUploadPhotoVideoStyleView()
+    func creatVideoStyleBarView() -> TSAIUploadPhotoMoreStyleView {
+        let styleBarView = TSAIUploadPhotoMoreStyleView()
         styleBarView.selsetedBlock = { [weak self] model in
             guard let self = self else { return }
             generateModel = model.generateModel

+ 0 - 74
TSLiveWallpaper/Business/TSAIListVC/TSAIUploadPhotoVC/TSAIUploadPhotoVC+View.swift

@@ -110,77 +110,3 @@ extension TSAIUploadPhotoVC {
         }
     }
 }
-
-
-
-
-
-//lazy var segmentedView: BetterSegmentedControl = {
-//    let segmentedView = BetterSegmentedControl(
-//        frame: .zero,
-//        segments:
-//            LabelSegment.segments(
-//                withTitles: ["Female".localized,"Male".localized,"Random".localized],
-//                normalFont: .font(size: 12.0),
-//                normalTextColor: .white.withAlphaComponent(0.4),
-//                selectedFont: .font(size: 12.0),
-//                selectedTextColor: "#111111".uiColor),
-//        options:[.backgroundColor(.white.withAlphaComponent(0.1)),
-//                 .indicatorViewBackgroundColor(.white),
-//                 .indicatorViewInset(2),
-//                 .cornerRadius(20.0),
-//                 .animationSpringDamping(1.0)]
-//    )
-//    segmentedView.addTarget(self,action: #selector(segmentedControlValueChanged(_:)),for: .valueChanged)
-//    return segmentedView
-//}()
-//var additionalPrompt = ",female"
-//@objc func segmentedControlValueChanged(_ sender: BetterSegmentedControl) {
-//    switch sender.index {
-//    case 0:
-//        additionalPrompt = ",female"//女
-//    case 1:
-//        additionalPrompt = ",male"//男
-//    default:
-//        additionalPrompt = ""
-//    }
-//}
-
-//        if generatorStyle == .catTohuman {
-//            cusStackView.addSpacing(length: 9)
-//            cusStackView.addSubviewToStackWhiteBoard(segmentedView, length: 46)
-//            segmentedView.snp.makeConstraints { make in
-//                make.width.equalTo(k_ScreenWidth-70)
-//                make.height.equalTo(40)
-//                make.center.equalToSuperview()
-//            }
-//        }else{
-    //文字信息区域
-//            cusStackView.addSubviewToStack(getTextInfoCell(text: "Single photo with face fully visible".localized))
-//            cusStackView.addSpacing(length: lineSpacing)
-//            cusStackView.addSubviewToStack(getTextInfoCell(text: "No group photos, covered faces, nudes".localized))
-//        }
-
-//
-//func getTextInfoCell(text:String) -> UIView {
-//
-//let bgView = UIView()
-//let pointView = UIView()
-//pointView.backgroundColor = .white.withAlphaComponent(0.7)
-//pointView.cornerRadius = 1
-//bgView.addSubview(pointView)
-//pointView.snp.makeConstraints { make in
-//    make.top.equalTo(7)
-//    make.leading.equalTo(22)
-//    make.width.height.equalTo(2)
-//}
-//let textLabel1 = UILabel.createLabel(text: text,font: .font(size: 12),textColor: .white.withAlphaComponent(0.6),numberOfLines: 0)
-//textLabel1.setLineSpacing(lineSpacing)
-//bgView.addSubview(textLabel1)
-//textLabel1.snp.makeConstraints { make in
-//    make.top.bottom.equalToSuperview()
-//    make.leading.equalTo(16+16)
-//    make.trailing.equalTo(-16)
-//}
-//return bgView
-//}

+ 53 - 14
TSLiveWallpaper/Business/TSAIListVC/TSAIUploadPhotoVC/TSAIUploadPhotoVC.swift

@@ -15,12 +15,14 @@ class TSAIUploadPhotoVC: TSBaseVC {
     var generateModel:TSGenerateModel?
     var disCoverItemModels:[TSDiscoverItemModel]?
     var isUsedPhoto:Bool = false
+    var isShowMoreStyle:Bool = false
     init(titleString:String,
          upLoadImage:UIImage,
          generatorStyle:TSGeneratorImageStyle,
          disCoverItemModel:TSDiscoverItemModel? = nil,
          disCoverItemModels:[TSDiscoverItemModel]? = nil,
-         isUsedPhoto:Bool = false
+         isUsedPhoto:Bool = false,
+         isShowMoreStyle:Bool = false
     ) {
         self.titleString = titleString
         self.upLoadImage = upLoadImage
@@ -29,6 +31,7 @@ class TSAIUploadPhotoVC: TSBaseVC {
         self.generateModel = disCoverItemModel?.generateModel
         self.isUsedPhoto = isUsedPhoto
         self.disCoverItemModels = disCoverItemModels
+        self.isShowMoreStyle = isShowMoreStyle
         super.init()
     }
     
@@ -56,12 +59,12 @@ class TSAIUploadPhotoVC: TSBaseVC {
     lazy var deleteBtn: UIButton = creatDeleteBtn()
     
     
-    //###### 视频区域 ######
+    //###### 输入框 ######
     lazy var textView: TSAIUploadPhotoTextView = creatTextView()
     
     //更多样式区域
     lazy var styleBarView: TSAIUploadPhotoMoreStyleBarView = creatMoreStyleBarView()
-    lazy var videoStyleBarView: TSAIUploadPhotoVideoStyleView = creatVideoStyleBarView()
+    lazy var videoStyleBarView: TSAIUploadPhotoMoreStyleView = creatVideoStyleBarView()
     
     //###### 数据区 ######
     var uploadImageViewMaxHeight:CGFloat = k_ScreenHeight-76-k_Height_safeAreaInsetsBottom()-k_Nav_Height
@@ -76,20 +79,29 @@ class TSAIUploadPhotoVC: TSBaseVC {
                 uploadImageView.isHidden = false
                 deleteBtn.isHidden = false
                 uploadImageView.image = image
-                submitBtn.isEnabled = true
             }else {
                 upLoadView.isHidden = false
                 uploadImageView.isHidden = true
                 deleteBtn.isHidden = true
                 uploadImageView.image = nil
-                submitBtn.isEnabled = false
             }
+            updateSubmitBtnEnabled()
             updateUploadImageViewFrame()
         }
     }
 
     var additionalPrompt = ""
     
+    override func createData() {
+        if disCoverItemModel?.viewModel.uiStyle == .changeAge {//如果是年纪变化,则移除最后的年纪自定义
+            disCoverItemModels?.removeLast()
+        }
+    
+        if disCoverItemModel?.viewModel.uiStyle == .changeAgeCustom {//如果是年纪自定义,不展示更多 more
+            self.isShowMoreStyle = false
+        }
+    }
+    
     override func createView() {
         
         addNormalNavBarView()
@@ -117,7 +129,6 @@ class TSAIUploadPhotoVC: TSBaseVC {
         cusStackView.snp.makeConstraints { make in
             make.top.equalTo(0)
             make.leading.trailing.equalToSuperview()
-//            make.bottom.equalTo(submitBtn.snp.top).offset(-16)
             make.bottom.equalTo(submitBtn.snp.top)
         }
         
@@ -139,19 +150,41 @@ class TSAIUploadPhotoVC: TSBaseVC {
         }
     }
     func setUpStackView(){
-        if let disCoverItemModels = self.disCoverItemModels,generatorStyle == .creatVideo{
-            setUpVideoStyleBarView(discoverItemModels:disCoverItemModels)
+      
+        if generatorStyle == .magicText{
+            setUpMagicTextImageTextView() //magicTextUI 样式
+        }else if let disCoverItemModel = self.disCoverItemModel,disCoverItemModel.viewModel.uiStyle == .changeAgeCustom{
+            setUpChangeAgeCustomImageTextView() //改变年纪 UI 样式
+        }else if let disCoverItemModels = self.disCoverItemModels,isShowMoreStyle == true{
+            setUpVideoStyleBarView(discoverItemModels:disCoverItemModels) //支持显示更多的 UI 样式
         }else if let styleArray = getStyleArray(){
-            setUpMoreStyleBarView(styleModels: styleArray)
+            setUpMoreStyleBarView(styleModels: styleArray) //显示常用图片处理功能的 UI 样式
         }else if generatorStyle == .creatVideo {
-            setUpVideoUploadView()
+            setUpVideoUploadView() //显示视频生成的样式
         }else{
-            setUpImageUploadView()
+            setUpImageUploadView() //显示普通的图片上传样式
         }
     }
     
+    
+    var btnEnabledNeedTextView:Bool{
+        if disCoverItemModel?.viewModel.uiStyle == .changeAgeCustom || generatorStyle == .magicText {
+            if additionalPrompt.isEmpty{
+                return false
+            }
+        }
+        return true
+    }
+    
+    func updateSubmitBtnEnabled() {
+        var enabled = upLoadImage == nil ? false : true
+        if enabled == true {
+            enabled = btnEnabledNeedTextView
+        }
+        kSetUpSubmitBtn(btn: submitBtn, enabled: enabled)
+    }
+    
     func updateUploadImageViewFrame() {
-        
         if let image = upLoadImage {
             let newSize = kGetSubFrame(superSize: CGSizeMake(k_ScreenWidth, uploadImageViewMaxHeight), subViewSize: image.size)
             uploadImageView.snp.remakeConstraints{ make in
@@ -182,7 +215,13 @@ class TSAIUploadPhotoVC: TSBaseVC {
         let generatorModel = TSAIListPhotoGeneratorModel(upLoadImage: upLoadImage, generatorStyle: generatorStyle,additionalPrompt: additionalPrompt)
 
         if let generateModel = generateModel{
-            generatorModel.prompt = generateModel.prompt + additionalPrompt
+            if generatorStyle == .magicText { // 神奇文字是用户完全自定义文案
+                generatorModel.prompt = additionalPrompt
+            }else if disCoverItemModel?.viewModel.uiStyle == .changeAgeCustom {//自定义年纪需要特殊插入输入框内容
+                generatorModel.prompt = String(format: generateModel.prompt,additionalPrompt)
+            }else{
+                generatorModel.prompt = generateModel.prompt + additionalPrompt
+            }
             generatorModel.model = generateModel.model
         }else{
             if let promptModel = generatorStyle.generateModel{
@@ -224,7 +263,7 @@ extension TSAIUploadPhotoVC {
     }
 }
 extension TSAIUploadPhotoVC {
-
+    
     @objc func clickView() {
         self.view.endEditing(true)
     }

+ 12 - 0
TSLiveWallpaper/Business/TSAIListVC/TSAIUploadPhotoVC/View/TSAIUploadPhotoTextView.swift

@@ -7,6 +7,9 @@
 
 class TSAIUploadPhotoTextView: TSBaseView ,UITextViewDelegate{
     
+    
+    var predicate:NSPredicate? = nil
+    
     lazy var titleLabel: UILabel = {
         let titleLabel = UILabel.createLabel(text: "Description".localized,font: .font(size: 16.0),textColor: .white)
         return titleLabel
@@ -63,6 +66,15 @@ class TSAIUploadPhotoTextView: TSBaseView ,UITextViewDelegate{
             textView.resignFirstResponder()
             return false
         }
+        
+        // 允许删除操作
+        if text.isEmpty { return true }
+
+        // 创建数字谓词
+        if let predicate = predicate {
+            return predicate.evaluate(with: text)
+        }
+        
         return true
     }
     

+ 99 - 35
TSLiveWallpaper/Business/TSAIListVC/TSAIUploadPhotoVC/View/TSAIUploadPhotoVideoStyleView.swift

@@ -1,11 +1,11 @@
 //
-//  TSAIUploadPhotoVideoStyleView.swift
+//  TSAIUploadPhotoMoreStyleView.swift
 //  TSLiveWallpaper
 //
 //  Created by 100Years on 2025/7/30.
 //
 
-class TSAIUploadPhotoVideoStyleView : TSBaseView {
+class TSAIUploadPhotoMoreStyleView : TSBaseView {
     var selsetedBlock:((TSDiscoverItemModel)->Void)?
     var modelArray:[TSDiscoverItemModel] = []{
         didSet{
@@ -31,7 +31,9 @@ class TSAIUploadPhotoVideoStyleView : TSBaseView {
         let collectionView = TSBaseCollectionView(frame: .zero, collectionViewLayout: layout)
         collectionView.delegate = self
         collectionView.dataSource = self
-        collectionView.register(TSAIUploadPhotoVideoStyleViewCell.self, forCellWithReuseIdentifier: "TSAIUploadPhotoVideoStyleViewCell")
+        collectionView.register(TSAIUploadPhotoMoreStyleViewCell.self, forCellWithReuseIdentifier: "TSAIUploadPhotoMoreStyleViewCell")
+        collectionView.register(TSAIUploadPhotoMoreStyleImageViewCell.self, forCellWithReuseIdentifier: "TSAIUploadPhotoMoreStyleImageViewCell")
+        collectionView.register(TSAIUploadPhotoMoreStyleGifViewCell.self, forCellWithReuseIdentifier: "TSAIUploadPhotoMoreStyleGifViewCell")
         collectionView.contentInset = UIEdgeInsets(top: 0, left: 16, bottom: 0, right: 16)
         return collectionView
     }()
@@ -44,13 +46,26 @@ class TSAIUploadPhotoVideoStyleView : TSBaseView {
         }
     }
 }
-extension TSAIUploadPhotoVideoStyleView: UICollectionViewDataSource ,UICollectionViewDelegate {
+
+extension TSAIUploadPhotoMoreStyleView: UICollectionViewDataSource ,UICollectionViewDelegate {
+    
+    func getReuseIdentifier(itemModel:TSDiscoverItemModel) -> String{
+        if let animationModel = itemModel.viewModel as? TSDiscoverAnimationItemVM {
+            if animationModel.style == .gif {
+                return "TSAIUploadPhotoMoreStyleGifViewCell"
+            }
+        }
+        return "TSAIUploadPhotoMoreStyleImageViewCell"
+    }
+    
+    
     public func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
         return modelArray.count
     }
     
     public func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
-        if let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "TSAIUploadPhotoVideoStyleViewCell", for: indexPath) as? TSAIUploadPhotoVideoStyleViewCell{
+        if let itemModel = modelArray.safeObj(At: indexPath.row),
+         let cell = collectionView.dequeueReusableCell(withReuseIdentifier: getReuseIdentifier(itemModel: itemModel), for: indexPath) as? TSAIUploadPhotoMoreStyleViewCell{
             cell.model = modelArray.safeObj(At: indexPath.row)
             return cell
         }
@@ -65,25 +80,13 @@ extension TSAIUploadPhotoVideoStyleView: UICollectionViewDataSource ,UICollectio
     }
 }
 
-import Kingfisher
-class TSAIUploadPhotoVideoStyleViewCell: TSBaseCollectionCell {
+
+class TSAIUploadPhotoMoreStyleViewCell: TSBaseCollectionCell {
+
     var model:TSDiscoverItemModel? {
         didSet {
             guard let model = model else { return }
             textLabel.text = model.name
-    
-            if model.viewModel is TSDiscoverAnimationItemVM {
-                if let gifURL = Bundle.main.url(forResource: model.imageNamed, withExtension: nil) {
-                    animatedImageView.kf.setImage(with: gifURL, options: [.cacheOriginalImage]){ result in
-                        switch result {
-                        case .success(_):
-                            self.animatedImageView.startAnimating()
-                        case .failure(let error):
-                            print("GIF 加载失败: \(error.localizedDescription)")
-                        }
-                    }
-                }
-            }
         }
     }
     
@@ -94,13 +97,9 @@ class TSAIUploadPhotoVideoStyleViewCell: TSBaseCollectionCell {
         }
     }
 
-    lazy var animatedImageView: AnimatedImageView = {
-        let animatedImageView = AnimatedImageView()
-        animatedImageView.autoPlayAnimatedImage = false
-        animatedImageView.repeatCount = .infinite
-        animatedImageView.contentMode = .scaleAspectFill
-        animatedImageView.clipsToBounds = true
-        return animatedImageView
+    lazy var ctxView: UIView = {
+        let ctxView = UIView()
+        return ctxView
     }()
     
     lazy var textLabel: UILabel = {
@@ -108,7 +107,6 @@ class TSAIUploadPhotoVideoStyleViewCell: TSBaseCollectionCell {
         return textLabel
     }()
     
-    
     lazy var selectedView: UIView = {
         let selectedView = UIView()
         selectedView.backgroundColor = .black.withAlphaComponent(0.6)
@@ -128,28 +126,94 @@ class TSAIUploadPhotoVideoStyleViewCell: TSBaseCollectionCell {
 
 
     override func creatUI() {
-        bgContentView.addSubview(animatedImageView)
-        animatedImageView.snp.makeConstraints { make in
+        
+        let bgCtxView = UIView()
+        bgContentView.addSubview(bgCtxView)
+        bgCtxView.snp.makeConstraints { make in
             make.top.equalTo(0)
             make.width.height.equalTo(80)
             make.centerX.equalToSuperview()
         }
         
-        animatedImageView.addSubview(selectedView)
+        bgCtxView.addSubview(ctxView)
+        ctxView.snp.makeConstraints { make in
+            make.edges.equalToSuperview()
+        }
+        
+        bgCtxView.addSubview(selectedView)
         selectedView.snp.makeConstraints { make in
             make.edges.equalToSuperview()
         }
         
         bgContentView.addSubview(textLabel)
         textLabel.snp.makeConstraints { make in
-            make.top.equalTo(animatedImageView.snp.bottom).offset(2)
+            make.top.equalTo(bgCtxView.snp.bottom).offset(2)
             make.bottom.equalTo(0)
             make.leading.equalTo(4)
             make.trailing.equalTo(-4)
         }
         
-        
-        
-        
+    }
+}
+
+class TSAIUploadPhotoMoreStyleImageViewCell: TSAIUploadPhotoMoreStyleViewCell {
+    override var model:TSDiscoverItemModel? {
+        didSet {
+            guard let model = model else { return }
+            showImageView.image = UIImage(named: model.imageNamed)
+        }
+    }
+    
+    lazy var showImageView: UIImageView = {
+        let showImageView = UIImageView.createImageView(contentMode: .scaleAspectFill)
+        return showImageView
+    }()
+
+    override func creatUI() {
+        super.creatUI()
+        ctxView.addSubview(showImageView)
+        showImageView.snp.makeConstraints { make in
+            make.edges.equalToSuperview()
+        }
+    }
+}
+
+
+import Kingfisher
+class TSAIUploadPhotoMoreStyleGifViewCell: TSAIUploadPhotoMoreStyleViewCell {
+    override var model:TSDiscoverItemModel? {
+        didSet {
+            guard let model = model else { return }
+            if model.viewModel is TSDiscoverAnimationItemVM {
+                if let gifURL = Bundle.main.url(forResource: model.imageNamed, withExtension: nil) {
+                    animatedImageView.kf.setImage(with: gifURL, options: [.cacheOriginalImage]){ result in
+                        switch result {
+                        case .success(_):
+                            self.animatedImageView.startAnimating()
+                        case .failure(let error):
+                            print("GIF 加载失败: \(error.localizedDescription)")
+                        }
+                    }
+                }
+            }
+        }
+    }
+    
+
+    lazy var animatedImageView: AnimatedImageView = {
+        let animatedImageView = AnimatedImageView()
+        animatedImageView.autoPlayAnimatedImage = false
+        animatedImageView.repeatCount = .infinite
+        animatedImageView.contentMode = .scaleAspectFill
+        animatedImageView.clipsToBounds = true
+        return animatedImageView
+    }()
+
+    override func creatUI() {
+        super.creatUI()
+        ctxView.addSubview(animatedImageView)
+        animatedImageView.snp.makeConstraints { make in
+            make.edges.equalToSuperview()
+        }
     }
 }

+ 50 - 0
TSLiveWallpaper/Business/TSPurchaseMembershipVC/TSPurchaseRroPageView/TSPurchaseRroPageVM.swift

@@ -0,0 +1,50 @@
+//
+//  TSPurchaseRroPageVM.swift
+//  TSLiveWallpaper
+//
+//  Created by 100Years on 2025/8/20.
+//
+
+
+class TSPurchaseRroPageModel{
+    var imageNamed: String
+    var text: String
+    
+    init(imageNamed: String, text: String) {
+        self.imageNamed = imageNamed
+        self.text = text
+    }
+}
+
+
+
+class TSPurchaseRroPageVM {
+    
+    
+//    func getModels(vipType:PremiumPeriod) -> [TSPurchaseRroPageModel] {
+//        
+//        vipType
+//        
+//        
+//        let googleVeo3:Bool = self == .pro ? false : true
+//        let backgroundTask:String = self == .pro ? "1" : "2"
+//        return [
+//            Feature(name: "Unlimited Photo".localized, available: true),
+//            Feature(name: String(format: "%d+ Styles".localized, 200), available: true),
+//            Feature(name: String(format: "%d+ Tools".localized, 50), available: true),
+//            Feature(name: "Video Generations".localized, value: "\(vipType.creatVideoMaxNum)"),
+//            Feature(name: "Background Task".localized, value: backgroundTask),
+//            Feature(name: "No Watermark".localized, available: true),
+////            Feature(name: "Google Veo3".localized, available: googleVeo3)
+//        ]
+//    }
+    
+    
+    
+    
+    
+    
+    
+    
+    
+}

+ 109 - 0
TSLiveWallpaper/Business/TSPurchaseMembershipVC/TSPurchaseRroPageView/TSPurchaseRroPageView.swift

@@ -0,0 +1,109 @@
+//
+//  TSPurchaseRroPageView.swift
+//  TSLiveWallpaper
+//
+//  Created by 100Years on 2025/8/20.
+//
+
+import TYCyclePagerView
+
+
+
+
+
+class TSPurchaseRroPageView : TSBaseView {
+    
+    var itemSize:CGSize = UIScreen.main.bounds.size
+    lazy var models:[TSDiscoverItemModel] = [TSDiscoverItemModel](){
+        didSet{
+            itemSize = self.bounds.size
+            pageControl.numberOfPages = models.count
+            cyclePagerView.reloadData()
+            
+            kMainShort {
+                guard let collectionView = self.cyclePagerView.collectionView else { return }
+            }
+        }
+    }
+    
+    lazy var pageControl: TYPageControl = {
+        let pageControl = TYPageControl()
+        pageControl.currentPageIndicatorSize = CGSize(width: 20, height: 1)
+        pageControl.pageIndicatorSize = CGSize(width: 20, height: 1)
+        pageControl.currentPageIndicatorTintColor = .white
+        pageControl.pageIndicatorTintColor = .white.withAlphaComponent(0.5)
+        pageControl.pageIndicatorSpaing = 8
+        pageControl.contentHorizontalAlignment = .center
+        return pageControl
+    }()
+    
+    lazy var cyclePagerView: TYCyclePagerView = {
+        let pagerView = TYCyclePagerView()
+        pagerView.isInfiniteLoop = true
+        pagerView.autoScrollInterval = 5.0
+        pagerView.delegate = self
+        pagerView.dataSource = self
+        pagerView.layout.layoutType = TYCyclePagerTransformLayoutType.linear
+        pagerView.register(TSPurchaseRroPageViewCell.classForCoder(), forCellWithReuseIdentifier: "TSPurchaseRroPageViewCell")
+
+        pagerView.addSubview(pageControl)
+        pageControl.snp.makeConstraints { make in
+            make.bottom.equalTo(-8)
+            make.leading.equalTo(0)
+            make.trailing.equalTo(0)
+            make.height.equalTo(1)
+        }
+        
+        return pagerView
+    }()
+    override func creatUI() {
+        
+        
+        
+    }
+}
+extension TSPurchaseRroPageView : TYCyclePagerViewDelegate, TYCyclePagerViewDataSource{
+    
+    func numberOfItems(in pageView: TYCyclePagerView) -> Int {
+        return models.count
+    }
+    
+    func pagerView(_ pagerView: TYCyclePagerView, cellForItemAt index: Int) -> UICollectionViewCell {
+        
+        if let itemModel = models.safeObj(At: index),
+           let cell = pagerView.dequeueReusableCell(withReuseIdentifier: "TSPurchaseRroPageViewCell", for: index) as? TSPurchaseRroPageViewCell
+        {
+            cell.model = itemModel
+            return cell
+        }
+        return UICollectionViewCell()
+    }
+    
+    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) {
+
+    }
+    
+    func pagerView(_ pageView: TYCyclePagerView, didScrollFrom fromIndex: Int, to toIndex: Int) {
+        self.pageControl.currentPage = toIndex;
+    }
+}
+
+class TSPurchaseRroPageViewCell: TSBaseCollectionCell {
+    var model:TSDiscoverItemModel?
+    override func creatUI() {
+        
+    }
+}

+ 3 - 3
TSLiveWallpaper/Common/Purchase/TSPurchaseManager.swift

@@ -90,9 +90,9 @@ public class PurchaseManager: NSObject {
     }
 
     @objc public var isVip: Bool {
-//        #if DEBUG
-//        return true
-//        #endif
+        #if DEBUG
+        return true
+        #endif
         guard let expiresDate = expiredDate else {
             return false
         }

BIN
TSLiveWallpaper/Resource/Gif/Magic Text.gif


+ 0 - 0
TSLiveWallpaper/Resource/generat_loading.gif → TSLiveWallpaper/Resource/Gif/generat_loading.gif


+ 0 - 0
TSLiveWallpaper/Resource/Gif/New Smile.mp4 → TSLiveWallpaper/Resource/video/New Smile.mp4


+ 0 - 0
TSLiveWallpaper/Resource/Gif/aiList SendRose Banner.mp4 → TSLiveWallpaper/Resource/video/aiList SendRose Banner.mp4


BIN
TSLiveWallpaper/Resource/video/change age.mp4


BIN
TSLiveWallpaper/Resource/video/magic text.mp4