Przeglądaj źródła

3.6.16(1)提测

100Years 1 tydzień temu
rodzic
commit
dec450bbe8
71 zmienionych plików z 1352 dodań i 124 usunięć
  1. 30 2
      TSLiveWallpaper.xcodeproj/project.pbxproj
  2. 21 0
      TSLiveWallpaper/Assets.xcassets/AIList/home/alistHome_0_90sAnime.imageset/Contents.json
  3. BIN
      TSLiveWallpaper/Assets.xcassets/AIList/home/alistHome_0_90sAnime.imageset/视图2@1x-5@8x.png
  4. 21 0
      TSLiveWallpaper/Assets.xcassets/AIList/home/alistHome_0_ActionFigure.imageset/Contents.json
  5. BIN
      TSLiveWallpaper/Assets.xcassets/AIList/home/alistHome_0_ActionFigure.imageset/视图2@1x@8x.png
  6. 21 0
      TSLiveWallpaper/Assets.xcassets/AIList/home/alistHome_0_Anime.imageset/Contents.json
  7. BIN
      TSLiveWallpaper/Assets.xcassets/AIList/home/alistHome_0_Anime.imageset/alistHome_0_Anime@3x.png
  8. 21 0
      TSLiveWallpaper/Assets.xcassets/AIList/home/alistHome_0_Emoji.imageset/Contents.json
  9. BIN
      TSLiveWallpaper/Assets.xcassets/AIList/home/alistHome_0_Emoji.imageset/视图1@1x-7@8x-2.png
  10. 21 0
      TSLiveWallpaper/Assets.xcassets/AIList/home/alistHome_0_MusicBox.imageset/Contents.json
  11. BIN
      TSLiveWallpaper/Assets.xcassets/AIList/home/alistHome_0_MusicBox.imageset/视图2@1x-3@8x.png
  12. 21 0
      TSLiveWallpaper/Assets.xcassets/AIList/home/alistHome_0_Pix3D.imageset/Contents.json
  13. BIN
      TSLiveWallpaper/Assets.xcassets/AIList/home/alistHome_0_Pix3D.imageset/视图2@1x-4@8x.png
  14. 21 0
      TSLiveWallpaper/Assets.xcassets/AIList/home/alistHome_0_PlushToy.imageset/Contents.json
  15. BIN
      TSLiveWallpaper/Assets.xcassets/AIList/home/alistHome_0_PlushToy.imageset/视图2@1x-2@8x.png
  16. 21 0
      TSLiveWallpaper/Assets.xcassets/AIList/home/alistHome_0_Polaroid.imageset/Contents.json
  17. BIN
      TSLiveWallpaper/Assets.xcassets/AIList/home/alistHome_0_Polaroid.imageset/视图2@1x-7@8x.png
  18. 21 0
      TSLiveWallpaper/Assets.xcassets/AIList/home/alistHome_1_90sAnime.imageset/Contents.json
  19. BIN
      TSLiveWallpaper/Assets.xcassets/AIList/home/alistHome_1_90sAnime.imageset/视图1@1x-2@8x.png
  20. 21 0
      TSLiveWallpaper/Assets.xcassets/AIList/home/alistHome_1_ActionFigure.imageset/Contents.json
  21. BIN
      TSLiveWallpaper/Assets.xcassets/AIList/home/alistHome_1_ActionFigure.imageset/视图1@1x-3@8x.png
  22. 21 0
      TSLiveWallpaper/Assets.xcassets/AIList/home/alistHome_1_Anime.imageset/Contents.json
  23. BIN
      TSLiveWallpaper/Assets.xcassets/AIList/home/alistHome_1_Anime.imageset/alistHome_1_Anime@3x.png
  24. 21 0
      TSLiveWallpaper/Assets.xcassets/AIList/home/alistHome_1_Emoji.imageset/Contents.json
  25. BIN
      TSLiveWallpaper/Assets.xcassets/AIList/home/alistHome_1_Emoji.imageset/视图1@1x-7@8x.png
  26. 21 0
      TSLiveWallpaper/Assets.xcassets/AIList/home/alistHome_1_MusicBox.imageset/Contents.json
  27. BIN
      TSLiveWallpaper/Assets.xcassets/AIList/home/alistHome_1_MusicBox.imageset/视图1@1x@8x.png
  28. 21 0
      TSLiveWallpaper/Assets.xcassets/AIList/home/alistHome_1_Pix3D.imageset/Contents.json
  29. BIN
      TSLiveWallpaper/Assets.xcassets/AIList/home/alistHome_1_Pix3D.imageset/视图1@1x-8@8x.png
  30. 21 0
      TSLiveWallpaper/Assets.xcassets/AIList/home/alistHome_1_PlushToy.imageset/Contents.json
  31. BIN
      TSLiveWallpaper/Assets.xcassets/AIList/home/alistHome_1_PlushToy.imageset/视图1@1x-4@8x.png
  32. 21 0
      TSLiveWallpaper/Assets.xcassets/AIList/home/alistHome_1_Polaroid.imageset/Contents.json
  33. BIN
      TSLiveWallpaper/Assets.xcassets/AIList/home/alistHome_1_Polaroid.imageset/视图1@1x-6@8x.png
  34. 1 1
      TSLiveWallpaper/Assets.xcassets/AIList/selectedPhotoStyleCamera/selectedPhotoStyleCamera.imageset/Contents.json
  35. BIN
      TSLiveWallpaper/Assets.xcassets/AIList/selectedPhotoStyleCamera/selectedPhotoStyleCamera.imageset/camera@2x.png
  36. BIN
      TSLiveWallpaper/Assets.xcassets/AIList/selectedPhotoStyleCamera/selectedPhotoStyleCamera.imageset/selectedPhotoStyleCamera@2x.png
  37. 1 1
      TSLiveWallpaper/Assets.xcassets/AIList/selectedPhotoStyleCamera/selectedPhotoStyleOldPhoto.imageset/Contents.json
  38. BIN
      TSLiveWallpaper/Assets.xcassets/AIList/selectedPhotoStyleCamera/selectedPhotoStyleOldPhoto.imageset/old photo@2x.png
  39. BIN
      TSLiveWallpaper/Assets.xcassets/AIList/selectedPhotoStyleCamera/selectedPhotoStyleOldPhoto.imageset/selectedPhotoStyleOldPhoto@2x.png
  40. 1 1
      TSLiveWallpaper/Assets.xcassets/AIList/selectedPhotoStyleCamera/selectedPhotoStylePhoto.imageset/Contents.json
  41. BIN
      TSLiveWallpaper/Assets.xcassets/AIList/selectedPhotoStyleCamera/selectedPhotoStylePhoto.imageset/photo@2x.png
  42. BIN
      TSLiveWallpaper/Assets.xcassets/AIList/selectedPhotoStyleCamera/selectedPhotoStylePhoto.imageset/selectedPhotoStylePhoto@2x.png
  43. 22 0
      TSLiveWallpaper/Assets.xcassets/Common/bottom_shadow.imageset/Contents.json
  44. BIN
      TSLiveWallpaper/Assets.xcassets/Common/bottom_shadow.imageset/bottom_shadow@2x.png
  45. BIN
      TSLiveWallpaper/Assets.xcassets/Common/bottom_shadow.imageset/bottom_shadow@3x.png
  46. 12 1
      TSLiveWallpaper/Business/TSAIListVC/TSAIAgeImageHintVC/TSAIListHintBaseVC.swift
  47. 2 0
      TSLiveWallpaper/Business/TSAIListVC/TSAIList+Enmu.swift
  48. 7 4
      TSLiveWallpaper/Business/TSAIListVC/TSAIListHistoryVC/TSAIListHistoryVC.swift
  49. 34 33
      TSLiveWallpaper/Business/TSAIListVC/TSAIListHistoryVC/View/TSAIListHistoryCell.swift
  50. 10 0
      TSLiveWallpaper/Business/TSAIListVC/TSAIListVC/TSAIListVC.swift
  51. 103 0
      TSLiveWallpaper/Business/TSAIListVC/TSAIListVC/VM/TSAIListDataVM+Dic.swift
  52. 79 43
      TSLiveWallpaper/Business/TSAIListVC/TSAIListVC/VM/TSAIListDataVM.swift
  53. 6 4
      TSLiveWallpaper/Business/TSAIListVC/TSAIPhotoDetailsVC/TSAIPhotoDetailsBrowserPageVC.swift
  54. 15 15
      TSLiveWallpaper/Business/TSAIListVC/TSAIPhotoGeneratorVC/TSAIPhotoDetailsVC/TSAIPhotoDetailsVC+Video.swift
  55. 2 2
      TSLiveWallpaper/Business/TSAIListVC/TSAIPhotoGeneratorVC/TSAIPhotoDetailsVC/TSAIPhotoDetailsVC.swift
  56. 89 0
      TSLiveWallpaper/Business/TSAIListVC/TSEffectPreviewPageVC/TSEffectPreviewPageVC.swift
  57. 139 0
      TSLiveWallpaper/Business/TSAIListVC/TSEffectPreviewPageVC/TSEffectPreviewVC.swift
  58. 267 0
      TSLiveWallpaper/Business/TSAIListVC/TSEffectPreviewPageVC/View/TSEffectPreviewStyleView.swift
  59. 2 2
      TSLiveWallpaper/Business/TSAIListVC/TSSelectedPhotoStyleVC/TSSelectedPhotoStyleVC.swift
  60. 84 15
      TSLiveWallpaper/Common/ViewTool/TSPhotoPickerManager/TSPhotoPickerManager.swift
  61. 10 0
      TSLiveWallpaper/ar.lproj/Localizable.strings
  62. 10 0
      TSLiveWallpaper/de.lproj/Localizable.strings
  63. 10 0
      TSLiveWallpaper/en.lproj/Localizable.strings
  64. 10 0
      TSLiveWallpaper/es.lproj/Localizable.strings
  65. 10 0
      TSLiveWallpaper/fr.lproj/Localizable.strings
  66. 10 0
      TSLiveWallpaper/it.lproj/Localizable.strings
  67. 10 0
      TSLiveWallpaper/ja.lproj/Localizable.strings
  68. 10 0
      TSLiveWallpaper/ko.lproj/Localizable.strings
  69. 10 0
      TSLiveWallpaper/pt-BR.lproj/Localizable.strings
  70. 10 0
      TSLiveWallpaper/pt-PT.lproj/Localizable.strings
  71. 10 0
      TSLiveWallpaper/zh-Hant.lproj/Localizable.strings

+ 30 - 2
TSLiveWallpaper.xcodeproj/project.pbxproj

@@ -110,6 +110,9 @@
 		A8E56BF92D1520EC003C54AF /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = A8E56BED2D1520EC003C54AF /* Assets.xcassets */; };
 		A8E56BFB2D1520EC003C54AF /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = A8E56BF02D1520EC003C54AF /* LaunchScreen.storyboard */; };
 		A8E590392DFFAE4400C2533F /* TSBootVC.swift in Sources */ = {isa = PBXBuildFile; fileRef = A8E590382DFFAE4400C2533F /* TSBootVC.swift */; };
+		A8E60A2C2E4B26D600FC6A3E /* TSEffectPreviewVC.swift in Sources */ = {isa = PBXBuildFile; fileRef = A8E60A2B2E4B26D400FC6A3E /* TSEffectPreviewVC.swift */; };
+		A8E60A322E4B293900FC6A3E /* TSEffectPreviewPageVC.swift in Sources */ = {isa = PBXBuildFile; fileRef = A8E60A312E4B293800FC6A3E /* TSEffectPreviewPageVC.swift */; };
+		A8E60A352E4B2F7800FC6A3E /* TSEffectPreviewStyleView.swift in Sources */ = {isa = PBXBuildFile; fileRef = A8E60A342E4B2F7400FC6A3E /* TSEffectPreviewStyleView.swift */; };
 		A8EB1A302E2F6D8C001F58D7 /* TSAILIstBannerCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = A8EB1A2F2E2F6D7F001F58D7 /* TSAILIstBannerCell.swift */; };
 		A8EB1A322E2F716A001F58D7 /* TSImagesComparisonView.swift in Sources */ = {isa = PBXBuildFile; fileRef = A8EB1A312E2F716A001F58D7 /* TSImagesComparisonView.swift */; };
 		A8EB1A342E2F7327001F58D7 /* TSAIListHeaderView.swift in Sources */ = {isa = PBXBuildFile; fileRef = A8EB1A332E2F7320001F58D7 /* TSAIListHeaderView.swift */; };
@@ -309,6 +312,9 @@
 		A8E56BEE2D1520EC003C54AF /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = "<group>"; };
 		A8E56BEF2D1520EC003C54AF /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/LaunchScreen.storyboard; sourceTree = "<group>"; };
 		A8E590382DFFAE4400C2533F /* TSBootVC.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TSBootVC.swift; sourceTree = "<group>"; };
+		A8E60A2B2E4B26D400FC6A3E /* TSEffectPreviewVC.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TSEffectPreviewVC.swift; sourceTree = "<group>"; };
+		A8E60A312E4B293800FC6A3E /* TSEffectPreviewPageVC.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TSEffectPreviewPageVC.swift; sourceTree = "<group>"; };
+		A8E60A342E4B2F7400FC6A3E /* TSEffectPreviewStyleView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TSEffectPreviewStyleView.swift; sourceTree = "<group>"; };
 		A8EB1A2F2E2F6D7F001F58D7 /* TSAILIstBannerCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TSAILIstBannerCell.swift; sourceTree = "<group>"; };
 		A8EB1A312E2F716A001F58D7 /* TSImagesComparisonView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TSImagesComparisonView.swift; sourceTree = "<group>"; };
 		A8EB1A332E2F7320001F58D7 /* TSAIListHeaderView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TSAIListHeaderView.swift; sourceTree = "<group>"; };
@@ -784,6 +790,7 @@
 		A86857A92DF9210D0089D222 /* TSAIListVC */ = {
 			isa = PBXGroup;
 			children = (
+				A8E60A2A2E4B26CF00FC6A3E /* TSEffectPreviewPageVC */,
 				A8F9F2EF2E372BFB007FE237 /* TSAIExpandImageVC */,
 				A8EE84402E33603D00CA04F0 /* TSSelectedPhotoStyleVC */,
 				A81E81612E24F05700207EB8 /* TSFusionImageVC */,
@@ -920,6 +927,24 @@
 			path = TSBootVC;
 			sourceTree = "<group>";
 		};
+		A8E60A2A2E4B26CF00FC6A3E /* TSEffectPreviewPageVC */ = {
+			isa = PBXGroup;
+			children = (
+				A8E60A332E4B2F6B00FC6A3E /* View */,
+				A8E60A2B2E4B26D400FC6A3E /* TSEffectPreviewVC.swift */,
+				A8E60A312E4B293800FC6A3E /* TSEffectPreviewPageVC.swift */,
+			);
+			path = TSEffectPreviewPageVC;
+			sourceTree = "<group>";
+		};
+		A8E60A332E4B2F6B00FC6A3E /* View */ = {
+			isa = PBXGroup;
+			children = (
+				A8E60A342E4B2F7400FC6A3E /* TSEffectPreviewStyleView.swift */,
+			);
+			path = View;
+			sourceTree = "<group>";
+		};
 		A8EB1A3C2E2F8785001F58D7 /* TSAIListStyleMoreVC */ = {
 			isa = PBXGroup;
 			children = (
@@ -1279,6 +1304,7 @@
 			buildActionMask = 2147483647;
 			files = (
 				A81CA4992D1652C400A3AAC8 /* TSMineVC.swift in Sources */,
+				A8E60A2C2E4B26D600FC6A3E /* TSEffectPreviewVC.swift in Sources */,
 				A8C4C0EF2D27BFF7003C46FC /* TSNetworkTool.swift in Sources */,
 				A828E9432E03AF4E00E6A9EA /* TSAppUpdateManager.swift in Sources */,
 				A8F3D64F2E2E533400DE6C9D /* TSColorSeleteBarView.swift in Sources */,
@@ -1361,6 +1387,7 @@
 				A8EE92D22DFFFE2F0077DFFD /* TSMineVM.swift in Sources */,
 				A86857BE2DF926220089D222 /* TSAIListHistoryCell.swift in Sources */,
 				A86857DD2DF99C200089D222 /* TSImageIPanComparisonView.swift in Sources */,
+				A8E60A322E4B293900FC6A3E /* TSEffectPreviewPageVC.swift in Sources */,
 				A8EB1A602E30CB0C001F58D7 /* TSAIUsedPhotoVC.swift in Sources */,
 				A86857D32DF978740089D222 /* TSProgressState.swift in Sources */,
 				A868579A2DF915950089D222 /* TSPurchaseEnum.swift in Sources */,
@@ -1387,6 +1414,7 @@
 				A83946332D1D66A900ABFF0D /* TSPrivacyPolicyVC.swift in Sources */,
 				A86857C22DF926ED0089D222 /* TSPhotoSizeHelper.swift in Sources */,
 				A84C239F2D1E88CD00B61B55 /* TSFileManagerTool.swift in Sources */,
+				A8E60A352E4B2F7800FC6A3E /* TSEffectPreviewStyleView.swift in Sources */,
 				A8FD8F3C2DFC0A72008CAACF /* HighlightedText.swift in Sources */,
 				A86857D52DF97A2A0089D222 /* TSAIExpandChangeView.swift in Sources */,
 				A86857A82DF9204B0089D222 /* TSPhotoPickerManager.swift in Sources */,
@@ -1499,7 +1527,7 @@
 					"$(inherited)",
 					"@executable_path/Frameworks",
 				);
-				MARKETING_VERSION = 3.6.15;
+				MARKETING_VERSION = 3.6.16;
 				PRODUCT_BUNDLE_IDENTIFIER = musicplayer.offline.com;
 				PRODUCT_NAME = "$(TARGET_NAME)";
 				PROVISIONING_PROFILE_SPECIFIER = "";
@@ -1540,7 +1568,7 @@
 					"$(inherited)",
 					"@executable_path/Frameworks",
 				);
-				MARKETING_VERSION = 3.6.15;
+				MARKETING_VERSION = 3.6.16;
 				PRODUCT_BUNDLE_IDENTIFIER = musicplayer.offline.com;
 				PRODUCT_NAME = "$(TARGET_NAME)";
 				PROVISIONING_PROFILE_SPECIFIER = "";

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

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

BIN
TSLiveWallpaper/Assets.xcassets/AIList/home/alistHome_0_90sAnime.imageset/视图2@1x-5@8x.png


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

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

BIN
TSLiveWallpaper/Assets.xcassets/AIList/home/alistHome_0_ActionFigure.imageset/视图2@1x@8x.png


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

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

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


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

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

BIN
TSLiveWallpaper/Assets.xcassets/AIList/home/alistHome_0_Emoji.imageset/视图1@1x-7@8x-2.png


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

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

BIN
TSLiveWallpaper/Assets.xcassets/AIList/home/alistHome_0_MusicBox.imageset/视图2@1x-3@8x.png


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

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

BIN
TSLiveWallpaper/Assets.xcassets/AIList/home/alistHome_0_Pix3D.imageset/视图2@1x-4@8x.png


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

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

BIN
TSLiveWallpaper/Assets.xcassets/AIList/home/alistHome_0_PlushToy.imageset/视图2@1x-2@8x.png


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

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

BIN
TSLiveWallpaper/Assets.xcassets/AIList/home/alistHome_0_Polaroid.imageset/视图2@1x-7@8x.png


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

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

BIN
TSLiveWallpaper/Assets.xcassets/AIList/home/alistHome_1_90sAnime.imageset/视图1@1x-2@8x.png


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

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

BIN
TSLiveWallpaper/Assets.xcassets/AIList/home/alistHome_1_ActionFigure.imageset/视图1@1x-3@8x.png


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

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

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


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

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

BIN
TSLiveWallpaper/Assets.xcassets/AIList/home/alistHome_1_Emoji.imageset/视图1@1x-7@8x.png


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

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

BIN
TSLiveWallpaper/Assets.xcassets/AIList/home/alistHome_1_MusicBox.imageset/视图1@1x@8x.png


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

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

BIN
TSLiveWallpaper/Assets.xcassets/AIList/home/alistHome_1_Pix3D.imageset/视图1@1x-8@8x.png


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

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

BIN
TSLiveWallpaper/Assets.xcassets/AIList/home/alistHome_1_PlushToy.imageset/视图1@1x-4@8x.png


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

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

BIN
TSLiveWallpaper/Assets.xcassets/AIList/home/alistHome_1_Polaroid.imageset/视图1@1x-6@8x.png


+ 1 - 1
TSLiveWallpaper/Assets.xcassets/AIList/selectedPhotoStyleCamera/selectedPhotoStyleCamera.imageset/Contents.json

@@ -5,7 +5,7 @@
       "scale" : "1x"
     },
     {
-      "filename" : "selectedPhotoStyleCamera@2x.png",
+      "filename" : "camera@2x.png",
       "idiom" : "universal",
       "scale" : "2x"
     },

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


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


+ 1 - 1
TSLiveWallpaper/Assets.xcassets/AIList/selectedPhotoStyleCamera/selectedPhotoStyleOldPhoto.imageset/Contents.json

@@ -5,7 +5,7 @@
       "scale" : "1x"
     },
     {
-      "filename" : "selectedPhotoStyleOldPhoto@2x.png",
+      "filename" : "old photo@2x.png",
       "idiom" : "universal",
       "scale" : "2x"
     },

BIN
TSLiveWallpaper/Assets.xcassets/AIList/selectedPhotoStyleCamera/selectedPhotoStyleOldPhoto.imageset/old photo@2x.png


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


+ 1 - 1
TSLiveWallpaper/Assets.xcassets/AIList/selectedPhotoStyleCamera/selectedPhotoStylePhoto.imageset/Contents.json

@@ -5,7 +5,7 @@
       "scale" : "1x"
     },
     {
-      "filename" : "selectedPhotoStylePhoto@2x.png",
+      "filename" : "photo@2x.png",
       "idiom" : "universal",
       "scale" : "2x"
     },

BIN
TSLiveWallpaper/Assets.xcassets/AIList/selectedPhotoStyleCamera/selectedPhotoStylePhoto.imageset/photo@2x.png


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


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

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

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


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


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

@@ -124,6 +124,17 @@ class TSAIListHintBaseVC: TSBaseVC {
             )
         }
         
+        static var ptpConfig:Config {
+            return Config(imageMaxBitSize: kUploadImageMaxBit10Size,
+                          goodImageNamed: "hint_Animated_good",
+                          badImageNamed: "hint_Animated_bad",
+                          titleText: "Upload your photos".localized,
+                          titleSubText: "",
+                          goodText: "Suitable".localized,
+                          goodInfoText: "Good quality portrair color photos".localized,
+                          badText: "Unsuitable".localized,
+                          badInfoText: "B&W or Severely damaged photos".localized)
+        }
     }
     
     var config:Config = Config.enhanceConfig
@@ -154,7 +165,7 @@ class TSAIListHintBaseVC: TSBaseVC {
     
     override func createView() {
         addNormalNavBarView()
-        _ = setNavigationItem("", imageName: "ic_close", direction: .right, action: #selector(clickView))
+        _ = setNavigationItem("", imageName: "ic_Close", direction: .right, action: #selector(clickView))
         view.backgroundColor = .mainBg
      
         contentView.addSubview(popupContentView)

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

@@ -64,6 +64,8 @@ enum TSGeneratorImageStyle:String {
             return .animatedConfig
         case .portraitFusion:
             return .portraitFusionConfig
+        case .ptp:
+            return .ptpConfig
         default:
             return .animatedConfig
         }

+ 7 - 4
TSLiveWallpaper/Business/TSAIListVC/TSAIListHistoryVC/TSAIListHistoryVC.swift

@@ -140,16 +140,19 @@ extension TSAIListHistoryVC: UICollectionViewDataSource ,UICollectionViewDelegat
     public func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) {
 
         if let dbModel = listModelArray.safeObj(At:indexPath.row){
+            if dbModel.status != "success"{
+                return
+            }
             
-            let isVip = kPurchaseBusiness.isVip
+//            let isVip = kPurchaseBusiness.isVip
             //多个浏览
             var dataModelArray: [TSActionInfoModel] = []
             for itemModel in listModelArray {
                 if itemModel.status == "success" || itemModel.modelType == .example {
-                    if isVip == false,itemModel.isVideo {
-                    }else{
+//                    if isVip == false,itemModel.isVideo {
+//                    }else{
                         dataModelArray.append(itemModel)
-                    }
+//                    }
                 }
             }
             

+ 34 - 33
TSLiveWallpaper/Business/TSAIListVC/TSAIListHistoryVC/View/TSAIListHistoryCell.swift

@@ -97,33 +97,34 @@ class TSAIListHistoryCell: TSBaseCollectionCell {
         return videoIconImageView
     }()
     
-    lazy var blurEffect: UIVisualEffectView = {
-        let blurEffect = createBlurEffectView(style: .dark)
-        blurEffect.addGestureRecognizer(UITapGestureRecognizer(target: self, action: #selector(clickUnlockVip)))
-        let bgView = UIView()
-        blurEffect.contentView.addSubview(bgView)
-        bgView.snp.makeConstraints { make in            make.center.equalToSuperview()
-        }
-
-        let vipImageView = UIImageView.createImageView(image: .vipColorIcon)
-        bgView.addSubview(vipImageView)
-        
-        let textLabel = UILabel.createLabel(text: "Unlock Result".localized,font: .font(size: 12),textColor: .themeColor)
-        bgView.addSubview(textLabel)
-        
-        vipImageView.snp.makeConstraints { make in
-            make.leading.top.bottom.equalToSuperview()
-            make.height.width.equalTo(20)
-        }
-        
-        textLabel.snp.makeConstraints { make in
-            make.centerY.equalToSuperview()
-            make.trailing.equalToSuperview()
-            make.leading.equalTo(vipImageView.snp.trailing).offset(6)
-        }
-
-        return blurEffect
-    }()
+//    lazy var blurEffect: UIVisualEffectView = {
+//        let blurEffect = createBlurEffectView(style: .dark)
+//        blurEffect.addGestureRecognizer(UITapGestureRecognizer(target: self, action: #selector(clickUnlockVip)))
+//        let bgView = UIView()
+//        blurEffect.contentView.addSubview(bgView)
+//        bgView.snp.makeConstraints { make in
+//            make.center.equalToSuperview()
+//        }
+//
+//        let vipImageView = UIImageView.createImageView(image: .vipColorIcon)
+//        bgView.addSubview(vipImageView)
+//        
+//        let textLabel = UILabel.createLabel(text: "Unlock Result".localized,font: .font(size: 12),textColor: .themeColor)
+//        bgView.addSubview(textLabel)
+//        
+//        vipImageView.snp.makeConstraints { make in
+//            make.leading.top.bottom.equalToSuperview()
+//            make.height.width.equalTo(20)
+//        }
+//        
+//        textLabel.snp.makeConstraints { make in
+//            make.centerY.equalToSuperview()
+//            make.trailing.equalToSuperview()
+//            make.leading.equalTo(vipImageView.snp.trailing).offset(6)
+//        }
+//
+//        return blurEffect
+//    }()
     
     @objc func clickUnlockVip(_ gestureRecognizer: UILongPressGestureRecognizer) {
         buttonTapped?("unlockVip")
@@ -165,10 +166,10 @@ class TSAIListHistoryCell: TSBaseCollectionCell {
             make.height.equalTo(20)
         }
         
-        contentView.addSubview(blurEffect)
-        blurEffect.snp.makeConstraints { make in
-            make.edges.equalToSuperview()
-        }
+//        contentView.addSubview(blurEffect)
+//        blurEffect.snp.makeConstraints { make in
+//            make.edges.equalToSuperview()
+//        }
         
         contentView.addSubview(videoIconImageView)
         videoIconImageView.snp.makeConstraints { make in
@@ -238,13 +239,13 @@ extension TSAIListHistoryCell {
 extension TSAIListHistoryCell {
     
     func setVideoHidden(){
-        blurEffect.isHidden = true
+//        blurEffect.isHidden = true
         videoPlayer?.cleanup()
         videoPlayer = nil
     }
     
     func setVideoURL(){
-        blurEffect.isHidden = kPurchaseBusiness.isVip
+//        blurEffect.isHidden = kPurchaseBusiness.isVip
         
         videoPlayer?.cleanup()
         videoPlayer = nil

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

@@ -229,6 +229,16 @@ extension TSAIListVC {
             if kPurchaseBusiness.kJudgeVipFreeType(vipFreeNumType: .generalRemoveBg){ return }//判断 vip
         }
         
+        //全新的特殊 push 分类,以后会将下面的,都改成这种的
+        if secModel.title == "Photo Filter",
+           let itemModels = secModel.items.first as? [TSDiscoverItemModel]
+        {
+            let startIndex = itemModels.firstIndex(where: {$0.name == itemModel.name}) ?? 0
+            kPushVC(target: target, modelVC: TSEffectPreviewVC(dataItems: itemModels, startIndex:startIndex))
+            return
+        }
+        
+        
         Self.enterSelectPhotos(target: target,style: itemModel.style) { images in
             if itemModel.style == .photoExpand {
                 target.push(TSAIExpandImageVC(upLoadImage: images.first!),animated: false) {

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

@@ -363,5 +363,108 @@ extension TSAIListDataVM {
             model:kie
         ]
     }
+}
+
+//MARK: kie模型
+extension TSAIListDataVM {
+    
+    var ptp_Anime:[String:Any]{
+        [
+            imageName: "alistHome_1_Anime",
+            imageText: "Anime",
+            prompt:"Turn uploaded photos into ghibli style",
+            isVip: false,
+            unionType: 2,
+            model:kie
+        ]
+    }
+    
+    var ptp_Polaroid:[String:Any]{
+        [
+            imageName: "alistHome_1_Polaroid",
+            imageText: "Polaroid",
+            prompt:"請根據附上的照片,將畫面中的角色轉化為 3D Q版黏土風格角色公仔,整體放置於一張 拍立得照片中,並由一隻手持握著拍立得相紙。畫面呈現出一種視覺效果:角色從拍立得照片中突破邊框、延伸進入現實世界的二維空間。人物設定:將照片中的人物轉化為 Q版 3D 公仔,整體約為 1/4 身高比例,呈現全身,保持原照片中的服裝與造型,風格為柔軟可愛的黏土材質。背景:延續拍立得中的背景,以 Q 版風格繪製,不需再有人物出現,僅作為角色背景的延伸,與照片原始場景一致。拍立得底部文字: Life Moment。",
+            isVip: false,
+            unionType: 2,
+            model:kie
+        ]
+    }
+    
+    var ptp_Emoji:[String:Any]{
+        [
+            imageName: "alistHome_1_Emoji",
+            imageText: "Emoji",
+            prompt:"Create an Apple iOS Memoji-style sticker character inspired by the person in upload photo, sticker's face similar with the exact face. The sticker should look like the real character with similar hairstyle, hair accessories, outfit, and pose. Keep the original person in the photo completely unchanged with their real human face and appearance. Do not modify or stylize their face or body in any way. Place the new Memoji-style sticker character next to the original person in the photo in a natural and balanced position, as if it is an official iOS sticker placed on top of the photo. The final style should be cute, clean, three-dimensional , Bright, brightly colored and identical to official Apple iOS Memoji stickers style, while ensuring the original person remains fully realistic and untouched for clear comparison with the sticker.",
+            isVip: false,
+            unionType: 2,
+            model:kie
+        ]
+    }
+    
+    var ptp_Pix3D:[String:Any]{
+        [
+            imageName: "alistHome_1_Pix3D",
+            imageText: "Pix 3D",
+            prompt:"Please create image in Pixar style",
+            isVip: false,
+            unionType: 2,
+            model:kie
+        ]
+    }
+    
+    var ptp_90sAnime:[String:Any]{
+        [
+            imageName: "alistHome_1_90sAnime",
+            imageText: "90s Anime",
+            prompt:"A 90s anime style portrait of upload photo, cel-shaded animation, bold black outlines, high contrast shading, limited color palette, expressive angular eyes, retro anime aesthetic, soft film grain, dynamic pose, nostalgic vintage vibe.",
+            isVip: false,
+            unionType: 2,
+            model:kie
+        ]
+    }
+    
+    var ptp_ActionFigure:[String:Any]{
+        [
+            imageName: "alistHome_1_ActionFigure",
+            imageText: "Action Figure",
+            prompt:"将上传的照片转化为一款3D可爱玩偶风格形象,整体造型卡通立体,主角位于画面正中,清哳可见,风格融合插画与 3D 质感。背景为玩具包装盒展示样式:包括透明塑料外壳、纸卡底板,纸卡上印有 「Limited  Edition」字样。包装设计包含玩具插卡元素,如顶部挂孔、边缘裁切线等,呈现真实的商用玩具包装感。包装内右侧竖排另外放置 4 件 “配件” 道具,要根据上传的照片中人物的造型和身份推理出匹配的道具,摆放自然协调,增强整体故事感。色调以照片配色为主,饱和度高,颜色明亮清澈,光线自然温暖,画面风格现代、专业,同时保持可爱、俏皮的趣味性。背景简洁,突出主体,整体视觉呈现应具备真实商品的质感与陈列吸引力。",
+            isVip: false,
+            unionType: 2,
+            model:kie
+        ]
+    }
+    
+    var ptp_PlushToy:[String:Any]{
+        [
+            imageName: "alistHome_1_PlushToy",
+            imageText: "Plush Toy",
+            prompt:"plush toy style, soft fabric texture, stuffed animal material, fuzzy felt surface, cute doll-like appearance, hand-stitched details, round plush eyes, embroidered facial features, fluffy yarn hair, chibi proportions, pastel color palette, soft lighting, no hard edges, whimsical toy aesthetic, kawaii style, high detail stitching, plush seams visible, cozy and huggable look",
+            isVip: false,
+            unionType: 2,
+            model:kie
+        ]
+    }
+    
+    var ptp_MusicBox:[String:Any]{
+        [
+            imageName: "alistHome_1_MusicBox",
+            imageText: "Music Box",
+            prompt:"根据照片上的内容打造一款细致精美、萌趣可爱的3D渲染收藏摆件,装置在柔和粉彩色调、温馨浪漫的展示盒中。展示盒为浅奶油色搭配柔和的金色装饰,形似精致的便携珠宝盒。打开盒盖,呈现出一幕温暖浪漫的场景:两位Q版角色正甜蜜相望。盒顶雕刻着“FOREVER TOGETHER”(永远在一起)的字样,周围点缀着小巧精致的星星与爱心图案。两人都拥有充满表现力的眼睛,以及柔和、温暖的微笑,传递出浓浓的爱意和迷人的气质。他们身后有一扇圆形窗户,透过窗户能看到阳光明媚的中国古典小镇天际线和轻柔飘浮的云朵。盒内以温暖的柔和光线进行照明,背景中漂浮着花瓣点缀气氛。整个展示盒和角色的色调优雅和谐,营造出一个奢华而梦幻的迷你纪念品场景。",
+            isVip: false,
+            unionType: 2,
+            model:kie
+        ]
+    }
+    
     
+//    var ptp_:[String:Any]{
+//        [
+//            imageName: "ptp_style_",
+//            imageText: "",
+//            prompt:"",
+//            isVip: false,
+//            unionType: 2,
+//            model:kie
+//        ]
+//    }
 }

+ 79 - 43
TSLiveWallpaper/Business/TSAIListVC/TSAIListVC/VM/TSAIListDataVM.swift

@@ -78,52 +78,43 @@ class TSAIListDataVM {
     }()
     
     
-    
-    
-    lazy var oldPhotoAnimationItems: [TSDiscoverItemModel] = {
+    lazy var photoFilterItems: [TSDiscoverItemModel] = {
         return [
-            TSDiscoverItemModel(style: .creatVideo,
-                                viewModel: TSDiscoverAnimationItemVM(style: .gif),
-                                generateModel: TSGenerateModel(json: video_Revive)),
-            TSDiscoverItemModel(style: .creatVideo,
-                                viewModel: TSDiscoverAnimationItemVM(style: .gif),
-                                generateModel: TSGenerateModel(json: video_SayHi)),
-            TSDiscoverItemModel(style: .creatVideo,
-                                viewModel: TSDiscoverAnimationItemVM(style: .gif),
-                                generateModel: TSGenerateModel(json: video_HeartGesture)),
-            TSDiscoverItemModel(style: .creatVideo,
-                                viewModel: TSDiscoverAnimationItemVM(style: .gif),
-                                generateModel: TSGenerateModel(json: video_BlowKiss)),
-            TSDiscoverItemModel(style: .creatVideo,
-                                viewModel: TSDiscoverAnimationItemVM(style: .gif),
-                                generateModel: TSGenerateModel(json: video_JazzDance)),
-            TSDiscoverItemModel(style: .creatVideo,
-                                viewModel: TSDiscoverAnimationItemVM(style: .gif),
-                                generateModel: TSGenerateModel(json: video_Applaud)),
-            TSDiscoverItemModel(style: .creatVideo,
-                                viewModel: TSDiscoverAnimationItemVM(style: .gif),
-                                generateModel: TSGenerateModel(json: video_Cheers)),
-            TSDiscoverItemModel(style: .creatVideo,
-                                viewModel: TSDiscoverAnimationItemVM(style: .gif),
-                                generateModel: TSGenerateModel(json: video_Salute)),
-            TSDiscoverItemModel(style: .creatVideo,
-                                viewModel: TSDiscoverAnimationItemVM(style: .gif),
-                                generateModel: TSGenerateModel(json: video_Stroll)),
+            TSDiscoverItemModel(style: .ptp,
+                                viewModel: TSDiscoverAnimationItemVM(title: "",style: .comparison, imageNameds: ["alistHome_0_Anime","alistHome_1_Anime"]),
+                                generateModel: TSGenerateModel(json: ptp_Anime)),
+            TSDiscoverItemModel(style: .ptp,
+                                viewModel: TSDiscoverAnimationItemVM(title: "",style: .comparison, imageNameds: ["alistHome_0_Polaroid","alistHome_1_Polaroid"]),
+                                generateModel: TSGenerateModel(json: ptp_Polaroid)),
+            TSDiscoverItemModel(style: .ptp,
+                                viewModel: TSDiscoverAnimationItemVM(title: "",style: .comparison, imageNameds: ["alistHome_0_Emoji","alistHome_1_Emoji"]),
+                                generateModel: TSGenerateModel(json: ptp_Emoji)),
+            TSDiscoverItemModel(style: .ptp,
+                                viewModel: TSDiscoverAnimationItemVM(title: "",style: .comparison, imageNameds: ["alistHome_0_Pix3D","alistHome_1_Pix3D"]),
+                                generateModel: TSGenerateModel(json: ptp_Pix3D)),
+            TSDiscoverItemModel(style: .ptp,
+                                viewModel: TSDiscoverAnimationItemVM(title: "",style: .comparison, imageNameds: ["alistHome_0_90sAnime","alistHome_1_90sAnime"]),
+                                generateModel: TSGenerateModel(json: ptp_90sAnime)),
+            TSDiscoverItemModel(style: .ptp,
+                                viewModel: TSDiscoverAnimationItemVM(title: "",style: .comparison, imageNameds: ["alistHome_0_ActionFigure","alistHome_1_ActionFigure"]),
+                                generateModel: TSGenerateModel(json: ptp_ActionFigure)),
+            TSDiscoverItemModel(style: .ptp,
+                                viewModel: TSDiscoverAnimationItemVM(title: "",style: .comparison, imageNameds: ["alistHome_0_PlushToy","alistHome_1_PlushToy"]),
+                                generateModel: TSGenerateModel(json: ptp_PlushToy)),
+            TSDiscoverItemModel(style: .ptp,
+                                viewModel: TSDiscoverAnimationItemVM(title: "",style: .comparison, imageNameds: ["alistHome_0_MusicBox","alistHome_1_MusicBox"]),
+                                generateModel: TSGenerateModel(json: ptp_MusicBox))
         ]
     }()
-    lazy var oldPhotoAnimationSection: TSDiscoverSectionModel = {
+    lazy var photoFilterSection: TSDiscoverSectionModel = {
         let section = TSDiscoverSectionModel()
-        section.setTitle(imageNamed: "📽️",title: "Old Photo Animation")
+        section.setTitle(imageNamed: "🎆",title: "Photo Filter")
         section.sectionEdge =  UIEdgeInsets(top: 0, left: kDiscoverSection.left, bottom: 0, right: kDiscoverSection.right)
-        section.items = [oldPhotoAnimationItems]
+        section.items = [photoFilterItems]
         return section
     }()
-
-    
-    
-    
-    
     
+
     lazy var loveScenesItems: [TSDiscoverItemModel] = {
         return [
             TSDiscoverItemModel(style: .creatVideo,
@@ -195,6 +186,9 @@ class TSAIListDataVM {
     
     lazy var editPhotoItems: [TSDiscoverItemModel] = {
         return [
+            TSDiscoverItemModel(style: .removeWatermark,
+                                viewModel: TSDiscoverAnimationItemVM(style: .crossDissolve, imageNameds: ["alistHome_0_RemoveWatermark","alistHome_1_RemoveWatermark"]),
+                                generateModel: TSGenerateModel(json: ptp_RemoveWatermark)),
             TSDiscoverItemModel(style: .portraitFusion,
                                 viewModel: TSDiscoverBaseItemVM(imageNamed: "alistHome_0_PortraitFusion"),
                                 generateModel: TSGenerateModel(json: ptp_PortraitFusion)),
@@ -204,9 +198,6 @@ class TSAIListDataVM {
             TSDiscoverItemModel(style: .removeBg,
                                 viewModel: TSDiscoverAnimationItemVM(style: .crossDissolve, imageNameds: ["alistHome_0_RemoveBackground","alistHome_1_RemoveBackground"]),
                                 generateModel: TSGenerateModel(json: ptp_RemoveBg)),
-            TSDiscoverItemModel(style: .removeWatermark,
-                                viewModel: TSDiscoverAnimationItemVM(style: .crossDissolve, imageNameds: ["alistHome_0_RemoveWatermark","alistHome_1_RemoveWatermark"]),
-                                generateModel: TSGenerateModel(json: ptp_RemoveWatermark)),
             TSDiscoverItemModel(style: .photoExpand,
                                 viewModel: TSDiscoverBaseItemVM(imageNamed: "alistHome_0_ExpandPhoto"),
                                 generateModel: TSGenerateModel(json: ptp_PhotoExpand)),
@@ -216,19 +207,64 @@ class TSAIListDataVM {
     lazy var editPhotoSection: TSDiscoverSectionModel = {
         let section = TSDiscoverSectionModel()
         section.setTitle(imageNamed: "🖌️",title: "Edit Old Photo")
-        section.sectionEdge =  UIEdgeInsets(top: 0, left: kDiscoverSection.left, bottom: k_TabBar_Height+10, right: kDiscoverSection.right)
+        section.sectionEdge =  UIEdgeInsets(top: 0, left: kDiscoverSection.left, bottom: 0, right: kDiscoverSection.right)
         section.items = [editPhotoItems]
         return section
     }()
     
+    
+    
+    
+    lazy var oldPhotoAnimationItems: [TSDiscoverItemModel] = {
+        return [
+            TSDiscoverItemModel(style: .creatVideo,
+                                viewModel: TSDiscoverAnimationItemVM(style: .gif),
+                                generateModel: TSGenerateModel(json: video_Revive)),
+            TSDiscoverItemModel(style: .creatVideo,
+                                viewModel: TSDiscoverAnimationItemVM(style: .gif),
+                                generateModel: TSGenerateModel(json: video_SayHi)),
+            TSDiscoverItemModel(style: .creatVideo,
+                                viewModel: TSDiscoverAnimationItemVM(style: .gif),
+                                generateModel: TSGenerateModel(json: video_HeartGesture)),
+            TSDiscoverItemModel(style: .creatVideo,
+                                viewModel: TSDiscoverAnimationItemVM(style: .gif),
+                                generateModel: TSGenerateModel(json: video_BlowKiss)),
+            TSDiscoverItemModel(style: .creatVideo,
+                                viewModel: TSDiscoverAnimationItemVM(style: .gif),
+                                generateModel: TSGenerateModel(json: video_JazzDance)),
+            TSDiscoverItemModel(style: .creatVideo,
+                                viewModel: TSDiscoverAnimationItemVM(style: .gif),
+                                generateModel: TSGenerateModel(json: video_Applaud)),
+            TSDiscoverItemModel(style: .creatVideo,
+                                viewModel: TSDiscoverAnimationItemVM(style: .gif),
+                                generateModel: TSGenerateModel(json: video_Cheers)),
+            TSDiscoverItemModel(style: .creatVideo,
+                                viewModel: TSDiscoverAnimationItemVM(style: .gif),
+                                generateModel: TSGenerateModel(json: video_Salute)),
+            TSDiscoverItemModel(style: .creatVideo,
+                                viewModel: TSDiscoverAnimationItemVM(style: .gif),
+                                generateModel: TSGenerateModel(json: video_Stroll)),
+        ]
+    }()
+    lazy var oldPhotoAnimationSection: TSDiscoverSectionModel = {
+        let section = TSDiscoverSectionModel()
+        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]
+        return section
+    }()
+    
+    
+    
     lazy var listDatas: [TSDiscoverSectionModel] = {
         return [
             bannerSection,
             restoreOldPhotoSection,
-            oldPhotoAnimationSection,
 //            loveScenesSection,//love场景审核不通过,先去掉
+            photoFilterSection,
             emotionSection,
             editPhotoSection,
+            oldPhotoAnimationSection,
         ]
     }()
     

+ 6 - 4
TSLiveWallpaper/Business/TSAIListVC/TSAIPhotoDetailsVC/TSAIPhotoDetailsBrowserPageVC.swift

@@ -10,7 +10,7 @@ class TSAIPhotoDetailsBrowserPageVC: TSBaseVC {
     var deleteBlock:((TSActionInfoModel)->Void)?
     var browserPageVC:TSAIPhotoBrowserPageVC
     public init(dataItems: [Any], startIndex: Int = 0) {
-        browserPageVC = TSAIPhotoBrowserPageVC(dataItems: dataItems, startIndex: startIndex)
+        browserPageVC = TSAIPhotoBrowserPageVC(dataItems: dataItems, startIndex: startIndex,navigationOrientation:.vertical)
         super.init()
     }
     
@@ -74,7 +74,7 @@ class TSAIPhotoDetailsBrowserPageVC: TSBaseVC {
             make.height.equalTo(48)
             make.bottom.equalTo(bottomBtnTop)
         }
-        
+        reloadUI()
     }
     
     override func createFrame() {
@@ -84,8 +84,10 @@ class TSAIPhotoDetailsBrowserPageVC: TSBaseVC {
     }
     
     override func dealThings() {
- 
-    
+        browserPageVC.currentIndexChanged = { [weak self] index in
+            guard let self = self else { return }
+            reloadUI()
+        }
     }
 }
 

+ 15 - 15
TSLiveWallpaper/Business/TSAIListVC/TSAIPhotoGeneratorVC/TSAIPhotoDetailsVC/TSAIPhotoDetailsVC+Video.swift

@@ -11,7 +11,7 @@ extension TSAIPhotoDetailsVC {
     func setVideoHidden(){
         videoPlayerVC.removeFromParent()
         videoPlayerVC.view.removeFromSuperview()
-        videoBlurEffect.removeFromSuperview()
+//        videoBlurEffect.removeFromSuperview()
     }
     
     func setVideoURL(){
@@ -24,19 +24,19 @@ extension TSAIPhotoDetailsVC {
         self.contentView.insertSubview(self.videoPlayerVC.view, at: 0)
         self.videoPlayerVC.setControlsBottom(bottem: -80-k_Height_safeAreaInsetsBottom())
         self.videoPlayerVC.runloppPlay()
-        self.videoPlayerVC.view.addSubview(videoBlurEffect)
-        videoBlurEffect.snp.makeConstraints { make in
-            make.edges.equalToSuperview()
-        }
+//        self.videoPlayerVC.view.addSubview(videoBlurEffect)
+//        videoBlurEffect.snp.makeConstraints { make in
+//            make.edges.equalToSuperview()
+//        }
         
-        //添加结算 Vip 的按钮
-        contentView.addSubview(unlockVipBtn)
-        unlockVipBtn.snp.makeConstraints { make in
-            make.centerX.equalToSuperview()
-            make.width.equalTo(248)
-            make.height.equalTo(48)
-            make.bottom.equalTo(-12-k_Height_safeAreaInsetsBottom())
-        }
+        //添加解锁 Vip 的按钮
+//        contentView.addSubview(unlockVipBtn)
+//        unlockVipBtn.snp.makeConstraints { make in
+//            make.centerX.equalToSuperview()
+//            make.width.equalTo(248)
+//            make.height.equalTo(48)
+//            make.bottom.equalTo(-12-k_Height_safeAreaInsetsBottom())
+//        }
         updateVipView()
     }
      
@@ -46,8 +46,8 @@ extension TSAIPhotoDetailsVC {
     
     @objc func updateVipView() {
         let isVip = kPurchaseBusiness.isVip
-        unlockVipBtn.isHidden = isVip
-        videoBlurEffect.isHidden = isVip
+//        unlockVipBtn.isHidden = isVip
+//        videoBlurEffect.isHidden = isVip
         shareBtn.isHidden = !isVip
         saveBtn.isHidden = !isVip
     }

+ 2 - 2
TSLiveWallpaper/Business/TSAIListVC/TSAIPhotoGeneratorVC/TSAIPhotoDetailsVC/TSAIPhotoDetailsVC.swift

@@ -35,8 +35,8 @@ class TSAIPhotoDetailsVC: TSBaseVC {
 
     
     //视频
-    lazy var videoBlurEffect: UIVisualEffectView = createBlurEffectView(style: .dark)
-    lazy var unlockVipBtn: UIButton = creatUnlockVipBtn()
+//    lazy var videoBlurEffect: UIVisualEffectView = createBlurEffectView(style: .dark)
+//    lazy var unlockVipBtn: UIButton = creatUnlockVipBtn()
     var videoPlayerVC: TSAIListVideoPlayerVC = TSAIListVideoPlayerVC(videoURL: URL(string: "www.baidu.com")!)
     
 

+ 89 - 0
TSLiveWallpaper/Business/TSAIListVC/TSEffectPreviewPageVC/TSEffectPreviewPageVC.swift

@@ -0,0 +1,89 @@
+//
+//  TSEffectPreviewPageVC.swift
+//  TSLiveWallpaper
+//
+//  Created by 100Years on 2025/8/12.
+//
+
+class TSEffectPreviewPageVC: TSBasePageVC {
+    override func viewController(at index: Int) -> UIViewController? {
+          guard index >= 0 && index < dataItems.count else { return nil }
+          if let model = dataItems[index] as? TSDiscoverItemModel {
+              return TSEffectPreviewPageItemVC.createBrowserVC(with: model)
+          }
+          return nil
+      }
+    
+    override func indexOfViewController(_ viewController: UIViewController) -> Int? {
+          guard let vc = viewController as? TSEffectPreviewPageItemVC,
+                let index = dataItems.firstIndex(where: { ($0 as? TSDiscoverItemModel) === vc.model }) else {
+              return nil
+          }
+          return index
+      }
+    
+    override func dealThings() {
+ 
+    }
+}
+
+class TSEffectPreviewPageItemVC: TSBaseVC {
+    
+    var model:TSDiscoverItemModel
+
+    init(model: TSDiscoverItemModel) {
+        self.model = model
+        super.init()
+    }
+    
+    
+    @MainActor required init?(coder: NSCoder) {
+        fatalError("init(coder:) has not been implemented")
+    }
+    
+    override func createView() {
+        setNavBarViewHidden(true)
+    }
+    
+    
+    // 工厂方法
+    static func createBrowserVC(with model: TSDiscoverItemModel) -> TSEffectPreviewPageItemVC {
+        return TSEffectPreviewPageItemComparisonVC(model: model)
+    }
+    
+}
+
+class TSEffectPreviewPageItemComparisonVC: TSEffectPreviewPageItemVC {
+    
+    lazy var comparisonView: TSImagesComparisonView = {
+        let comparisonView = TSImagesComparisonView(frame: CGRect(x: 0, y: 300, width: 300, height: 400))
+        comparisonView.isRunloop = true
+        comparisonView.cornerRadius = 0
+        return comparisonView
+    }()
+
+    override func createView() {
+        super.createView()
+        
+        contentView.addSubview(comparisonView)
+        comparisonView.snp.makeConstraints { make in
+            make.edges.equalToSuperview()
+        }
+        
+        kMainAsync {
+            self.comparisonView.startAnimation(direction: .rightToLeft)
+        }
+    }
+    
+    override func dealThings() {
+        if let animationModel = model.viewModel as? TSDiscoverAnimationItemVM {
+            var images = [UIImage]()
+            for imageNamed in animationModel.imageNameds {
+                if let image = UIImage(named: imageNamed) {
+                    images.append(image)
+                }
+            }
+            comparisonView.images = images
+        }
+    }
+}

+ 139 - 0
TSLiveWallpaper/Business/TSAIListVC/TSEffectPreviewPageVC/TSEffectPreviewVC.swift

@@ -0,0 +1,139 @@
+//
+//  TSEffectPreviewVC.swift
+//  TSLiveWallpaper
+//
+//  Created by 100Years on 2025/8/12.
+//
+
+
+
+class TSEffectPreviewVC: TSBaseVC {
+    
+    var browserPageVC:TSEffectPreviewPageVC
+    public init(dataItems: [Any], startIndex: Int = 0) {
+        browserPageVC = TSEffectPreviewPageVC(dataItems: dataItems, startIndex: startIndex)
+        super.init()
+    }
+    
+    @MainActor required init?(coder: NSCoder) {
+        fatalError("init(coder:) has not been implemented")
+    }
+    
+    lazy var styleBarView: TSEffectPreviewStyleView = {
+        let styleBarView = TSEffectPreviewStyleView()
+        styleBarView.modelArray = browserPageVC.dataItems as! [TSDiscoverItemModel]
+        styleBarView.setSelectedIndex(selectedIndex: browserPageVC.currentIndex, animated: false)
+        styleBarView.selsetedBlock = { [weak self] model,index in
+            guard let self = self else { return }
+            
+            if index == browserPageVC.currentIndex {
+                return
+            }
+            
+            browserPageVC.goToPage(at: index, animated: true)
+        }
+        return styleBarView
+    }()
+    
+    lazy var submitBtn: UIButton = {
+        let submitBtn = kCreateNormalSubmitBtn(title: "Generate".localized) { [weak self]  in
+            guard let self = self else { return }
+            pushUploadPhotoVC()
+        }
+        return submitBtn
+    }()
+    
+    
+    override func createView() {
+        
+        let imageView = UIImageView.createImageView(image: .navShadow,contentMode: .scaleToFill)
+        navBarContentView.addSubview(imageView)
+        imageView.snp.makeConstraints { make in
+            make.edges.equalToSuperview()
+        }
+        
+        addNormalNavBarView()
+        setPageTitle("")
+        contentView.snp.updateConstraints { make in
+            make.top.equalTo(0)
+        }
+        
+        self.addChild(browserPageVC)
+        contentView.addSubview(browserPageVC.view)
+        
+        let bottomShadowImageView = UIImageView.createImageView(image: .bottomShadow,contentMode: .scaleToFill)
+        contentView.addSubview(bottomShadowImageView)
+        bottomShadowImageView.snp.makeConstraints { make in
+            make.bottom.leading.trailing.equalToSuperview()
+            make.height.equalTo(268*kDesignScale)
+        }
+        
+        contentView.addSubview(submitBtn)
+        submitBtn.snp.makeConstraints { make in
+            make.centerX.equalToSuperview()
+            make.width.equalTo(250*kDesignScale)
+            make.height.equalTo(48)
+            make.bottom.equalTo(-12-k_Height_safeAreaInsetsBottom())
+        }
+        
+        contentView.addSubview(styleBarView)
+        styleBarView.snp.makeConstraints { make in
+            make.leading.trailing.equalToSuperview()
+            make.bottom.equalTo(submitBtn.snp.top).offset(-12)
+        }
+        
+    }
+    
+    override func createFrame() {
+        browserPageVC.view.snp.makeConstraints { make in
+            make.edges.equalToSuperview()
+        }
+    }
+    
+    override func dealThings() {
+        browserPageVC.currentIndexChanged = { [weak self] index in
+            guard let self = self else { return }
+            styleBarView.setSelectedIndex(selectedIndex: browserPageVC.currentIndex, animated: true)
+        }
+        
+        NotificationCenter.default.addObserver(self, selector: #selector(updateVipView), name: .kPurchaseDidChanged, object: nil)
+        updateVipView()
+    }
+    
+}
+
+
+extension TSEffectPreviewVC {
+    
+    var currentIndex:Int{
+        return browserPageVC.currentIndex
+    }
+    
+    var currentModel:TSDiscoverItemModel?{
+        if let model = browserPageVC.dataItems.safeObj(At: currentIndex) as? TSDiscoverItemModel{
+            return model
+        }
+        return nil
+    }
+    
+    var generatorStyle:TSGeneratorImageStyle{
+        return currentModel?.style ?? .ptp
+    }
+    
+    @objc func updateVipView() {
+        kMainAsync {
+            kSetBtnVipIcon(btn: self.submitBtn, show: kPurchaseBusiness.generateVipShow(type: self.generatorStyle == .creatVideo ? .generalVideo :.general))
+        }
+    }
+    
+    func pushUploadPhotoVC(){
+        guard let itemModel = currentModel else { return }
+        guard let disCoverItemModels = browserPageVC.dataItems as? [TSDiscoverItemModel] else { return }
+
+        TSAIListVC.enterSelectPhotos(target: self,style: itemModel.style) { images in
+            self.push(TSAIUploadPhotoVC(titleString: itemModel.name,upLoadImage: images.first!, generatorStyle: itemModel.style,disCoverItemModel: itemModel,disCoverItemModels:disCoverItemModels),animated: false) {
+                TSAIListVC.closeSelectPhotos()
+            }
+        }
+    }
+}

+ 267 - 0
TSLiveWallpaper/Business/TSAIListVC/TSEffectPreviewPageVC/View/TSEffectPreviewStyleView.swift

@@ -0,0 +1,267 @@
+//
+//  Untitled.swift
+//  TSLiveWallpaper
+//
+//  Created by 100Years on 2025/8/12.
+//
+
+
+class TSEffectPreviewStyleView : TSBaseView {
+    var selsetedBlock:((TSDiscoverItemModel,Int)->Void)?
+    var modelArray:[TSDiscoverItemModel] = []{
+        didSet{
+            collectionView.reloadData()
+        }
+    }
+    
+    private var selectedIndex:Int = 0
+    
+    lazy var layout: TSBaseCollectionViewFlowLayout = {
+        let layout = TSBaseCollectionViewFlowLayout()
+        layout.scrollDirection = .horizontal
+        layout.itemSize = CGSize(width: 88, height: 116)
+        layout.minimumLineSpacing = 8
+        layout.minimumInteritemSpacing = 8
+        return layout
+    }()
+    lazy var collectionView: TSBaseCollectionView = {
+        let collectionView = TSBaseCollectionView(frame: .zero, collectionViewLayout: layout)
+        collectionView.delegate = self
+        collectionView.dataSource = self
+        collectionView.register(TSEffectPreviewStyleViewBaseCell.self, forCellWithReuseIdentifier: "TSEffectPreviewStyleViewBaseCell")
+        collectionView.register(TSEffectPreviewStyleViewImageCell.self, forCellWithReuseIdentifier: "TSEffectPreviewStyleViewImageCell")
+        collectionView.contentInset = UIEdgeInsets(top: 0, left: 16, bottom: 0, right: 16)
+        return collectionView
+    }()
+
+    override func creatUI() {
+        contentView.addSubview(collectionView)
+        collectionView.snp.makeConstraints { make in
+            make.edges.equalToSuperview()
+            make.height.equalTo(116)
+        }
+    }
+    
+    func setSelectedIndex(selectedIndex:Int,animated:Bool = true){
+        self.selectedIndex = selectedIndex
+        kMainAsync {
+            self.collectionView.selectItem(at: IndexPath(item: self.selectedIndex, section: 0), animated: animated, scrollPosition: .centeredHorizontally)
+        }
+        
+    }
+}
+extension TSEffectPreviewStyleView: UICollectionViewDataSource ,UICollectionViewDelegate {
+    
+    func getReuseIdentifier(itemModel:TSDiscoverItemModel) -> String{
+        if let animationModel = itemModel.viewModel as? TSDiscoverAnimationItemVM {
+//            if animationModel.style == .gif {
+//                return "TSAILIstStyleMoreAnimationGifCell"
+//            }else if animationModel.style == .comparison {
+//                return "TSAILIstStyleMoreComparisonCell"
+//            }else if animationModel.style == .crossDissolve {
+//                return "TSAILIstStyleMoreCrossDissolveCell"
+//            }
+        }
+        return "TSEffectPreviewStyleViewImageCell"
+    }
+    
+    public func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
+        return modelArray.count
+    }
+    
+    public func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
+        if let itemModel = modelArray.safeObj(At: indexPath.row),
+        let cell = collectionView.dequeueReusableCell(withReuseIdentifier: getReuseIdentifier(itemModel: itemModel), for: indexPath) as? TSEffectPreviewStyleViewBaseCell{
+            cell.model = modelArray.safeObj(At: indexPath.row)
+            return cell
+        }
+        return UICollectionViewCell()
+    }
+
+    public func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) {
+        if let model = modelArray.safeObj(At: indexPath.row) {
+            selsetedBlock?(model,indexPath.item)
+            
+            setSelectedIndex(selectedIndex: indexPath.item, animated: true)
+        }
+    }
+}
+
+
+
+class TSEffectPreviewStyleViewBaseCell: TSBaseCollectionCell {
+    var model:TSDiscoverItemModel?
+
+    override var isSelected: Bool{
+        didSet{
+            textLabel.textColor = isSelected ? .themeColor : .white
+            selectedView.isHidden = !isSelected
+        }
+    }
+
+    lazy var ctxView: UIView = {
+        let ctxView = UIView()
+        return ctxView
+    }()
+    
+    lazy var textLabel: UILabel = {
+        let textLabel = UILabel.createLabel(font: .font(size: 11),textColor: .white,textAlignment: .center)
+        return textLabel
+    }()
+
+
+    lazy var selectedView: UIView = {
+        let selectedView = UIView()
+        selectedView.backgroundColor = .black.withAlphaComponent(0.6)
+        selectedView.layer.borderWidth = 1.0
+        selectedView.layer.borderColor = UIColor.themeColor.cgColor
+
+        let imageView = UIImageView.createImageView(imageName:"check_color")
+        selectedView.addSubview(imageView)
+
+        imageView.snp.makeConstraints { make in
+            make.width.height.equalTo(24)
+            make.center.equalToSuperview()
+        }
+        selectedView.isHidden = true
+        return selectedView
+    }()
+
+
+    override func creatUI() {
+        bgContentView.addSubview(ctxView)
+        ctxView.snp.makeConstraints { make in
+            make.top.equalTo(0)
+            make.width.height.equalTo(80)
+            make.centerX.equalToSuperview()
+        }
+        
+        bgContentView.addSubview(selectedView)
+        selectedView.snp.makeConstraints { make in
+            make.top.equalTo(0)
+            make.width.height.equalTo(80)
+            make.centerX.equalToSuperview()
+        }
+        
+        bgContentView.addSubview(textLabel)
+        textLabel.snp.makeConstraints { make in
+            make.top.equalTo(ctxView.snp.bottom).offset(2)
+            make.bottom.equalTo(0)
+            make.leading.equalTo(4)
+            make.trailing.equalTo(-4)
+        }
+    }
+}
+    
+class TSEffectPreviewStyleViewImageCell: TSEffectPreviewStyleViewBaseCell {
+    override var model:TSDiscoverItemModel? {
+        didSet {
+            guard let model = model else { return }
+            textLabel.text = model.name
+            showImageView.image = UIImage(named: model.generateModel?.imageName ?? "")
+        }
+    }
+    
+    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()
+        }
+    }
+}
+    
+    
+//class TSEffectPreviewStyleViewImageCell: TSEffectPreviewStyleViewBaseCell {
+//    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)")
+//                        }
+//                    }
+//                }
+//            }
+//        }
+//    }
+//    
+//    override var isSelected: Bool{
+//        didSet{
+//            textLabel.textColor = isSelected ? .themeColor : .white
+//            selectedView.isHidden = !isSelected
+//        }
+//    }
+//
+//    lazy var animatedImageView: AnimatedImageView = {
+//        let animatedImageView = AnimatedImageView()
+//        animatedImageView.autoPlayAnimatedImage = false
+//        animatedImageView.repeatCount = .infinite
+//        animatedImageView.contentMode = .scaleAspectFill
+//        animatedImageView.clipsToBounds = true
+//        return animatedImageView
+//    }()
+//    
+//    lazy var textLabel: UILabel = {
+//        let textLabel = UILabel.createLabel(font: .font(size: 11),textColor: .white,textAlignment: .center)
+//        return textLabel
+//    }()
+//    
+//    
+//    lazy var selectedView: UIView = {
+//        let selectedView = UIView()
+//        selectedView.backgroundColor = .black.withAlphaComponent(0.6)
+//        selectedView.layer.borderWidth = 1.0
+//        selectedView.layer.borderColor = UIColor.themeColor.cgColor
+//        
+//        let imageView = UIImageView.createImageView(imageName:"check_color")
+//        selectedView.addSubview(imageView)
+//        
+//        imageView.snp.makeConstraints { make in
+//            make.width.height.equalTo(24)
+//            make.center.equalToSuperview()
+//        }
+//        selectedView.isHidden = true
+//        return selectedView
+//    }()
+//
+//
+//    override func creatUI() {
+//        bgContentView.addSubview(animatedImageView)
+//        animatedImageView.snp.makeConstraints { make in
+//            make.top.equalTo(0)
+//            make.width.height.equalTo(80)
+//            make.centerX.equalToSuperview()
+//        }
+//        
+//        animatedImageView.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.bottom.equalTo(0)
+//            make.leading.equalTo(4)
+//            make.trailing.equalTo(-4)
+//        }
+//        
+//        
+//        
+//        
+//    }
+//}

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

@@ -134,7 +134,7 @@ class TSSelectedPhotoStyleCell: TSSimpleTableViewCell {
     }()
     
     lazy var leftLab: UILabel = {
-        return UILabel.createLabel(font: .font(name:.ZillaSlab,size: 16),textColor: .white)
+        return UILabel.createLabel(font: .font(name:.ZillaSlab,size: 14,weight: .bold),textColor: .white)
     }()
 
     override var itemModel:TSBasicItemModel{
@@ -155,7 +155,7 @@ class TSSelectedPhotoStyleCell: TSSimpleTableViewCell {
         leftImageView.snp.makeConstraints { make in
             make.leading.equalTo(16)
             make.centerY.equalToSuperview()
-            make.width.height.equalTo(24)
+            make.width.height.equalTo(28)
         }
         
         leftLab.snp.makeConstraints { make in

+ 84 - 15
TSLiveWallpaper/Common/ViewTool/TSPhotoPickerManager/TSPhotoPickerManager.swift

@@ -124,32 +124,55 @@ class TSPhotoPickerManager: NSObject{
 //                viewController?.present(picker, animated: true, completion: nil)
 //                picker.reloadAlbumData()
 //                self.picker = picker
-                openPhotoPicker()//系统的相册
+                openPhotoPicker(selectionLimit: maxSelected)//系统的相册
             } else {
                 self.showPermissionAlert()
             }
         }
     }
     
-    /// 打开照片选择器
-    private var imagePicker:UIImagePickerController?
-    private func openPhotoPicker() {
+    /// 打开系统照片选择器
+//    private var imagePicker:UIImagePickerController?
+//    private func openPhotoPicker() {
+//        TSToastShared.showLoading(containerView: viewController?.view)
+//        let imagePicker = UIImagePickerController()
+//        imagePicker.sourceType = .photoLibrary
+//        imagePicker.delegate = self
+//        imagePicker.mediaTypes = ["public.image"] // 只选择照片
+//        if #available(iOS 13.0, *) {
+//            imagePicker.overrideUserInterfaceStyle = .dark
+//        }
+//        
+//        DispatchQueue.main.async {
+//            self.viewController?.present(imagePicker, animated: true) {
+//                TSToastShared.hideLoading()
+//            }
+//            self.imagePicker = imagePicker
+//        }
+//    }
+    
+    // 打开系统照片选择器
+    private var imagePicker:PHPickerViewController?
+    private func openPhotoPicker(selectionLimit:Int = 1) {
         TSToastShared.showLoading(containerView: viewController?.view)
-        let imagePicker = UIImagePickerController()
-        imagePicker.sourceType = .photoLibrary
-        imagePicker.delegate = self
-        imagePicker.mediaTypes = ["public.image"] // 只选择照片
-//        imagePicker.modalPresentationStyle = .custom
-//        imagePicker.modalTransitionStyle = .crossDissolve
-        if #available(iOS 13.0, *) {
-            imagePicker.overrideUserInterfaceStyle = .dark
-        }
-        viewController?.present(imagePicker, animated: true) {
+        
+        var configuration = PHPickerConfiguration()
+          configuration.selectionLimit = selectionLimit
+          configuration.filter = .images
+          
+          let picker = PHPickerViewController(configuration: configuration)
+          picker.delegate = self
+          
+          if #available(iOS 13.0, *) {
+              picker.overrideUserInterfaceStyle = .dark
+          }
+          
+        viewController?.present(picker, animated: true){
             TSToastShared.hideLoading()
         }
-        self.imagePicker = imagePicker
     }
     
+    
     var cameraController:CameraController?
     func pickCameraPhoto(maxSelected:Int = 1,completion: @escaping ([UIImage]) -> Void) {
         self.completionHandler = completion
@@ -407,3 +430,49 @@ extension Notification.Name {
     static let kPhotoPickerCompleted = Notification.Name("kPhotoPickerCompleted") //选择照片完成
 }
 
+extension TSPhotoPickerManager: PHPickerViewControllerDelegate {
+    func picker(_ picker: PHPickerViewController, didFinishPicking results: [PHPickerResult]) {
+        
+        if results.isEmpty {//用户点击了取消
+            picker.dismiss(animated: true, completion: nil)
+            return
+        }
+        
+        // 创建一个调度组来跟踪所有图片加载完成
+         let group = DispatchGroup()
+         var selectedImages = [UIImage]()
+         var errors = [Error]()
+        
+        for result in results {
+            group.enter()
+            result.itemProvider.loadObject(ofClass: UIImage.self) { (object, error) in// 加载每张图片
+                if let image = object as? UIImage {
+                    DispatchQueue.main.async {
+                        selectedImages.append(image)
+                    }
+                } else if let error = error {
+                    errors.append(error)
+                }
+                group.leave()
+            }
+        }
+        
+        // 所有图片加载完成后执行
+        group.notify(queue: .main) { [weak self] in
+            guard let self = self else { return }
+            
+            if !errors.isEmpty {
+                print("加载图片时发生错误: \(errors)")
+            }
+            
+            if selectedImages.isEmpty {
+                completionHandler?([])
+            }else{
+                completionHandler?(selectedImages)
+                saveImagesToUsed(images:selectedImages)
+            }
+            
+            picker.dismiss(animated: true, completion: nil)
+        }
+    }
+}

+ 10 - 0
TSLiveWallpaper/ar.lproj/Localizable.strings

@@ -221,3 +221,13 @@
 "No creation yet. Your creations will be listed here" = "لا يوجد أي إبداع بعد. سيتم إدراج إبداعاتك هنا.";
 "You haven’t used any photos yet." = "لم تستخدم أي صور بعد.";
 "Restore" = "يعيد";
+
+"Anime" = "أنيمي";
+"Polaroid" = "بولارويد";
+"Emoji" = "الرموز التعبيرية";
+"Pix 3D" = "بيكسار ثلاثي الأبعاد";
+"90s Anime" = "أنمي قديم";
+"Action Figure" = "شخصية الحركة";
+"Plush Toy" = "لعبة قطيفة";
+"Music Box" = "صندوق الموسيقى";
+"Photo Filter" = "فلتر الصور";

+ 10 - 0
TSLiveWallpaper/de.lproj/Localizable.strings

@@ -212,3 +212,13 @@
 "No creation yet. Your creations will be listed here" = "Noch keine Kreation. Deine Kreationen werden hier aufgelistet";
 "You haven’t used any photos yet." = "Sie haben noch keine Fotos verwendet.";
 "Restore" = "Wiederherstellen";
+
+"Anime" = "Anime";
+"Polaroid" = "Polaroid";
+"Emoji" = "Emoji";
+"Pix 3D" = "Pixar 3D";
+"90s Anime" = "Retro-Anime";
+"Action Figure" = "Actionfigur";
+"Plush Toy" = "Plüschtier";
+"Music Box" = "Spieluhr";
+"Photo Filter" = "Foto filter";

+ 10 - 0
TSLiveWallpaper/en.lproj/Localizable.strings

@@ -221,3 +221,13 @@
 "No creation yet. Your creations will be listed here" = "No creation yet. Your creations will be listed here";
 "You haven’t used any photos yet." = "You haven’t used any photos yet.";
 "Restore" = "Restore";
+
+"Anime" = "Anime";
+"Polaroid" = "Polaroid";
+"Emoji" = "Emoji";
+"Pix 3D" = "Pix 3D";
+"90s Anime" = "90s Anime";
+"Action Figure" = "Action Figure";
+"Plush Toy" = "Plush Toy";
+"Music Box" = "Music Box";
+"Photo Filter" = "Photo Filter";

+ 10 - 0
TSLiveWallpaper/es.lproj/Localizable.strings

@@ -225,3 +225,13 @@
 "No creation yet. Your creations will be listed here" = "Aún no hay creación. Tus creaciones se listarán aquí.";
 "You haven’t used any photos yet." = "Aún no has utilizado ninguna fotografía";
 "Restore" = "Restaurar";
+
+"Anime" = "Anime";
+"Polaroid" = "Polaroid";
+"Emoji" = "Emoji";
+"Pix 3D" = "Pixar 3D";
+"90s Anime" = "Anime retro";
+"Action Figure" = "Figura de acción";
+"Plush Toy" = "Juguete de peluche";
+"Music Box" = "Caja de música";
+"Photo Filter" = "Filtro de fotos";

+ 10 - 0
TSLiveWallpaper/fr.lproj/Localizable.strings

@@ -213,3 +213,13 @@
 "No creation yet. Your creations will be listed here" = "Aucune création pour le moment. Vos créations seront listées ici.";
 "You haven’t used any photos yet." = "Vous n’avez pas encore utilisé de photos.";
 "Restore" = "Restaurer";
+
+"Anime" = "Anime";
+"Polaroid" = "Polaroïd";
+"Emoji" = "Émoji";
+"Pix 3D" = "Pixar 3D";
+"90s Anime" = "Anime rétro";
+"Action Figure" = "Figurine d'action";
+"Plush Toy" = "Jouet en peluche";
+"Music Box" = "Boîte à musique";
+"Photo Filter" = "Filtre photo";

+ 10 - 0
TSLiveWallpaper/it.lproj/Localizable.strings

@@ -222,3 +222,13 @@
 "No creation yet. Your creations will be listed here" = "Nessuna creazione ancora. Le tue creazioni saranno elencate qui";
 "You haven’t used any photos yet." = "Non hai ancora utilizzato alcuna foto.";
 "Restore" = "Ripristinare";
+
+"Anime" = "Anime";
+"Polaroid" = "Polaroid";
+"Emoji" = "Emoji";
+"Pix 3D" = "Pixar 3D";
+"90s Anime" = "Anime retrò";
+"Action Figure" = "Figura d'azione";
+"Plush Toy" = "Peluche";
+"Music Box" = "Carillon";
+"Photo Filter" = "Filtro fotografico";

+ 10 - 0
TSLiveWallpaper/ja.lproj/Localizable.strings

@@ -219,3 +219,13 @@
 "No creation yet. Your creations will be listed here" = "まだ作品はありません。あなたの作品はここに表示されます";
 "You haven’t used any photos yet." = "まだ写真を使用していません。";
 "Restore" = "復元する";
+
+"Anime" = "アニメ";
+"Polaroid" = "ポラロイド";
+"Emoji" = "絵文字";
+"Pix 3D" = "ピクサー 3D";
+"90s Anime" = "レトロアニメ";
+"Action Figure" = "アクションフィギュア";
+"Plush Toy" = "ぬいぐるみ";
+"Music Box" = "オルゴール";
+"Photo Filter" = "写真フィルター";

+ 10 - 0
TSLiveWallpaper/ko.lproj/Localizable.strings

@@ -219,3 +219,13 @@
 "No creation yet. Your creations will be listed here" = "아직 만든 것이 없습니다. 만든 것이 여기에 나열됩니다.";
 "You haven’t used any photos yet." = "아직 사진을 사용하지 않았습니다.";
 "Restore" = "복원하다";
+
+"Anime" = "일본 만화 영화";
+"Polaroid" = "폴라로이드";
+"Emoji" = "이모티콘";
+"Pix 3D" = "픽사 3D";
+"90s Anime" = "레트로 애니메이션";
+"Action Figure" = "액션 피규어";
+"Plush Toy" = "봉제 장난감";
+"Music Box" = "오르골";
+"Photo Filter" = "사진 필터";

+ 10 - 0
TSLiveWallpaper/pt-BR.lproj/Localizable.strings

@@ -213,3 +213,13 @@
 "No creation yet. Your creations will be listed here" = "Nenhuma criação ainda. Suas criações serão listadas aqui.";
 "You haven’t used any photos yet." = "Você ainda não usou nenhuma foto.";
 "Restore" = "Restaurar";
+
+"Anime" = "Anime";
+"Polaroid" = "Polaroid";
+"Emoji" = "Emoji";
+"Pix 3D" = "Pixar 3D";
+"90s Anime" = "Anime retrô";
+"Action Figure" = "Boneco de ação";
+"Plush Toy" = "Brinquedo de pelúcia";
+"Music Box" = "Caixa de música";
+"Photo Filter" = "Filtro de fotos";

+ 10 - 0
TSLiveWallpaper/pt-PT.lproj/Localizable.strings

@@ -213,3 +213,13 @@
 "No creation yet. Your creations will be listed here" = "Nenhuma criação ainda. Suas criações serão listadas aqui.";
 "You haven’t used any photos yet." = "Você ainda não usou nenhuma foto.";
 "Restore" = "Restaurar";
+
+"Anime" = "Anime";
+"Polaroid" = "Polaroid";
+"Emoji" = "Emoji";
+"Pix 3D" = "Pixar 3D";
+"90s Anime" = "Anime retrô";
+"Action Figure" = "Boneco de ação";
+"Plush Toy" = "Brinquedo de pelúcia";
+"Music Box" = "Caixa de música";
+"Photo Filter" = "Filtro de fotos";

+ 10 - 0
TSLiveWallpaper/zh-Hant.lproj/Localizable.strings

@@ -219,3 +219,13 @@
 "No creation yet. Your creations will be listed here" = "尚未創作。您的作品將在此列出";
 "You haven’t used any photos yet." = "您尚未使用任何照片。";
 "Restore" = "恢復";
+
+"Anime" = "日本卡通";
+"Polaroid" = "拍立得";
+"Emoji" = "表情符號";
+"Pix 3D" = "皮克斯 3D";
+"90s Anime" = "復古動漫";
+"Action Figure" = "手辦模型";
+"Plush Toy" = "絨毛玩具";
+"Music Box" = "音樂盒";
+"Photo Filter" = "照片濾鏡";