소스 검색

feat:3.6.8(3) 消除照片提测

100Years 1 개월 전
부모
커밋
7a509c88ce
71개의 변경된 파일1257개의 추가작업 그리고 210개의 파일을 삭제
  1. 26 6
      TSLiveWallpaper.xcodeproj/project.pbxproj
  2. 16 0
      TSLiveWallpaper/AppDelegate.swift
  3. 6 0
      TSLiveWallpaper/Assets.xcassets/AIList/remove/Contents.json
  4. 22 0
      TSLiveWallpaper/Assets.xcassets/AIList/remove/ai_remove_back.imageset/Contents.json
  5. BIN
      TSLiveWallpaper/Assets.xcassets/AIList/remove/ai_remove_back.imageset/ai_remove_back@2x.png
  6. BIN
      TSLiveWallpaper/Assets.xcassets/AIList/remove/ai_remove_back.imageset/ai_remove_back@3x.png
  7. 22 0
      TSLiveWallpaper/Assets.xcassets/AIList/remove/ai_remove_clear.imageset/Contents.json
  8. BIN
      TSLiveWallpaper/Assets.xcassets/AIList/remove/ai_remove_clear.imageset/ai_remove_clear@2x.png
  9. BIN
      TSLiveWallpaper/Assets.xcassets/AIList/remove/ai_remove_clear.imageset/ai_remove_clear@3x.png
  10. 22 0
      TSLiveWallpaper/Assets.xcassets/AIList/remove/ai_remove_go.imageset/Contents.json
  11. BIN
      TSLiveWallpaper/Assets.xcassets/AIList/remove/ai_remove_go.imageset/ai_remove_go@2x.png
  12. BIN
      TSLiveWallpaper/Assets.xcassets/AIList/remove/ai_remove_go.imageset/ai_remove_go@3x.png
  13. 22 0
      TSLiveWallpaper/Assets.xcassets/AIList/remove/ai_remove_pen.imageset/Contents.json
  14. BIN
      TSLiveWallpaper/Assets.xcassets/AIList/remove/ai_remove_pen.imageset/ai_remove_pen@2x.png
  15. BIN
      TSLiveWallpaper/Assets.xcassets/AIList/remove/ai_remove_pen.imageset/ai_remove_pen@3x.png
  16. 22 0
      TSLiveWallpaper/Assets.xcassets/AIList/share.imageset/Contents.json
  17. BIN
      TSLiveWallpaper/Assets.xcassets/AIList/share.imageset/share@2x.png
  18. BIN
      TSLiveWallpaper/Assets.xcassets/AIList/share.imageset/share@3x.png
  19. BIN
      TSLiveWallpaper/Assets.xcassets/AIList/video_pause.imageset/video_pause@2x.png
  20. BIN
      TSLiveWallpaper/Assets.xcassets/AIList/video_pause.imageset/video_pause@3x.png
  21. BIN
      TSLiveWallpaper/Assets.xcassets/AppIcon.appiconset/icon-1024.png
  22. BIN
      TSLiveWallpaper/Assets.xcassets/AppIcon.appiconset/icon-20@2x.png
  23. BIN
      TSLiveWallpaper/Assets.xcassets/AppIcon.appiconset/icon-20@3x.png
  24. BIN
      TSLiveWallpaper/Assets.xcassets/AppIcon.appiconset/icon-29@2x.png
  25. BIN
      TSLiveWallpaper/Assets.xcassets/AppIcon.appiconset/icon-29@3x.png
  26. BIN
      TSLiveWallpaper/Assets.xcassets/AppIcon.appiconset/icon-38@2x.png
  27. BIN
      TSLiveWallpaper/Assets.xcassets/AppIcon.appiconset/icon-38@3x.png
  28. BIN
      TSLiveWallpaper/Assets.xcassets/AppIcon.appiconset/icon-40@2x.png
  29. BIN
      TSLiveWallpaper/Assets.xcassets/AppIcon.appiconset/icon-40@3x.png
  30. BIN
      TSLiveWallpaper/Assets.xcassets/AppIcon.appiconset/icon-60@2x.png
  31. BIN
      TSLiveWallpaper/Assets.xcassets/AppIcon.appiconset/icon-60@3x.png
  32. BIN
      TSLiveWallpaper/Assets.xcassets/AppIcon.appiconset/icon-64@2x.png
  33. BIN
      TSLiveWallpaper/Assets.xcassets/AppIcon.appiconset/icon-64@3x.png
  34. BIN
      TSLiveWallpaper/Assets.xcassets/AppIcon.appiconset/icon-68@2x.png
  35. BIN
      TSLiveWallpaper/Assets.xcassets/AppIcon.appiconset/icon-76@2x.png
  36. BIN
      TSLiveWallpaper/Assets.xcassets/AppIcon.appiconset/icon-83.5@2x.png
  37. 2 2
      TSLiveWallpaper/Base.lproj/LaunchScreen.storyboard
  38. 1 1
      TSLiveWallpaper/Business/TSAIListVC/TSAIList+Enmu.swift
  39. 6 6
      TSLiveWallpaper/Business/TSAIListVC/TSAIListHistoryVC/View/TSAIListHistoryCell.swift
  40. 5 2
      TSLiveWallpaper/Business/TSAIListVC/TSAIListHistoryVC/View/TSGennerateCellView.swift
  41. 23 14
      TSLiveWallpaper/Business/TSAIListVC/TSAIListVC/TSAIListVC.swift
  42. 1 0
      TSLiveWallpaper/Business/TSAIListVC/TSAIListVC/VM/TSAIListDataModel.swift
  43. 13 1
      TSLiveWallpaper/Business/TSAIListVC/TSAIListVC/VM/TSAIListDataVM+Dic.swift
  44. 35 17
      TSLiveWallpaper/Business/TSAIListVC/TSAIListVC/VM/TSAIListDataVM.swift
  45. 3 3
      TSLiveWallpaper/Business/TSAIListVC/TSAIListVC/View/TSAILIstFullCardCell.swift
  46. 27 4
      TSLiveWallpaper/Business/TSAIListVC/TSAIListVC/View/TSAILIstStyleMoreCell.swift
  47. 41 3
      TSLiveWallpaper/Business/TSAIListVC/TSAIPhotoDetailsVC/TSAIPhotoDetailsBrowserVC.swift
  48. 13 0
      TSLiveWallpaper/Business/TSAIListVC/TSAIPhotoDetailsVC/TSAIPhotoDetailsVC/TSAIPhotoDetailsVC+View.swift
  49. 32 5
      TSLiveWallpaper/Business/TSAIListVC/TSAIPhotoDetailsVC/TSAIPhotoDetailsVC/TSAIPhotoDetailsVC.swift
  50. 2 1
      TSLiveWallpaper/Business/TSAIListVC/TSAIPhotoGeneratorVC/Model/TSAIListPhotoGeneratorModel.swift
  51. 486 0
      TSLiveWallpaper/Business/TSAIListVC/TSAIUploadPhotoVC/TSAIRemovePhotlVC/TSAIRemovePhotlVC.swift
  52. 34 0
      TSLiveWallpaper/Business/TSAIListVC/TSAIUploadPhotoVC/TSAIUploadPhotoVC+Remove.swift
  53. 0 12
      TSLiveWallpaper/Business/TSAIListVC/TSAIUploadPhotoVC/TSAIUploadPhotoVC+View.swift
  54. 55 31
      TSLiveWallpaper/Business/TSAIListVC/TSAIUploadPhotoVC/TSAIUploadPhotoVC.swift
  55. 12 2
      TSLiveWallpaper/Business/TSAIListVC/TSAIUploadPhotoVC/View/TSAIUploadPhotoTextView.swift
  56. 46 0
      TSLiveWallpaper/Common/Ex/UIView+Ex.swift
  57. 5 21
      TSLiveWallpaper/Common/TSNetWork/TSNetWork+Business.swift
  58. 59 0
      TSLiveWallpaper/Common/Tool/TSCommonTool/TSCommonTool.swift
  59. 5 4
      TSLiveWallpaper/Data/Model/TSActionInfoModel.swift
  60. 108 72
      TSLiveWallpaper/Data/OperationQueue/TSGenerateBaseOperation/TSGenerateBasePhotoOperation.swift
  61. 10 1
      TSLiveWallpaper/Data/TSDBManager/TSDBActionInfoModel.swift
  62. 2 1
      TSLiveWallpaper/Data/TSRealmManager/TSRealmManager.swift
  63. 1 1
      TSLiveWallpaper/LaunchVC/TSLaunchVC.swift
  64. 12 0
      TSLiveWallpaper/ar.lproj/Localizable.strings
  65. 12 0
      TSLiveWallpaper/en.lproj/Localizable.strings
  66. 12 0
      TSLiveWallpaper/es.lproj/Localizable.strings
  67. 12 0
      TSLiveWallpaper/ja.lproj/Localizable.strings
  68. 12 0
      TSLiveWallpaper/ko.lproj/Localizable.strings
  69. BIN
      TSLiveWallpaper/launch3.png
  70. BIN
      TSLiveWallpaper/launch4.png
  71. 12 0
      TSLiveWallpaper/zh-Hant.lproj/Localizable.strings

+ 26 - 6
TSLiveWallpaper.xcodeproj/project.pbxproj

@@ -74,6 +74,10 @@
 		A83F28A42E165043009A4975 /* aiList_Kiss.gif in Resources */ = {isa = PBXBuildFile; fileRef = A83F289B2E165043009A4975 /* aiList_Kiss.gif */; };
 		A83F28A42E165043009A4975 /* aiList_Kiss.gif in Resources */ = {isa = PBXBuildFile; fileRef = A83F289B2E165043009A4975 /* aiList_Kiss.gif */; };
 		A83F28A52E165043009A4975 /* aiList_Stroll.gif in Resources */ = {isa = PBXBuildFile; fileRef = A83F289E2E165043009A4975 /* aiList_Stroll.gif */; };
 		A83F28A52E165043009A4975 /* aiList_Stroll.gif in Resources */ = {isa = PBXBuildFile; fileRef = A83F289E2E165043009A4975 /* aiList_Stroll.gif */; };
 		A83F28A62E165043009A4975 /* aiList_ForeheadKiss.gif in Resources */ = {isa = PBXBuildFile; fileRef = A83F28982E165043009A4975 /* aiList_ForeheadKiss.gif */; };
 		A83F28A62E165043009A4975 /* aiList_ForeheadKiss.gif in Resources */ = {isa = PBXBuildFile; fileRef = A83F28982E165043009A4975 /* aiList_ForeheadKiss.gif */; };
+		A83F28A92E165B1D009A4975 /* TSAIUploadPhotoVC+Remove.swift in Sources */ = {isa = PBXBuildFile; fileRef = A83F28A82E165B17009A4975 /* TSAIUploadPhotoVC+Remove.swift */; };
+		A83F28AB2E165C0A009A4975 /* launch4.png in Resources */ = {isa = PBXBuildFile; fileRef = A83F28AA2E165C0A009A4975 /* launch4.png */; };
+		A83F28AE2E166391009A4975 /* TSAIRemovePhotlVC.swift in Sources */ = {isa = PBXBuildFile; fileRef = A83F28AD2E166390009A4975 /* TSAIRemovePhotlVC.swift */; };
+		A83F28B02E168237009A4975 /* UIView+Ex.swift in Sources */ = {isa = PBXBuildFile; fileRef = A83F28AF2E168232009A4975 /* UIView+Ex.swift */; };
 		A8477C972D22737900DF0B93 /* TSBusinessWebVC.swift in Sources */ = {isa = PBXBuildFile; fileRef = A8477C962D22737800DF0B93 /* TSBusinessWebVC.swift */; };
 		A8477C972D22737900DF0B93 /* TSBusinessWebVC.swift in Sources */ = {isa = PBXBuildFile; fileRef = A8477C962D22737800DF0B93 /* TSBusinessWebVC.swift */; };
 		A8477C9F2D22ABDA00DF0B93 /* TSEditLiveEidtCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = A8477C9E2D22ABD500DF0B93 /* TSEditLiveEidtCell.swift */; };
 		A8477C9F2D22ABDA00DF0B93 /* TSEditLiveEidtCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = A8477C9E2D22ABD500DF0B93 /* TSEditLiveEidtCell.swift */; };
 		A84C239A2D1E3A4300B61B55 /* GPVideoPlayerView.swift in Sources */ = {isa = PBXBuildFile; fileRef = A84C23962D1E3A4300B61B55 /* GPVideoPlayerView.swift */; };
 		A84C239A2D1E3A4300B61B55 /* GPVideoPlayerView.swift in Sources */ = {isa = PBXBuildFile; fileRef = A84C23962D1E3A4300B61B55 /* GPVideoPlayerView.swift */; };
@@ -136,7 +140,6 @@
 		A8E56BF92D1520EC003C54AF /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = A8E56BED2D1520EC003C54AF /* Assets.xcassets */; };
 		A8E56BF92D1520EC003C54AF /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = A8E56BED2D1520EC003C54AF /* Assets.xcassets */; };
 		A8E56BFB2D1520EC003C54AF /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = A8E56BF02D1520EC003C54AF /* LaunchScreen.storyboard */; };
 		A8E56BFB2D1520EC003C54AF /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = A8E56BF02D1520EC003C54AF /* LaunchScreen.storyboard */; };
 		A8E590392DFFAE4400C2533F /* TSBootVC.swift in Sources */ = {isa = PBXBuildFile; fileRef = A8E590382DFFAE4400C2533F /* TSBootVC.swift */; };
 		A8E590392DFFAE4400C2533F /* TSBootVC.swift in Sources */ = {isa = PBXBuildFile; fileRef = A8E590382DFFAE4400C2533F /* TSBootVC.swift */; };
-		A8EB383E2E13B75C002F90E9 /* launch3.png in Resources */ = {isa = PBXBuildFile; fileRef = A8EB383D2E13B75C002F90E9 /* launch3.png */; };
 		A8EE92C02DFFC3B50077DFFD /* TSImageProComparisonView.swift in Sources */ = {isa = PBXBuildFile; fileRef = A8EE92BF2DFFC39C0077DFFD /* TSImageProComparisonView.swift */; };
 		A8EE92C02DFFC3B50077DFFD /* TSImageProComparisonView.swift in Sources */ = {isa = PBXBuildFile; fileRef = A8EE92BF2DFFC39C0077DFFD /* TSImageProComparisonView.swift */; };
 		A8EE92C22DFFC54C0077DFFD /* TSBootModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = A8EE92C12DFFC54A0077DFFD /* TSBootModel.swift */; };
 		A8EE92C22DFFC54C0077DFFD /* TSBootModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = A8EE92C12DFFC54A0077DFFD /* TSBootModel.swift */; };
 		A8EE92C42DFFC5830077DFFD /* TSBootCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = A8EE92C32DFFC5820077DFFD /* TSBootCell.swift */; };
 		A8EE92C42DFFC5830077DFFD /* TSBootCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = A8EE92C32DFFC5820077DFFD /* TSBootCell.swift */; };
@@ -247,6 +250,10 @@
 		A83F289C2E165043009A4975 /* aiList_SayHi.gif */ = {isa = PBXFileReference; lastKnownFileType = image.gif; path = aiList_SayHi.gif; sourceTree = "<group>"; };
 		A83F289C2E165043009A4975 /* aiList_SayHi.gif */ = {isa = PBXFileReference; lastKnownFileType = image.gif; path = aiList_SayHi.gif; sourceTree = "<group>"; };
 		A83F289D2E165043009A4975 /* aiList_Smile.gif */ = {isa = PBXFileReference; lastKnownFileType = image.gif; path = aiList_Smile.gif; sourceTree = "<group>"; };
 		A83F289D2E165043009A4975 /* aiList_Smile.gif */ = {isa = PBXFileReference; lastKnownFileType = image.gif; path = aiList_Smile.gif; sourceTree = "<group>"; };
 		A83F289E2E165043009A4975 /* aiList_Stroll.gif */ = {isa = PBXFileReference; lastKnownFileType = image.gif; path = aiList_Stroll.gif; sourceTree = "<group>"; };
 		A83F289E2E165043009A4975 /* aiList_Stroll.gif */ = {isa = PBXFileReference; lastKnownFileType = image.gif; path = aiList_Stroll.gif; sourceTree = "<group>"; };
+		A83F28A82E165B17009A4975 /* TSAIUploadPhotoVC+Remove.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "TSAIUploadPhotoVC+Remove.swift"; sourceTree = "<group>"; };
+		A83F28AA2E165C0A009A4975 /* launch4.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = launch4.png; sourceTree = "<group>"; };
+		A83F28AD2E166390009A4975 /* TSAIRemovePhotlVC.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TSAIRemovePhotlVC.swift; sourceTree = "<group>"; };
+		A83F28AF2E168232009A4975 /* UIView+Ex.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "UIView+Ex.swift"; sourceTree = "<group>"; };
 		A8477C962D22737800DF0B93 /* TSBusinessWebVC.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TSBusinessWebVC.swift; sourceTree = "<group>"; };
 		A8477C962D22737800DF0B93 /* TSBusinessWebVC.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TSBusinessWebVC.swift; sourceTree = "<group>"; };
 		A8477C9E2D22ABD500DF0B93 /* TSEditLiveEidtCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TSEditLiveEidtCell.swift; sourceTree = "<group>"; };
 		A8477C9E2D22ABD500DF0B93 /* TSEditLiveEidtCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TSEditLiveEidtCell.swift; sourceTree = "<group>"; };
 		A84C23952D1E3A4300B61B55 /* GPVideoConfigMaker.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = GPVideoConfigMaker.swift; sourceTree = "<group>"; };
 		A84C23952D1E3A4300B61B55 /* GPVideoConfigMaker.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = GPVideoConfigMaker.swift; sourceTree = "<group>"; };
@@ -320,7 +327,6 @@
 		A8E56BEE2D1520EC003C54AF /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = "<group>"; };
 		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>"; };
 		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>"; };
 		A8E590382DFFAE4400C2533F /* TSBootVC.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TSBootVC.swift; sourceTree = "<group>"; };
-		A8EB383D2E13B75C002F90E9 /* launch3.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = launch3.png; sourceTree = "<group>"; };
 		A8EE92BF2DFFC39C0077DFFD /* TSImageProComparisonView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TSImageProComparisonView.swift; sourceTree = "<group>"; };
 		A8EE92BF2DFFC39C0077DFFD /* TSImageProComparisonView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TSImageProComparisonView.swift; sourceTree = "<group>"; };
 		A8EE92C12DFFC54A0077DFFD /* TSBootModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TSBootModel.swift; sourceTree = "<group>"; };
 		A8EE92C12DFFC54A0077DFFD /* TSBootModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TSBootModel.swift; sourceTree = "<group>"; };
 		A8EE92C32DFFC5820077DFFD /* TSBootCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TSBootCell.swift; sourceTree = "<group>"; };
 		A8EE92C32DFFC5820077DFFD /* TSBootCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TSBootCell.swift; sourceTree = "<group>"; };
@@ -459,6 +465,7 @@
 		A81CA4752D15778800A3AAC8 /* Ex */ = {
 		A81CA4752D15778800A3AAC8 /* Ex */ = {
 			isa = PBXGroup;
 			isa = PBXGroup;
 			children = (
 			children = (
+				A83F28AF2E168232009A4975 /* UIView+Ex.swift */,
 				A86857C32DF92AE30089D222 /* UIFont+Ex.swift */,
 				A86857C32DF92AE30089D222 /* UIFont+Ex.swift */,
 				A81F5B4E2D19673500740085 /* AVAsset+Ex.swift */,
 				A81F5B4E2D19673500740085 /* AVAsset+Ex.swift */,
 				A81CA4B72D16A6B600A3AAC8 /* View+Ex.swift */,
 				A81CA4B72D16A6B600A3AAC8 /* View+Ex.swift */,
@@ -743,6 +750,14 @@
 			path = Gif;
 			path = Gif;
 			sourceTree = "<group>";
 			sourceTree = "<group>";
 		};
 		};
+		A83F28AC2E166378009A4975 /* TSAIRemovePhotlVC */ = {
+			isa = PBXGroup;
+			children = (
+				A83F28AD2E166390009A4975 /* TSAIRemovePhotlVC.swift */,
+			);
+			path = TSAIRemovePhotlVC;
+			sourceTree = "<group>";
+		};
 		A8477C952D2272FB00DF0B93 /* TSBusinessWebVC */ = {
 		A8477C952D2272FB00DF0B93 /* TSBusinessWebVC */ = {
 			isa = PBXGroup;
 			isa = PBXGroup;
 			children = (
 			children = (
@@ -911,11 +926,13 @@
 		A86857B62DF9258D0089D222 /* TSAIUploadPhotoVC */ = {
 		A86857B62DF9258D0089D222 /* TSAIUploadPhotoVC */ = {
 			isa = PBXGroup;
 			isa = PBXGroup;
 			children = (
 			children = (
+				A83F28AC2E166378009A4975 /* TSAIRemovePhotlVC */,
 				A8F8BCCD2E03F88700EF4AA6 /* View */,
 				A8F8BCCD2E03F88700EF4AA6 /* View */,
 				A86857B52DF9258D0089D222 /* TSAIUploadPhotoVC.swift */,
 				A86857B52DF9258D0089D222 /* TSAIUploadPhotoVC.swift */,
 				A8F8BCD42E03FE4C00EF4AA6 /* TSAIUploadPhotoVC+View.swift */,
 				A8F8BCD42E03FE4C00EF4AA6 /* TSAIUploadPhotoVC+View.swift */,
 				A8F8BCD02E03FC4E00EF4AA6 /* TSAIUploadPhotoVC+Image.swift */,
 				A8F8BCD02E03FC4E00EF4AA6 /* TSAIUploadPhotoVC+Image.swift */,
 				A8F8BCD22E03FD4A00EF4AA6 /* TSAIUploadPhotoVC+Video.swift */,
 				A8F8BCD22E03FD4A00EF4AA6 /* TSAIUploadPhotoVC+Video.swift */,
+				A83F28A82E165B17009A4975 /* TSAIUploadPhotoVC+Remove.swift */,
 			);
 			);
 			path = TSAIUploadPhotoVC;
 			path = TSAIUploadPhotoVC;
 			sourceTree = "<group>";
 			sourceTree = "<group>";
@@ -1006,7 +1023,7 @@
 				A81CA45F2D1567CD00A3AAC8 /* LaunchVC */,
 				A81CA45F2D1567CD00A3AAC8 /* LaunchVC */,
 				A8E56BEC2D1520EC003C54AF /* AppDelegate.swift */,
 				A8E56BEC2D1520EC003C54AF /* AppDelegate.swift */,
 				A8E56BED2D1520EC003C54AF /* Assets.xcassets */,
 				A8E56BED2D1520EC003C54AF /* Assets.xcassets */,
-				A8EB383D2E13B75C002F90E9 /* launch3.png */,
+				A83F28AA2E165C0A009A4975 /* launch4.png */,
 				A8E56BEE2D1520EC003C54AF /* Info.plist */,
 				A8E56BEE2D1520EC003C54AF /* Info.plist */,
 				A87CF8582E02AF070063CB7E /* InfoPlist.strings */,
 				A87CF8582E02AF070063CB7E /* InfoPlist.strings */,
 				A8E56BF02D1520EC003C54AF /* LaunchScreen.storyboard */,
 				A8E56BF02D1520EC003C54AF /* LaunchScreen.storyboard */,
@@ -1231,7 +1248,6 @@
 				603901222DF9770A0096551E /* Flash-old-Time.png in Resources */,
 				603901222DF9770A0096551E /* Flash-old-Time.png in Resources */,
 				A87CF85A2E02AF070063CB7E /* InfoPlist.strings in Resources */,
 				A87CF85A2E02AF070063CB7E /* InfoPlist.strings in Resources */,
 				A8C4C0A42D24218A003C46FC /* metadata.mov in Resources */,
 				A8C4C0A42D24218A003C46FC /* metadata.mov in Resources */,
-				A8EB383E2E13B75C002F90E9 /* launch3.png in Resources */,
 				A86857D72DF983620089D222 /* generat_loading.gif in Resources */,
 				A86857D72DF983620089D222 /* generat_loading.gif in Resources */,
 				A86857C62DF92BE70089D222 /* ZillaSlab-Bold.ttf in Resources */,
 				A86857C62DF92BE70089D222 /* ZillaSlab-Bold.ttf in Resources */,
 				A8F8BCF92E054A1A00EF4AA6 /* animated_example.gif in Resources */,
 				A8F8BCF92E054A1A00EF4AA6 /* animated_example.gif in Resources */,
@@ -1241,6 +1257,7 @@
 				A8FD8F352DFBCB85008CAACF /* ZillaSlab-BoldItalic.ttf in Resources */,
 				A8FD8F352DFBCB85008CAACF /* ZillaSlab-BoldItalic.ttf in Resources */,
 				A83F289F2E165043009A4975 /* aiList_Hug.gif in Resources */,
 				A83F289F2E165043009A4975 /* aiList_Hug.gif in Resources */,
 				A83F28A02E165043009A4975 /* aiList_Smile.gif in Resources */,
 				A83F28A02E165043009A4975 /* aiList_Smile.gif in Resources */,
+				A83F28AB2E165C0A009A4975 /* launch4.png in Resources */,
 				A83F28A12E165043009A4975 /* aiList_HeartGesture.gif in Resources */,
 				A83F28A12E165043009A4975 /* aiList_HeartGesture.gif in Resources */,
 				A83F28A22E165043009A4975 /* aiList_SayHi.gif in Resources */,
 				A83F28A22E165043009A4975 /* aiList_SayHi.gif in Resources */,
 				A83F28A32E165043009A4975 /* aiList_BlowKiss.gif in Resources */,
 				A83F28A32E165043009A4975 /* aiList_BlowKiss.gif in Resources */,
@@ -1346,6 +1363,7 @@
 				A895B5122E0287F2004F9B85 /* TYCyclePagerTransformLayout.m in Sources */,
 				A895B5122E0287F2004F9B85 /* TYCyclePagerTransformLayout.m in Sources */,
 				A8FD8F432DFC1656008CAACF /* TSImageComparisonView.swift in Sources */,
 				A8FD8F432DFC1656008CAACF /* TSImageComparisonView.swift in Sources */,
 				A868579E2DF915E90089D222 /* TSPurchaseBusiness.swift in Sources */,
 				A868579E2DF915E90089D222 /* TSPurchaseBusiness.swift in Sources */,
+				A83F28B02E168237009A4975 /* UIView+Ex.swift in Sources */,
 				A81F5B5D2D1A906C00740085 /* TSHomeDataModel.swift in Sources */,
 				A81F5B5D2D1A906C00740085 /* TSHomeDataModel.swift in Sources */,
 				A81CA49B2D1652CA00A3AAC8 /* TSHomeVC.swift in Sources */,
 				A81CA49B2D1652CA00A3AAC8 /* TSHomeVC.swift in Sources */,
 				A8F8BCDA2E040D8100EF4AA6 /* TSDownloadManager.swift in Sources */,
 				A8F8BCDA2E040D8100EF4AA6 /* TSDownloadManager.swift in Sources */,
@@ -1362,6 +1380,7 @@
 				A8F778B22D1BA07200BF55D5 /* TSRandomWallpaperBrowseSelectView.swift in Sources */,
 				A8F778B22D1BA07200BF55D5 /* TSRandomWallpaperBrowseSelectView.swift in Sources */,
 				A8477C9F2D22ABDA00DF0B93 /* TSEditLiveEidtCell.swift in Sources */,
 				A8477C9F2D22ABDA00DF0B93 /* TSEditLiveEidtCell.swift in Sources */,
 				A81CA4652D15685F00A3AAC8 /* TSLaunchVC.swift in Sources */,
 				A81CA4652D15685F00A3AAC8 /* TSLaunchVC.swift in Sources */,
+				A83F28A92E165B1D009A4975 /* TSAIUploadPhotoVC+Remove.swift in Sources */,
 				A8F8BCEB2E0501DC00EF4AA6 /* TSAppUpdateAlertVC.swift in Sources */,
 				A8F8BCEB2E0501DC00EF4AA6 /* TSAppUpdateAlertVC.swift in Sources */,
 				A81F5B402D194EA900740085 /* UIDevice+Extension.swift in Sources */,
 				A81F5B402D194EA900740085 /* UIDevice+Extension.swift in Sources */,
 				A8F778AE2D1AC12400BF55D5 /* TSRandomWallpaperBrowseView.swift in Sources */,
 				A8F778AE2D1AC12400BF55D5 /* TSRandomWallpaperBrowseView.swift in Sources */,
@@ -1427,6 +1446,7 @@
 				A8EE92C02DFFC3B50077DFFD /* TSImageProComparisonView.swift in Sources */,
 				A8EE92C02DFFC3B50077DFFD /* TSImageProComparisonView.swift in Sources */,
 				A86857C42DF92AEB0089D222 /* UIFont+Ex.swift in Sources */,
 				A86857C42DF92AEB0089D222 /* UIFont+Ex.swift in Sources */,
 				A86857A12DF91EB90089D222 /* TSAIListVC.swift in Sources */,
 				A86857A12DF91EB90089D222 /* TSAIListVC.swift in Sources */,
+				A83F28AE2E166391009A4975 /* TSAIRemovePhotlVC.swift in Sources */,
 				A8F8BCE32E0423B100EF4AA6 /* TSAIPhotoDetailsVC+View.swift in Sources */,
 				A8F8BCE32E0423B100EF4AA6 /* TSAIPhotoDetailsVC+View.swift in Sources */,
 				A81F5B5F2D1A909300740085 /* TSRandomWallpaperModel.swift in Sources */,
 				A81F5B5F2D1A909300740085 /* TSRandomWallpaperModel.swift in Sources */,
 				A8F778B72D1BE9A500BF55D5 /* TSLiveWallpaperBrowseVC.swift in Sources */,
 				A8F778B72D1BE9A500BF55D5 /* TSLiveWallpaperBrowseVC.swift in Sources */,
@@ -1502,7 +1522,7 @@
 				ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor;
 				ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor;
 				CODE_SIGN_IDENTITY = "Apple Development";
 				CODE_SIGN_IDENTITY = "Apple Development";
 				CODE_SIGN_STYLE = Automatic;
 				CODE_SIGN_STYLE = Automatic;
-				CURRENT_PROJECT_VERSION = 1;
+				CURRENT_PROJECT_VERSION = 3;
 				DEVELOPMENT_TEAM = 65UD255J84;
 				DEVELOPMENT_TEAM = 65UD255J84;
 				ENABLE_APP_SANDBOX = NO;
 				ENABLE_APP_SANDBOX = NO;
 				ENABLE_USER_SCRIPT_SANDBOXING = NO;
 				ENABLE_USER_SCRIPT_SANDBOXING = NO;
@@ -1542,7 +1562,7 @@
 				ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor;
 				ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor;
 				CODE_SIGN_IDENTITY = "Apple Development";
 				CODE_SIGN_IDENTITY = "Apple Development";
 				CODE_SIGN_STYLE = Automatic;
 				CODE_SIGN_STYLE = Automatic;
-				CURRENT_PROJECT_VERSION = 1;
+				CURRENT_PROJECT_VERSION = 3;
 				DEVELOPMENT_TEAM = 65UD255J84;
 				DEVELOPMENT_TEAM = 65UD255J84;
 				ENABLE_APP_SANDBOX = NO;
 				ENABLE_APP_SANDBOX = NO;
 				ENABLE_USER_SCRIPT_SANDBOXING = NO;
 				ENABLE_USER_SCRIPT_SANDBOXING = NO;

+ 16 - 0
TSLiveWallpaper/AppDelegate.swift

@@ -93,9 +93,25 @@ extension AppDelegate {
 //            .cacheSerializer(WebPSerializer.default),
 //            .cacheSerializer(WebPSerializer.default),
 //        ]
 //        ]
         checkAppConfig()
         checkAppConfig()
+        
+        kHandleDBHistoryOperation()
     }
     }
     
     
     func checkAppConfig() {
     func checkAppConfig() {
         TSAppUpdateManager.checkAppConfig()
         TSAppUpdateManager.checkAppConfig()
     }
     }
+    
+    
+    func kHandleDBHistoryOperation(){
+        let listModels = TSRMShared.aiListDB.listModels
+        let filteredResults = listModels.filter("status == %@ AND id > 0", "running")//直接过滤List(返回Results类型)
+
+        for model in filteredResults {
+            let generatePTPOperation = TSGenerateBasePhotoOperationQueue.shared.creatOperation(uuid: model.uuid)
+            generatePTPOperation.isSaveProcessToDB = true
+            generatePTPOperation.getActionInfo(oldModel: model.getModel())
+        }
+    }
+
+
 }
 }

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

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

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

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

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


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


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

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

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


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


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

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

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


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


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

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

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


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


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

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

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


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


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


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


BIN
TSLiveWallpaper/Assets.xcassets/AppIcon.appiconset/icon-1024.png


BIN
TSLiveWallpaper/Assets.xcassets/AppIcon.appiconset/icon-20@2x.png


BIN
TSLiveWallpaper/Assets.xcassets/AppIcon.appiconset/icon-20@3x.png


BIN
TSLiveWallpaper/Assets.xcassets/AppIcon.appiconset/icon-29@2x.png


BIN
TSLiveWallpaper/Assets.xcassets/AppIcon.appiconset/icon-29@3x.png


BIN
TSLiveWallpaper/Assets.xcassets/AppIcon.appiconset/icon-38@2x.png


BIN
TSLiveWallpaper/Assets.xcassets/AppIcon.appiconset/icon-38@3x.png


BIN
TSLiveWallpaper/Assets.xcassets/AppIcon.appiconset/icon-40@2x.png


BIN
TSLiveWallpaper/Assets.xcassets/AppIcon.appiconset/icon-40@3x.png


BIN
TSLiveWallpaper/Assets.xcassets/AppIcon.appiconset/icon-60@2x.png


BIN
TSLiveWallpaper/Assets.xcassets/AppIcon.appiconset/icon-60@3x.png


BIN
TSLiveWallpaper/Assets.xcassets/AppIcon.appiconset/icon-64@2x.png


BIN
TSLiveWallpaper/Assets.xcassets/AppIcon.appiconset/icon-64@3x.png


BIN
TSLiveWallpaper/Assets.xcassets/AppIcon.appiconset/icon-68@2x.png


BIN
TSLiveWallpaper/Assets.xcassets/AppIcon.appiconset/icon-76@2x.png


BIN
TSLiveWallpaper/Assets.xcassets/AppIcon.appiconset/icon-83.5@2x.png


+ 2 - 2
TSLiveWallpaper/Base.lproj/LaunchScreen.storyboard

@@ -16,7 +16,7 @@
                         <rect key="frame" x="0.0" y="0.0" width="393" height="852"/>
                         <rect key="frame" x="0.0" y="0.0" width="393" height="852"/>
                         <autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
                         <autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
                         <subviews>
                         <subviews>
-                            <imageView clipsSubviews="YES" userInteractionEnabled="NO" contentMode="scaleAspectFit" horizontalHuggingPriority="251" verticalHuggingPriority="251" image="launch3.png" adjustsImageSizeForAccessibilityContentSizeCategory="YES" translatesAutoresizingMaskIntoConstraints="NO" id="JeO-0Z-rkP">
+                            <imageView clipsSubviews="YES" userInteractionEnabled="NO" contentMode="scaleAspectFit" horizontalHuggingPriority="251" verticalHuggingPriority="251" image="launch4.png" adjustsImageSizeForAccessibilityContentSizeCategory="YES" translatesAutoresizingMaskIntoConstraints="NO" id="JeO-0Z-rkP">
                                 <rect key="frame" x="0.0" y="0.0" width="393" height="852"/>
                                 <rect key="frame" x="0.0" y="0.0" width="393" height="852"/>
                             </imageView>
                             </imageView>
                         </subviews>
                         </subviews>
@@ -36,6 +36,6 @@
         </scene>
         </scene>
     </scenes>
     </scenes>
     <resources>
     <resources>
-        <image name="launch3.png" width="750" height="1624"/>
+        <image name="launch4.png" width="750" height="1624"/>
     </resources>
     </resources>
 </document>
 </document>

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

@@ -75,7 +75,7 @@ enum TSGeneratorImageStyle:String {
         case .descratch:
         case .descratch:
             return "Descratch Photo".localized
             return "Descratch Photo".localized
         case .enlighten:
         case .enlighten:
-            return "Enlighten Photo".localized
+            return "Adjust Light".localized
         case .recreate:
         case .recreate:
             return "Recreate Photo".localized
             return "Recreate Photo".localized
         case .creatVideo:
         case .creatVideo:

+ 6 - 6
TSLiveWallpaper/Business/TSAIListVC/TSAIListHistoryVC/View/TSAIListHistoryCell.swift

@@ -41,12 +41,12 @@ class TSAIListHistoryCell: TSBaseCollectionCell {
                 buttonTapped?("delete_task_sensitive")
                 buttonTapped?("delete_task_sensitive")
             }else{
             }else{
 //                if kJudgeVipFreeType(vipFreeNumType: .picToPic){ return }
 //                if kJudgeVipFreeType(vipFreeNumType: .picToPic){ return }
-                if TSGenerateBasePhotoOperationQueue.shared.isAvailability {
-                    let generatePTPOperation = TSGenerateBasePhotoOperationQueue.shared.creatOperation(uuid: dataModel.uuid)
-                    generatePTPOperation.isSaveProcessToDB = true
-                    generatePTPOperation.creatImage(oldModel: dataModel){ complete in }
-                    generateView.setProgress(progress: 0)
-                }
+                if kShowGenerateBusyView(view: WindowHelper.getCurrentWindow()!) { return }
+
+                let generatePTPOperation = TSGenerateBasePhotoOperationQueue.shared.creatOperation(uuid: dataModel.uuid)
+                generatePTPOperation.isSaveProcessToDB = true
+                generatePTPOperation.creatImage(oldModel: dataModel){ complete in }
+                generateView.setProgress(progress: 0)
             }
             }
         }
         }
         
         

+ 5 - 2
TSLiveWallpaper/Business/TSAIListVC/TSAIListHistoryVC/View/TSGennerateCellView.swift

@@ -87,10 +87,13 @@ class TSGennerateCellView: TSBaseView {
         refreshBtn.isHidden = true
         refreshBtn.isHidden = true
         isCanClick = false
         isCanClick = false
         let progressInt = Int(progress*100)
         let progressInt = Int(progress*100)
-
         infoLabel.text = "Processing you photo".localized + "..." + "\n\n" + kPercentlocalized(progressInt)
         infoLabel.text = "Processing you photo".localized + "..." + "\n\n" + kPercentlocalized(progressInt)
-        infoLabel.textColor = .themeColor
+        
+        if kIsRTL {
+            infoLabel.text = "Processing you photo".localized + "..." + "\n\n" + "\(progressInt)%"
+        }
 
 
+        infoLabel.textColor = .themeColor
         updateInfoLabelCenterY()
         updateInfoLabelCenterY()
     }
     }
     
     

+ 23 - 14
TSLiveWallpaper/Business/TSAIListVC/TSAIListVC/TSAIListVC.swift

@@ -150,12 +150,12 @@ extension TSAIListVC: UICollectionViewDataSource ,UICollectionViewDelegate,UICol
 
 
     func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, insetForSectionAt section: Int) -> UIEdgeInsets{
     func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, insetForSectionAt section: Int) -> UIEdgeInsets{
         if let secModel = viewModel.listDatas.safeObj(At:section) {
         if let secModel = viewModel.listDatas.safeObj(At:section) {
-            var sectionEdge = UIEdgeInsets(top: 0, left: kDiscoverSection.left, bottom: 0, right: kDiscoverSection.right)
-            if secModel.title.isEmpty {
-                sectionEdge = UIEdgeInsets(top: 20, left: kDiscoverSection.left, bottom: 0, right: kDiscoverSection.right)
-            }
+            var sectionEdge = secModel.sectionEdge
+//            if secModel.title.isEmpty {
+//                sectionEdge = UIEdgeInsets(top: 20, left: kDiscoverSection.left, bottom: 0, right: kDiscoverSection.right)
+//            }
             if section == viewModel.listDatas.count-1 {
             if section == viewModel.listDatas.count-1 {
-                sectionEdge = UIEdgeInsets(top: sectionEdge.top, left: sectionEdge.left, bottom: sectionEdge.bottom+20+k_TabBar_Height, right: sectionEdge.right)
+                sectionEdge = UIEdgeInsets(top: sectionEdge.top, left: sectionEdge.left, bottom: sectionEdge.bottom+20+k_Height_TabBar, right: sectionEdge.right)
             }
             }
             return sectionEdge
             return sectionEdge
         }
         }
@@ -209,6 +209,16 @@ extension TSAIListVC: UICollectionViewDataSource ,UICollectionViewDelegate,UICol
 //        }
 //        }
 //    }
 //    }
 //}
 //}
+
+func kShowGenerateBusyView(view:UIView) ->Bool{
+    if TSGenerateBasePhotoOperationQueue.shared.isAvailability == false {
+        kTextToastShared.show(atView: view,text: "1 task is processing"){
+            TSAIListHistoryVC.showPosition()
+        }
+        return true
+    }
+    return false
+}
 extension TSAIListVC {
 extension TSAIListVC {
     
     
 //    func clickHeader(indexPath:IndexPath,model:TSDiscoverSectionModel) {
 //    func clickHeader(indexPath:IndexPath,model:TSDiscoverSectionModel) {
@@ -216,16 +226,15 @@ extension TSAIListVC {
 //    }
 //    }
 //    
 //    
     static func clickCell(target:UIViewController,indexPath:IndexPath,itemModel:TSDiscoverItemModel,secModel:TSDiscoverSectionModel) {
     static func clickCell(target:UIViewController,indexPath:IndexPath,itemModel:TSDiscoverItemModel,secModel:TSDiscoverSectionModel) {
-        
-        if TSGenerateBasePhotoOperationQueue.shared.isAvailability == false {
-            kTextToastShared.show(atView: target.view,text: "1 task is processing"){
-                TSAIListHistoryVC.showPosition()
-            }
-            return
-        }
-        
+
+        if kShowGenerateBusyView(view: target.view) { return }
         Self.enterSelectPhotos(target: target,style: itemModel.style) { image in
         Self.enterSelectPhotos(target: target,style: itemModel.style) { image in
-            kPushVC(target: target, modelVC: TSAIUploadPhotoVC(titleString: itemModel.viewModel.title,upLoadImage: image, generatorStyle: itemModel.style,disCoverItemModel: itemModel))
+            if itemModel.style == .remove {
+                kPushVC(target: target, modelVC: TSAIRemovePhotlVC(titleString: itemModel.name,upLoadImage: image, generatorStyle: itemModel.style,disCoverItemModel: itemModel))
+                return
+            }
+
+            kPushVC(target: target, modelVC: TSAIUploadPhotoVC(titleString: itemModel.name,upLoadImage: image, generatorStyle: itemModel.style,disCoverItemModel: itemModel))
         }
         }
     }
     }
 }
 }

+ 1 - 0
TSLiveWallpaper/Business/TSAIListVC/TSAIListVC/VM/TSAIListDataModel.swift

@@ -77,6 +77,7 @@ class TSDiscoverSectionModel {
     var title:String = ""
     var title:String = ""
     var style:TSDiscoverViewStyle = .styleMore
     var style:TSDiscoverViewStyle = .styleMore
     var items:[Any] = []
     var items:[Any] = []
+    var sectionEdge:UIEdgeInsets = UIEdgeInsets(top: 0, left: kDiscoverSection.left, bottom: 0, right: kDiscoverSection.right)
     func setTitle(title:String) {
     func setTitle(title:String) {
         self.title = title
         self.title = title
     }
     }

+ 13 - 1
TSLiveWallpaper/Business/TSAIListVC/TSAIListVC/VM/TSAIListDataVM+Dic.swift

@@ -101,7 +101,19 @@ extension TSAIListDataVM {
 
 
 //MARK: 图生图的模型
 //MARK: 图生图的模型
 extension TSAIListDataVM {
 extension TSAIListDataVM {
-
+    
+    var ptp_Remove:[String:Any]{
+        [
+            imageName: "",
+           imageText: "Photo Enhance",
+           prompt:"把图片变清晰",
+            specialStyle:1,
+            isVip: true,
+            unionType: 1,
+            model:kie
+        ]
+    }
+    
     var ptp_PhotoEnhance:[String:Any]{
     var ptp_PhotoEnhance:[String:Any]{
         [
         [
             imageName: "",
             imageName: "",

+ 35 - 17
TSLiveWallpaper/Business/TSAIListVC/TSAIListVC/VM/TSAIListDataVM.swift

@@ -17,6 +17,7 @@ class TSAIListDataVM {
     lazy var videoSection: TSDiscoverSectionModel = {
     lazy var videoSection: TSDiscoverSectionModel = {
         let section = TSDiscoverSectionModel()
         let section = TSDiscoverSectionModel()
         section.style = .styleMore
         section.style = .styleMore
+        section.sectionEdge =  UIEdgeInsets(top: 16, left: kDiscoverSection.left, bottom: 24, right: kDiscoverSection.right)
         section.items = [[
         section.items = [[
             TSDiscoverItemModel(style: .creatVideo,
             TSDiscoverItemModel(style: .creatVideo,
                                 viewModel: TSDiscoverAnimationItemVM(title: "",style: .gif, imageNameds: ["aiList_SayHi"]),
                                 viewModel: TSDiscoverAnimationItemVM(title: "",style: .gif, imageNameds: ["aiList_SayHi"]),
@@ -81,22 +82,22 @@ class TSAIListDataVM {
         return section
         return section
     }()
     }()
     
     
-    lazy var creatVideoSection: TSDiscoverSectionModel = {
-        let section = TSDiscoverSectionModel()
-        section.style = .fullCard
-        section.items = [
-            TSDiscoverItemModel(style: .creatVideo,
-                                viewModel: TSDiscoverAnimationItemVM(
-                                    title: "Animated Photo".localized,
-                                    info: "Turn photos into live moments".localized,
-                                    style: .gif,
-                                    imageNameds: ["aiList_Animated","animated_example.gif"]
-                                ),
-                                generateModel: TSGenerateModel(json: video_Creat)),
-        ]
-
-        return section
-    }()
+//    lazy var creatVideoSection: TSDiscoverSectionModel = {
+//        let section = TSDiscoverSectionModel()
+//        section.style = .fullCard
+//        section.items = [
+//            TSDiscoverItemModel(style: .creatVideo,
+//                                viewModel: TSDiscoverAnimationItemVM(
+//                                    title: "Animated Photo".localized,
+//                                    info: "Turn photos into live moments".localized,
+//                                    style: .gif,
+//                                    imageNameds: ["aiList_Animated","animated_example.gif"]
+//                                ),
+//                                generateModel: TSGenerateModel(json: video_Creat)),
+//        ]
+//
+//        return section
+//    }()
     
     
     lazy var enhanceSection: TSDiscoverSectionModel = {
     lazy var enhanceSection: TSDiscoverSectionModel = {
         let section = TSDiscoverSectionModel()
         let section = TSDiscoverSectionModel()
@@ -147,15 +148,32 @@ class TSAIListDataVM {
         return section
         return section
     }()
     }()
     
     
+    lazy var removeSection: TSDiscoverSectionModel = {
+        let section = TSDiscoverSectionModel()
+        section.style = .fullCard
+        section.items = [
+            TSDiscoverItemModel(style: .remove,
+                                viewModel: TSDiscoverBaseItemVM(
+                                    title: "Remove Objects".localized,
+                                    imageNamed: "aiList_Remove".localized,
+                                    info: "Select the unwanted area and remove them easily".localized
+                                ),
+                                generateModel: TSGenerateModel(json: ptp_Remove)),
+        ]
+        
+        return section
+    }()
+    
     lazy var listDatas: [TSDiscoverSectionModel] = {
     lazy var listDatas: [TSDiscoverSectionModel] = {
         return [
         return [
             videoSection,
             videoSection,
             colorizeSection,
             colorizeSection,
             Descratchection,
             Descratchection,
-            creatVideoSection,
+//            creatVideoSection,
             enhanceSection,
             enhanceSection,
             RecreateSection,
             RecreateSection,
             enlightenSection,
             enlightenSection,
+            removeSection,
         ]
         ]
     }()
     }()
     
     

+ 3 - 3
TSLiveWallpaper/Business/TSAIListVC/TSAIListVC/View/TSAILIstFullCardCell.swift

@@ -15,7 +15,7 @@ class TSAILIstFullCardCell: TSAILIstBaseCell {
             
             
             if let animationModel = model.viewModel as? TSDiscoverAnimationItemVM {
             if let animationModel = model.viewModel as? TSDiscoverAnimationItemVM {
                 if let imageNamed = animationModel.imageNameds.first {
                 if let imageNamed = animationModel.imageNameds.first {
-                    bgImageView.image = UIImage(named: imageNamed)
+                    bgImageView.image = UIImage(named: imageNamed)?.mirrored
                 }
                 }
                 
                 
                 if let gifNamed = animationModel.imageNameds.last {
                 if let gifNamed = animationModel.imageNameds.last {
@@ -32,7 +32,7 @@ class TSAILIstFullCardCell: TSAILIstBaseCell {
                     }
                     }
                 }
                 }
             }else{
             }else{
-                bgImageView.image = UIImage(named: model.viewModel.imageNamed)
+                bgImageView.image = UIImage(named: model.viewModel.imageNamed)?.mirrored
                 animatedImageView.stopAnimating()
                 animatedImageView.stopAnimating()
                 animatedImageView.isHidden = true
                 animatedImageView.isHidden = true
             }
             }
@@ -47,7 +47,7 @@ class TSAILIstFullCardCell: TSAILIstBaseCell {
     
     
     
     
     lazy var titleLab: UILabel = {
     lazy var titleLab: UILabel = {
-        let titleLab = UILabel.createLabel(font: .font(name: .ZillaSlab,size: 20,weight: .bold),textColor:.fromHex("FFFFFF"),numberOfLines: 0)
+        let titleLab = UILabel.createLabel(font: .font(name: .ZillaSlab,size: 18,weight: .bold),textColor:.fromHex("FFFFFF"),numberOfLines: 0)
         return titleLab
         return titleLab
     }()
     }()
     
     

+ 27 - 4
TSLiveWallpaper/Business/TSAIListVC/TSAIListVC/View/TSAILIstStyleMoreCell.swift

@@ -7,10 +7,10 @@
 
 
 class TSAILIstStyleMoreCell : TSAILIstBaseCell {
 class TSAILIstStyleMoreCell : TSAILIstBaseCell {
     lazy var collectionView: UICollectionView = {
     lazy var collectionView: UICollectionView = {
-        let layout = UICollectionViewFlowLayout()
+        let layout = TSBaseCollectionViewFlowLayout()
         layout.scrollDirection = .horizontal
         layout.scrollDirection = .horizontal
         layout.minimumLineSpacing = 16
         layout.minimumLineSpacing = 16
-        layout.minimumInteritemSpacing = 16
+//        layout.minimumInteritemSpacing = 16
         layout.itemSize = CGSize(width: 150, height: 200)
         layout.itemSize = CGSize(width: 150, height: 200)
         let collectionView = TSBaseCollectionView(frame: .zero, collectionViewLayout: layout)
         let collectionView = TSBaseCollectionView(frame: .zero, collectionViewLayout: layout)
         collectionView.delegate = self
         collectionView.delegate = self
@@ -90,7 +90,7 @@ class TSAILIstStyleMoreBaseCell: TSBaseCollectionCell {
     }()
     }()
     
     
     lazy var textLabel: UILabel = {
     lazy var textLabel: UILabel = {
-        let textLabel = UILabel.createLabel(font: .font(size: 14,weight: .medium),textColor: .white)
+        let textLabel = UILabel.createLabel(font: .font(name: .ZillaSlab,size: 18,weight: .bold),textColor: .white)
         return textLabel
         return textLabel
     }()
     }()
     
     
@@ -113,6 +113,9 @@ class TSAILIstStyleMoreBaseCell: TSBaseCollectionCell {
             make.leading.equalTo(8)
             make.leading.equalTo(8)
             make.trailing.bottom.equalTo(-8)
             make.trailing.bottom.equalTo(-8)
         }
         }
+        
+        
+        textLabel.addShadow(shadowColor: UIColor.black.withAlphaComponent(0.3).cgColor, shadowOffset: CGSize(width: 0, height: 2), shadowRadius: 4, shadowOpacity: 1)
     }
     }
 }
 }
 
 
@@ -129,7 +132,11 @@ class TSAILIstStyleMoreAnimationGifCell: TSAILIstStyleMoreBaseCell {
                     animatedImageView.kf.setImage(with: gifURL, options: [.cacheOriginalImage]){ result in
                     animatedImageView.kf.setImage(with: gifURL, options: [.cacheOriginalImage]){ result in
                         switch result {
                         switch result {
                         case .success(_):
                         case .success(_):
-                            self.animatedImageView.startAnimating()
+                            kMainAfter(1.0) {
+                                self.animatedImageView.addRealisticFlashEffect {
+                                    self.animatedImageView.startAnimating()
+                                }
+                            }
                         case .failure(let error):
                         case .failure(let error):
                             print("GIF 加载失败: \(error.localizedDescription)")
                             print("GIF 加载失败: \(error.localizedDescription)")
                         }
                         }
@@ -142,6 +149,8 @@ class TSAILIstStyleMoreAnimationGifCell: TSAILIstStyleMoreBaseCell {
     lazy var animatedImageView: AnimatedImageView = {
     lazy var animatedImageView: AnimatedImageView = {
         let animatedImageView = AnimatedImageView()
         let animatedImageView = AnimatedImageView()
         animatedImageView.autoPlayAnimatedImage = false
         animatedImageView.autoPlayAnimatedImage = false
+        animatedImageView.repeatCount = .once
+        animatedImageView.delegate = self
         return animatedImageView
         return animatedImageView
     }()
     }()
     
     
@@ -153,4 +162,18 @@ class TSAILIstStyleMoreAnimationGifCell: TSAILIstStyleMoreBaseCell {
         }
         }
 
 
     }
     }
+    
+
+}
+
+extension TSAILIstStyleMoreAnimationGifCell : AnimatedImageViewDelegate {
+    
+    func animatedImageViewDidFinishAnimating(_ imageView: AnimatedImageView){
+        self.animatedImageView.addRealisticFlashEffect {
+            self.model = self.model
+        }
+
+    }
+    
 }
 }
+

+ 41 - 3
TSLiveWallpaper/Business/TSAIListVC/TSAIPhotoDetailsVC/TSAIPhotoDetailsBrowserVC.swift

@@ -46,6 +46,18 @@ class TSAIPhotoDetailsBrowserVC: TSBaseVC {
         return collectionView
         return collectionView
     }()
     }()
 
 
+    lazy var shareBtn: TSVerticalButton = {
+        let shareBtn = TSVerticalButton()
+        shareBtn.setUpButton(title: "Share".localized,
+                             image: .share,
+                              font: .font(name:.ZillaSlab,size: 11,weight: .medium),
+                        titleColor: .white.withAlphaComponent(0.8)){ [weak self]  in
+            guard let self = self else { return }
+            clickShare()
+        }
+        shareBtn.contentEdgeInsets = UIEdgeInsets(top: 0, left: 10, bottom: 0, right: 10)
+        return shareBtn
+    }()
 
 
     lazy var saveBtn: UIButton = {
     lazy var saveBtn: UIButton = {
         let saveBtn = kCreateNormalSubmitBtn(title: "Save".localized) { [weak self]  in
         let saveBtn = kCreateNormalSubmitBtn(title: "Save".localized) { [weak self]  in
@@ -79,12 +91,21 @@ class TSAIPhotoDetailsBrowserVC: TSBaseVC {
             make.edges.equalTo(0)
             make.edges.equalTo(0)
         }
         }
         
         
+        let bottomBtnTop:CGFloat = -12-k_Height_safeAreaInsetsBottom()
+        contentView.addSubview(shareBtn)
+        shareBtn.snp.makeConstraints { make in
+            make.leading.equalTo(16)
+            make.width.equalTo(shareBtn.intrinsicContentSize.width)
+            make.height.equalTo(48)
+            make.bottom.equalTo(bottomBtnTop)
+        }
+        
         contentView.addSubview(saveBtn)
         contentView.addSubview(saveBtn)
         saveBtn.snp.makeConstraints { make in
         saveBtn.snp.makeConstraints { make in
-            make.centerX.equalToSuperview()
-            make.width.equalTo(250*kDesignScale)
+            make.leading.equalTo(shareBtn.snp.trailing).offset(40)
+            make.trailing.equalTo(-16.0)
             make.height.equalTo(48)
             make.height.equalTo(48)
-            make.bottom.equalTo(-12-k_Height_safeAreaInsetsBottom())
+            make.bottom.equalTo(bottomBtnTop)
         }
         }
         
         
 
 
@@ -131,6 +152,23 @@ class TSAIPhotoDetailsBrowserVC: TSBaseVC {
         }
         }
     }
     }
     
     
+    func clickShare() {
+        guard let infoModel = currentModel else { return }
+        if infoModel.isVideo{
+            TSDownloadManager.getDownLoadVideo(urlString: infoModel.response.resultUrl) { url, success in
+                if let url = url {
+                    kShareContent(target: self, anyData: url)
+                }
+            }
+        }else{
+            TSImageStoreTool.downloadImageWithProgress(urlString: infoModel.response.resultUrl) { image in
+                if let image = image {
+                    kShareContent(target: self, anyData: image)
+                }
+            }
+        }
+    }
+    
     @objc func clickNavRight() {
     @objc func clickNavRight() {
 
 
         TSCustomAlertController.show(in: self, config: TSCustomAlertController.AlertConfig(
         TSCustomAlertController.show(in: self, config: TSCustomAlertController.AlertConfig(

+ 13 - 0
TSLiveWallpaper/Business/TSAIListVC/TSAIPhotoDetailsVC/TSAIPhotoDetailsVC/TSAIPhotoDetailsVC+View.swift

@@ -26,6 +26,19 @@ extension TSAIPhotoDetailsVC{
         return saveBtn
         return saveBtn
     }
     }
     
     
+    func creatShareBtn() -> TSVerticalButton {
+        let shareBtn = TSVerticalButton()
+        shareBtn.setUpButton(title: "Share".localized,
+                             image: .share,
+                              font: .font(name:.ZillaSlab,size: 11,weight: .medium),
+                        titleColor: .white.withAlphaComponent(0.8)){ [weak self]  in
+            guard let self = self else { return }
+            clickShare()
+        }
+        shareBtn.contentEdgeInsets = UIEdgeInsets(top: 0, left: 10, bottom: 0, right: 10)
+        return shareBtn
+    }
+    
 }
 }
 
 
 
 

+ 32 - 5
TSLiveWallpaper/Business/TSAIListVC/TSAIPhotoDetailsVC/TSAIPhotoDetailsVC/TSAIPhotoDetailsVC.swift

@@ -18,6 +18,7 @@ class TSAIPhotoDetailsVC: TSBaseVC {
     var videoPlayerVC: TSAIListVideoPlayerVC = TSAIListVideoPlayerVC(videoURL: URL(string: "www.baidu.com")!)
     var videoPlayerVC: TSAIListVideoPlayerVC = TSAIListVideoPlayerVC(videoURL: URL(string: "www.baidu.com")!)
     lazy var expandAreaView: TSAIExpandChangeView = TSAIExpandChangeView()
     lazy var expandAreaView: TSAIExpandChangeView = TSAIExpandChangeView()
 //    lazy var switchOriginalPictureBtn: TSUIExpandedTouchButton = creatSwitchOriginalPictureBtn()
 //    lazy var switchOriginalPictureBtn: TSUIExpandedTouchButton = creatSwitchOriginalPictureBtn()
+    lazy var shareBtn: TSVerticalButton = creatShareBtn()
     lazy var saveBtn: UIButton = creatSaveBtn()
     lazy var saveBtn: UIButton = creatSaveBtn()
     var navRightBtn:UIButton = UIButton()
     var navRightBtn:UIButton = UIButton()
     var isSavePhotoMark:Bool = false
     var isSavePhotoMark:Bool = false
@@ -35,13 +36,22 @@ class TSAIPhotoDetailsVC: TSBaseVC {
         contentView.snp.updateConstraints { make in
         contentView.snp.updateConstraints { make in
             make.top.equalTo(0)
             make.top.equalTo(0)
         }
         }
-
+        
+        let bottomBtnTop:CGFloat = -12-k_Height_safeAreaInsetsBottom()
+        contentView.addSubview(shareBtn)
+        shareBtn.snp.makeConstraints { make in
+            make.leading.equalTo(16)
+            make.width.equalTo(shareBtn.intrinsicContentSize.width)
+            make.height.equalTo(48)
+            make.bottom.equalTo(bottomBtnTop)
+        }
+        
         contentView.addSubview(saveBtn)
         contentView.addSubview(saveBtn)
         saveBtn.snp.makeConstraints { make in
         saveBtn.snp.makeConstraints { make in
-            make.centerX.equalToSuperview()
-            make.width.equalTo(250*kDesignScale)
+            make.leading.equalTo(shareBtn.snp.trailing).offset(40)
+            make.trailing.equalTo(-16.0)
             make.height.equalTo(48)
             make.height.equalTo(48)
-            make.bottom.equalTo(-12-k_Height_safeAreaInsetsBottom())
+            make.bottom.equalTo(bottomBtnTop)
         }
         }
         
         
 //        contentView.addSubview(switchOriginalPictureBtn)
 //        contentView.addSubview(switchOriginalPictureBtn)
@@ -57,7 +67,24 @@ class TSAIPhotoDetailsVC: TSBaseVC {
         setUpPhotoSomeView()
         setUpPhotoSomeView()
     }
     }
     
     
-
+    //分享功能
+    @objc func clickShare(){
+        guard let infoModel = infoModel else { return }
+        if infoModel.isVideo{
+            TSDownloadManager.getDownLoadVideo(urlString: infoModel.response.resultUrl) { url, success in
+                if let url = url {
+                    kShareContent(target: self, anyData: url)
+                }
+            }
+        }else{
+            TSImageStoreTool.downloadImageWithProgress(urlString: infoModel.response.resultUrl) { image in
+                if let image = image {
+                    kShareContent(target: self, anyData: image)
+                }
+            }
+        }
+    }
+    
 
 
     //保存功能
     //保存功能
     @objc func clickSaveBtn(){
     @objc func clickSaveBtn(){

+ 2 - 1
TSLiveWallpaper/Business/TSAIListVC/TSAIPhotoGeneratorVC/Model/TSAIListPhotoGeneratorModel.swift

@@ -12,7 +12,7 @@ class TSAIListPhotoGeneratorModel {
     var expandViewSizes:(CGSize,CGSize)?
     var expandViewSizes:(CGSize,CGSize)?
     var additionalPrompt:String//追加的提示词
     var additionalPrompt:String//追加的提示词
     
     
-    //预测宝宝
+    //上传多张图片
     var upLoadImages:[UIImage]?
     var upLoadImages:[UIImage]?
     
     
     init(upLoadImage: UIImage,
     init(upLoadImage: UIImage,
@@ -33,6 +33,7 @@ class TSAIListPhotoGeneratorModel {
     var prompt:String = ""
     var prompt:String = ""
     var inputText:String = ""
     var inputText:String = ""
     var upLoadImageUrl:String?
     var upLoadImageUrl:String?
+    var upLoadImageUrls:[String] = []
     var model:String = ""   //决定生图的模型
     var model:String = ""   //决定生图的模型
 }
 }
 
 

+ 486 - 0
TSLiveWallpaper/Business/TSAIListVC/TSAIUploadPhotoVC/TSAIRemovePhotlVC/TSAIRemovePhotlVC.swift

@@ -0,0 +1,486 @@
+//
+//  TSAIRemovePhotlVC.swift
+//  TSLiveWallpaper
+//
+//  Created by 100Years on 2025/7/3.
+//
+
+
+class TSAIRemovePhotlVC: TSAIUploadPhotoVC {
+    private let minZoomScale: CGFloat = 1.0
+     private let maxZoomScale: CGFloat = 4.0
+     private let zoomSensitivity: CGFloat = 0.2 // 灵敏度系数 (0.1-1.0)
+    lazy var scrollView: UIScrollView = {
+        let sv = UIScrollView()
+        sv.minimumZoomScale = 1.0
+        sv.maximumZoomScale = 4.0
+        sv.showsHorizontalScrollIndicator = false
+        sv.showsVerticalScrollIndicator = false
+        sv.delegate = self
+        sv.backgroundColor = .yellow.withAlphaComponent(0.1)
+        return sv
+    }()
+
+    private let drawingImageView: UIImageView = {
+        let iv = UIImageView()
+        iv.contentMode = .scaleAspectFit
+        iv.isUserInteractionEnabled = true
+        iv.clipsToBounds = true
+        return iv
+    }()
+    
+    private let slider: UISlider = {
+        let slider = UISlider()
+        slider.minimumValue = 1
+        slider.maximumValue = 30
+        slider.setThumbImage(UIImage.circle(diameter: 10, color: .themeColor), for: .normal)
+        slider.minimumTrackTintColor = UIColor.themeColor
+        slider.maximumTrackTintColor = .white.withAlphaComponent(0.2)
+        slider.value = 5
+        return slider
+    }()
+    
+    private let clearButton: UIButton = {
+        let button = UIButton.createButton(image: .aiRemoveClear)
+        return button
+    }()
+    
+    private let undoButton: UIButton = {
+        let button = UIButton.createButton(image: .aiRemoveBack)
+        return button
+    }()
+    
+    private let redoButton: UIButton = {
+        let button = UIButton.createButton(image: .aiRemoveGo)
+        return button
+    }()
+    
+    lazy var panLineLabel: UILabel = UILabel.createLabel(text: "\(brushWidth)",font: .font(size: 14),textColor: .white)
+    
+
+    private var lastPoint = CGPoint.zero
+    private var swiped = false
+    private var brushWidth: CGFloat = 5.0
+    private var brushColor: UIColor = .themeColor
+    
+    private var drawingHistory: [UIImage] = [UIImage()]
+    private var historyIndex: Int = 0
+    
+    // 用于记录缩放前的状态
+    private var scale: CGFloat = 1.0
+    private var touchCenter: CGPoint = .zero
+    
+    func setUpRemoveUploadView(){
+        let spaceH = 176.0
+        uploadImageViewMaxHeight = k_ScreenHeight-spaceH-k_Height_safeAreaInsetsBottom()-k_Nav_Height
+        uploadImageBgView.backgroundColor = .blue.withAlphaComponent(0.1)
+        uploadImageBgView.snp.makeConstraints { make in
+            make.width.equalTo(k_ScreenWidth)
+            make.height.equalTo(uploadImageViewMaxHeight)
+        }
+    }
+    
+    
+    override func setUpStackView() {
+        setUpRemoveUploadView()
+        
+        setupUI()
+        setupGestures()
+        setupActions()
+    }
+    
+    override func updateUploadImageViewFrame() {
+        super.updateUploadImageViewFrame()
+        
+        historyIndex = 0
+        drawingHistory = [UIImage()]
+        drawingImageView.image = drawingHistory[historyIndex]
+        updateUndoRedoButtons()
+    }
+    
+    // MARK: - Setup
+    
+    private func setupUI() {
+        //添加底层滚动视图
+        scrollView.addSubview(uploadImageBgView)
+        uploadImageBgView.snp.makeConstraints { make in
+            make.edges.equalToSuperview()
+            make.width.height.equalToSuperview()
+        }
+        cusStackView.addSubviewToStack(scrollView)
+        
+        // 添加绘图视图
+        uploadImageView.addSubview(drawingImageView)
+        drawingImageView.snp.makeConstraints { make in
+            make.edges.equalToSuperview()
+        }
+        
+        //stack add
+        
+        let toolBtnView = UIView()
+        toolBtnView.addSubview(undoButton)
+        toolBtnView.addSubview(redoButton)
+        toolBtnView.addSubview(clearButton)
+        cusStackView.addSubviewToStack(toolBtnView)
+        
+        toolBtnView.snp.makeConstraints { make in
+            make.height.equalTo(40)
+        }
+        
+        undoButton.snp.makeConstraints { make in
+            make.centerY.equalToSuperview()
+            make.leading.equalTo(16)
+            make.width.height.equalTo(24)
+        }
+        
+        redoButton.snp.makeConstraints { make in
+            make.centerY.equalToSuperview()
+            make.leading.equalTo(60)
+            make.width.height.equalTo(24)
+        }
+        
+        clearButton.snp.makeConstraints { make in
+            make.centerY.equalToSuperview()
+            make.trailing.equalTo(-16)
+            make.width.height.equalTo(24)
+        }
+        
+
+        let slideView = UIView()
+        let panImageView = UIImageView.createImageView(image: .aiRemovePen)
+        slideView.addSubview(panImageView)
+        slideView.addSubview(slider)
+        slideView.addSubview(panLineLabel)
+        cusStackView.addSubviewToStack(slideView)
+        
+        slideView.snp.makeConstraints { make in
+            make.height.equalTo(40)
+        }
+        
+        panImageView.snp.makeConstraints { make in
+            make.centerY.equalToSuperview()
+            make.leading.equalTo(16)
+            make.width.height.equalTo(24)
+        }
+        
+        slider.snp.makeConstraints { make in
+            make.centerY.equalToSuperview()
+            make.leading.equalTo(62)
+            make.trailing.equalTo(-55)
+            make.width.height.equalTo(24)
+        }
+        
+        panLineLabel.snp.makeConstraints { make in
+            make.centerY.equalToSuperview()
+            make.trailing.equalTo(-16)
+            make.height.equalTo(24)
+        }
+    }
+    
+    
+    func creatToolView(){
+        
+        
+    }
+    
+    private func setupGestures() {
+        // 绘图手势
+        let panGesture = UIPanGestureRecognizer(target: self, action: #selector(handleDrawingPan(_:)))
+        panGesture.minimumNumberOfTouches = 1
+        panGesture.maximumNumberOfTouches = 1
+        drawingImageView.addGestureRecognizer(panGesture)
+        
+        // 双指缩放手势
+        let pinchGesture = UIPinchGestureRecognizer(target: self, action: #selector(handlePinch(_:)))
+        pinchGesture.delegate = self
+        scrollView.addGestureRecognizer(pinchGesture)
+        
+        // 拖动手势(用于移动图片)
+        let dragGesture = UIPanGestureRecognizer(target: self, action: #selector(handleDrag(_:)))
+        dragGesture.minimumNumberOfTouches = 2
+        dragGesture.maximumNumberOfTouches = 2
+        dragGesture.delegate = self
+        scrollView.addGestureRecognizer(dragGesture)
+    }
+    
+    private func setupActions() {
+        slider.addTarget(self, action: #selector(brushSizeChanged(_:)), for: .valueChanged)
+        clearButton.addTarget(self, action: #selector(clearDrawing), for: .touchUpInside)
+        undoButton.addTarget(self, action: #selector(undoDrawing), for: .touchUpInside)
+        redoButton.addTarget(self, action: #selector(redoDrawing), for: .touchUpInside)
+//        generateButton.addTarget(self, action: #selector(generateImage), for: .touchUpInside)
+    }
+    
+    // MARK: - Drawing Methods
+    
+    @objc private func handleDrawingPan(_ gesture: UIPanGestureRecognizer) {
+        let currentPoint = gesture.location(in: drawingImageView)
+        
+        if gesture.state == .began {
+            swiped = false
+            lastPoint = currentPoint
+            return
+        }
+        
+        if gesture.state == .changed {
+            swiped = true
+            drawLine(from: lastPoint, to: currentPoint)
+            lastPoint = currentPoint
+        }
+        
+        if gesture.state == .ended {
+            if !swiped {
+                // 绘制单点
+                drawLine(from: lastPoint, to: lastPoint)
+            }
+            saveDrawingToHistory()
+        }
+    }
+    
+    private func drawLine(from fromPoint: CGPoint, to toPoint: CGPoint) {
+        UIGraphicsBeginImageContextWithOptions(drawingImageView.bounds.size, false, 0.0)
+        
+        guard let context = UIGraphicsGetCurrentContext() else { return }
+        
+        // 绘制现有图像
+        drawingImageView.image?.draw(in: drawingImageView.bounds)
+        
+        // 绘制线条
+        context.move(to: fromPoint)
+        context.addLine(to: toPoint)
+        context.setLineCap(.round)
+        context.setLineWidth(brushWidth)// / scrollView.zoomScale) // 根据缩放比例调整画笔粗细
+        context.setStrokeColor(brushColor.cgColor)
+        context.setBlendMode(.normal)
+        context.strokePath()
+        
+        // 设置新图像
+        drawingImageView.image = UIGraphicsGetImageFromCurrentImageContext()
+        UIGraphicsEndImageContext()
+    }
+    
+
+    
+    // MARK: - History Management
+    
+    private func saveDrawingToHistory() {
+        guard let currentDrawing = drawingImageView.image else { return }
+        
+        if historyIndex < drawingHistory.count - 1 {
+            drawingHistory.removeSubrange(historyIndex+1..<drawingHistory.count)
+        }
+        
+        drawingHistory.append(currentDrawing)
+        historyIndex = drawingHistory.count - 1
+        updateUndoRedoButtons()
+    }
+    
+    private func updateUndoRedoButtons() {
+        undoButton.isEnabled = historyIndex > 0
+        redoButton.isEnabled = historyIndex < drawingHistory.count - 1
+    }
+    
+    // MARK: - Actions
+    
+    @objc private func brushSizeChanged(_ sender: UISlider) {
+        brushWidth = CGFloat(sender.value)
+//        panLineLabel.text = "\(brushWidth)"
+        panLineLabel.text = String(format: "%.1f", brushWidth)
+    }
+    
+    @objc private func clearDrawing() {
+        drawingImageView.image = nil
+        saveDrawingToHistory()
+    }
+    
+    @objc private func undoDrawing() {
+        guard historyIndex > 0 else { return }
+        historyIndex -= 1
+        drawingImageView.image = drawingHistory[historyIndex]
+        updateUndoRedoButtons()
+    }
+    
+    @objc private func redoDrawing() {
+        guard historyIndex < drawingHistory.count - 1 else { return }
+        historyIndex += 1
+        drawingImageView.image = drawingHistory[historyIndex]
+        updateUndoRedoButtons()
+    }
+    
+    
+    override func generateImage() {
+        
+        if kJudgeVip(externalBool: true, vc: self){ return } //判断 vip
+        guard let upLoadImage = upLoadImage else { return }
+        guard let maskImage = getBlackWhiteMaskImage() else { return  }
+        
+
+        
+        let generatorModel = TSAIListPhotoGeneratorModel(upLoadImage: upLoadImage, generatorStyle: generatorStyle,additionalPrompt: additionalPrompt)
+        generatorModel.upLoadImages = [upLoadImage,maskImage]
+        
+        let gennerateVC = TSAIListPhotoGeneratorVC(generatorModel:generatorModel){ model in }
+        gennerateVC.backstageBlock = { [weak self]  in
+            guard let self = self else { return }
+            TSAIListHistoryVC.showPosition()
+            self.navigationController?.popToRootViewController(animated: false)
+        }
+        kPresentModalVC(target: self, modelVC: gennerateVC,transitionStyle: .crossDissolve)
+        
+    }
+
+}
+
+
+extension TSAIRemovePhotlVC {
+    
+    func getBlackWhiteMaskImage() -> UIImage? {
+        // 确保有原始图片
+        guard let originalImage = uploadImageView.image else {
+            print("没有可处理的图片")
+            return nil
+        }
+        
+        // 开始图像处理
+        UIGraphicsBeginImageContextWithOptions(originalImage.size, true, originalImage.scale)
+        defer { UIGraphicsEndImageContext() }
+        
+        // 获取绘图上下文
+        guard let context = UIGraphicsGetCurrentContext() else {
+            print("无法创建图像上下文")
+            return nil
+        }
+        
+        // 1. 绘制全黑背景
+        UIColor.black.setFill()
+        context.fill(CGRect(origin: .zero, size: originalImage.size))
+        
+        // 2. 绘制白色涂鸦(从drawingImageView获取)
+        if let drawingImage = drawingImageView.image {
+            // 使用白色混合模式绘制涂鸦
+            context.saveGState()
+            context.setBlendMode(.normal)
+            context.interpolationQuality = .high
+            
+            // 将涂鸦转换为白色
+            let tintedImage = drawingImage.tinted(with: .white)
+            tintedImage.draw(in: CGRect(origin: .zero, size: originalImage.size))
+            context.restoreGState()
+        }
+        
+        // 3. 获取处理后的图像
+        guard let processedImage = UIGraphicsGetImageFromCurrentImageContext() else {
+            print("无法生成处理后的图像")
+            return nil
+        }
+ 
+        return processedImage
+//        UIImageWriteToSavedPhotosAlbum(processedImage, nil, nil, nil)
+//        let alert = UIAlertController(title: "Image Generated", message: "The combined image has been saved to your photos.", preferredStyle: .alert)
+//        alert.addAction(UIAlertAction(title: "OK", style: .default))
+//        present(alert, animated: true)
+    }
+}
+
+// UIImage扩展 - 图像着色
+extension UIImage {
+    func tinted(with color: UIColor) -> UIImage {
+        UIGraphicsBeginImageContextWithOptions(size, false, scale)
+        defer { UIGraphicsEndImageContext() }
+        
+        color.set()
+        withRenderingMode(.alwaysTemplate).draw(in: CGRect(origin: .zero, size: size))
+        
+        return UIGraphicsGetImageFromCurrentImageContext() ?? self
+    }
+}
+
+// MARK: - 手势处理修复
+extension TSAIRemovePhotlVC: UIGestureRecognizerDelegate {
+    @objc private func handlePinch(_ gesture: UIPinchGestureRecognizer) {
+        switch gesture.state {
+        case .began:
+            // 重置手势缩放比例
+            gesture.scale = 1.0
+            break
+        case .changed:
+            // 计算带灵敏度控制的缩放比例
+                let scale = (gesture.scale - 1.0) * zoomSensitivity + 1.0
+                
+                // 计算新的缩放比例
+                let currentScale = scrollView.zoomScale
+                var newScale = currentScale * scale
+                
+                // 限制缩放范围
+                newScale = min(max(newScale, minZoomScale), maxZoomScale)
+                
+                // 应用缩放
+                scrollView.setZoomScale(newScale, animated: false)
+                
+                // 重置手势缩放比例
+                gesture.scale = 1.0
+        case .ended:
+            
+            if scrollView.zoomScale < 1.0 {
+                scrollView.setZoomScale(1.0, animated: true)
+            }
+            
+        default:
+            break
+        }
+    }
+    
+    @objc private func handleDrag(_ gesture: UIPanGestureRecognizer) {
+        guard scrollView.zoomScale > scrollView.minimumZoomScale else { return }
+        
+        let translation = gesture.translation(in: scrollView)
+        
+        if gesture.state == .changed {
+            // 计算新的contentOffset,限制在有效范围内
+            let newOffsetX = scrollView.contentOffset.x - translation.x
+            let newOffsetY = scrollView.contentOffset.y - translation.y
+            
+            let maxOffsetX = scrollView.contentSize.width - scrollView.bounds.width
+            let maxOffsetY = scrollView.contentSize.height - scrollView.bounds.height
+            
+            scrollView.contentOffset = CGPoint(
+                x: max(0, min(newOffsetX, maxOffsetX)),
+                y: max(0, min(newOffsetY, maxOffsetY))
+            )
+            
+            gesture.setTranslation(.zero, in: scrollView)
+        }
+    }
+    
+    func gestureRecognizer(_ gestureRecognizer: UIGestureRecognizer, shouldRecognizeSimultaneouslyWith otherGestureRecognizer: UIGestureRecognizer) -> Bool {
+        // 允许缩放手势和拖动手势同时识别
+        return true
+    }
+}
+
+// MARK: - UIScrollViewDelegate
+extension TSAIRemovePhotlVC:UIScrollViewDelegate {
+    func viewForZooming(in scrollView: UIScrollView) -> UIView? {
+        return uploadImageBgView
+    }
+    
+    func scrollViewDidZoom(_ scrollView: UIScrollView) {
+        // 缩放后调整图片位置
+        adjustImagePosition()
+    }
+    
+    private func adjustImagePosition() {
+        let imageViewSize = uploadImageBgView.frame.size
+        let scrollViewSize = scrollView.bounds.size
+
+        let verticalPadding = max((scrollViewSize.height - imageViewSize.height) / 2, 0)
+        let horizontalPadding = max((scrollViewSize.width - imageViewSize.width) / 2, 0)
+        print("verticalPadding=\(verticalPadding),horizontalPadding=\(horizontalPadding)")
+        scrollView.contentInset = UIEdgeInsets(
+             top: verticalPadding,
+             left: horizontalPadding,
+             bottom: verticalPadding,
+             right: horizontalPadding
+         )
+    }
+}

+ 34 - 0
TSLiveWallpaper/Business/TSAIListVC/TSAIUploadPhotoVC/TSAIUploadPhotoVC+Remove.swift

@@ -0,0 +1,34 @@
+//
+//  TSAIUploadPhotoVC+Remove.swift
+//  TSLiveWallpaper
+//
+//  Created by 100Years on 2025/7/2.
+//
+
+//extension TSAIUploadPhotoVC {
+//    
+//    func creatRemoveView() -> UIView {
+//        let textView = TSAIUploadPhotoTextView()
+//        textView.placeholderTextView.textViewTextChanged = { [weak self] text in
+//            guard let self = self else { return }
+//            additionalPrompt = text
+//        }
+//        return textView
+//    }
+//    
+//}
+//
+//extension TSAIUploadPhotoVC {
+//    func setUpRemoveUploadView(){
+//        let spaceH = 176.0
+//        uploadImageViewMaxHeight = k_ScreenHeight-spaceH-k_Height_safeAreaInsetsBottom()-k_Nav_Height
+//        
+//        cusStackView.addSubviewToStack(uploadImageBgView)
+//        uploadImageBgView.snp.makeConstraints { make in
+//            make.width.equalTo(k_ScreenWidth)
+//            make.height.equalTo(k_ScreenHeight-spaceH-k_Height_safeAreaInsetsBottom()-k_Nav_Height)
+//        }
+//        cusStackView.addSpacing(length: 32)
+//        cusStackView.addSubviewToStack(self.textView)
+//    }
+//}

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

@@ -41,18 +41,6 @@ extension TSAIUploadPhotoVC {
         return bgView
         return bgView
     }
     }
 
 
-    func updateUploadImageViewFrame() {
-        if let image = upLoadImage {
-            let height = min(uploadImageViewMaxHeight, kGetScaleHeight(originalSize: image.size, width: k_ScreenWidth))
-            uploadImageView.snp.updateConstraints { make in
-                make.height.equalTo(height)
-            }
-        }else{
-            uploadImageView.snp.updateConstraints { make in
-                make.height.equalTo(k_ScreenWidth)
-            }
-        }
-    }
     
     
     func creatUpLoadView() -> UIView {
     func creatUpLoadView() -> UIView {
         let bgView = UIView()
         let bgView = UIView()

+ 55 - 31
TSLiveWallpaper/Business/TSAIListVC/TSAIUploadPhotoVC/TSAIUploadPhotoVC.swift

@@ -32,14 +32,18 @@ class TSAIUploadPhotoVC: TSBaseVC {
     lazy var upLoadView: UIView = creatUpLoadView()
     lazy var upLoadView: UIView = creatUpLoadView()
     lazy var uploadImageView: UIImageView = creatUploadImageView()
     lazy var uploadImageView: UIImageView = creatUploadImageView()
     lazy var uploadImageBgView: UIView = creatUploadImageBgView()
     lazy var uploadImageBgView: UIView = creatUploadImageBgView()
-    //视频描述
-    lazy var textView: TSAIUploadPhotoTextView = creatTextView()
-    
+
     //提交 btn
     //提交 btn
     lazy var submitBtn: UIButton = creatSubmitBtn()
     lazy var submitBtn: UIButton = creatSubmitBtn()
     //删除按钮
     //删除按钮
     lazy var deleteBtn: UIButton = creatDeleteBtn()
     lazy var deleteBtn: UIButton = creatDeleteBtn()
     
     
+    
+    //###### 视频区域 ######
+    lazy var textView: TSAIUploadPhotoTextView = creatTextView()
+    
+
+
     //###### 数据区 ######
     //###### 数据区 ######
     var uploadImageViewMaxHeight:CGFloat = k_ScreenHeight-76-k_Height_safeAreaInsetsBottom()-k_Nav_Height
     var uploadImageViewMaxHeight:CGFloat = k_ScreenHeight-76-k_Height_safeAreaInsetsBottom()-k_Nav_Height
     let lineSpacing = 6.0
     let lineSpacing = 6.0
@@ -103,17 +107,61 @@ class TSAIUploadPhotoVC: TSBaseVC {
         NotificationCenter.default.addObserver(self, selector: #selector(keyboardWillHide(_:)), name: UIResponder.keyboardWillHideNotification, object: nil)
         NotificationCenter.default.addObserver(self, selector: #selector(keyboardWillHide(_:)), name: UIResponder.keyboardWillHideNotification, object: nil)
     }
     }
     
     
-}
-
-extension TSAIUploadPhotoVC {
     func setUpStackView(){
     func setUpStackView(){
-        if generatorStyle == .creatVideo && disCoverItemModel?.generateModel?.input == true {
+        if generatorStyle == .creatVideo {
             setUpVideoUploadView()
             setUpVideoUploadView()
         }else{
         }else{
             setUpImageUploadView()
             setUpImageUploadView()
         }
         }
     }
     }
     
     
+    func updateUploadImageViewFrame() {
+        
+        if let image = upLoadImage {
+            let newSize = kGetSubFrame(superSize: CGSizeMake(k_ScreenWidth, uploadImageViewMaxHeight), subViewSize: image.size)
+            uploadImageView.snp.remakeConstraints{ make in
+                make.center.equalToSuperview()
+                make.width.equalTo(newSize.width)
+                make.height.equalTo(newSize.height)
+            }
+        }else{
+            uploadImageView.snp.remakeConstraints { make in
+                make.height.equalTo(k_ScreenWidth)
+                make.center.equalToSuperview()
+                make.width.equalTo(k_ScreenWidth)
+            }
+        }
+    }
+    
+    
+    func generateImage() {
+        if kJudgeVip(externalBool: true, vc: self){ return } //判断 vip
+        guard let upLoadImage = upLoadImage else { return }
+        
+        let generatorModel = TSAIListPhotoGeneratorModel(upLoadImage: upLoadImage, generatorStyle: generatorStyle,additionalPrompt: additionalPrompt)
+
+        if let generateModel = disCoverItemModel?.generateModel{
+            generatorModel.prompt = generateModel.prompt + additionalPrompt
+            generatorModel.model = generateModel.model
+        }else{
+            if let promptModel = generatorStyle.generateModel{
+                generatorModel.prompt = promptModel.prompt + additionalPrompt
+                generatorModel.model = promptModel.model
+            }
+        }
+        
+        let gennerateVC = TSAIListPhotoGeneratorVC(generatorModel:generatorModel){ model in }
+        gennerateVC.backstageBlock = { [weak self]  in
+            guard let self = self else { return }
+            TSAIListHistoryVC.showPosition()
+            self.navigationController?.popToRootViewController(animated: false)
+        }
+        kPresentModalVC(target: self, modelVC: gennerateVC,transitionStyle: .crossDissolve)
+    }
+}
+
+extension TSAIUploadPhotoVC {
+
     @objc func clickView() {
     @objc func clickView() {
         self.view.endEditing(true)
         self.view.endEditing(true)
     }
     }
@@ -147,31 +195,7 @@ extension TSAIUploadPhotoVC {
         }
         }
         return ""
         return ""
     }
     }
-    
-    func generateImage() {
-        if kJudgeVip(externalBool: true, vc: self){ return } //判断 vip
-        guard let upLoadImage = upLoadImage else { return }
-        
-        let generatorModel = TSAIListPhotoGeneratorModel(upLoadImage: upLoadImage, generatorStyle: generatorStyle,additionalPrompt: additionalPrompt)
 
 
-        if let generateModel = disCoverItemModel?.generateModel{
-            generatorModel.prompt = generateModel.prompt + additionalPrompt
-            generatorModel.model = generateModel.model
-        }else{
-            if let promptModel = generatorStyle.generateModel{
-                generatorModel.prompt = promptModel.prompt + additionalPrompt
-                generatorModel.model = promptModel.model
-            }
-        }
-        
-        let gennerateVC = TSAIListPhotoGeneratorVC(generatorModel:generatorModel){ model in }
-        gennerateVC.backstageBlock = { [weak self]  in
-            guard let self = self else { return }
-            TSAIListHistoryVC.showPosition()
-            self.navigationController?.popToRootViewController(animated: false)
-        }
-        kPresentModalVC(target: self, modelVC: gennerateVC,transitionStyle: .crossDissolve)
-    }
 }
 }
 
 
 extension TSAIUploadPhotoVC {
 extension TSAIUploadPhotoVC {

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

@@ -5,7 +5,7 @@
 //  Created by 100Years on 2025/6/19.
 //  Created by 100Years on 2025/6/19.
 //
 //
 
 
-class TSAIUploadPhotoTextView: TSBaseView {
+class TSAIUploadPhotoTextView: TSBaseView ,UITextViewDelegate{
     
     
     lazy var titleLabel: UILabel = {
     lazy var titleLabel: UILabel = {
         let titleLabel = UILabel.createLabel(text: "Description".localized,font: .font(size: 16.0),textColor: .white)
         let titleLabel = UILabel.createLabel(text: "Description".localized,font: .font(size: 16.0),textColor: .white)
@@ -25,7 +25,9 @@ class TSAIUploadPhotoTextView: TSBaseView {
             backgroundColor: "#333333".uiColor,
             backgroundColor: "#333333".uiColor,
             textInsets:UIEdgeInsets(top: 14, left: 12, bottom: 14, right: 12)
             textInsets:UIEdgeInsets(top: 14, left: 12, bottom: 14, right: 12)
         )
         )
-        placeholderTextView.maxLength = 500
+        placeholderTextView.returnKeyType = .done
+        placeholderTextView.maxLength = 600
+        placeholderTextView.delegate = self
         return placeholderTextView
         return placeholderTextView
     }()
     }()
     
     
@@ -56,4 +58,12 @@ class TSAIUploadPhotoTextView: TSBaseView {
         }
         }
     }
     }
     
     
+    func textView(_ textView: UITextView, shouldChangeTextIn range: NSRange, replacementText text: String) -> Bool {
+        if text == "\n" {
+            textView.resignFirstResponder()
+            return false
+        }
+        return true
+    }
+    
 }
 }

+ 46 - 0
TSLiveWallpaper/Common/Ex/UIView+Ex.swift

@@ -0,0 +1,46 @@
+//
+//  UIView+Ex.swift
+//  TSLiveWallpaper
+//
+//  Created by 100Years on 2025/7/3.
+//
+
+extension UIView {
+    func addRealisticFlashEffect(completion: (() -> Void)? = nil) {
+        // 创建闪光层
+        let flashLayer = CALayer()
+        flashLayer.frame = self.bounds
+        flashLayer.backgroundColor = UIColor.white.cgColor
+        flashLayer.opacity = 0
+        self.layer.addSublayer(flashLayer)
+        
+        // 创建动画组
+        let animationGroup = CAAnimationGroup()
+        animationGroup.duration = 0.3
+        animationGroup.timingFunction = CAMediaTimingFunction(name: .easeOut)
+        
+        // 透明度动画
+        let opacityAnimation = CABasicAnimation(keyPath: "opacity")
+        opacityAnimation.fromValue = 0
+        opacityAnimation.toValue = 0.8
+        opacityAnimation.duration = 0.1
+        opacityAnimation.fillMode = .forwards
+        
+        // 淡出动画
+        let fadeOutAnimation = CABasicAnimation(keyPath: "opacity")
+        fadeOutAnimation.fromValue = 0.8
+        fadeOutAnimation.toValue = 0
+        fadeOutAnimation.beginTime = 0.1
+        fadeOutAnimation.duration = 0.2
+        
+        animationGroup.animations = [opacityAnimation, fadeOutAnimation]
+        
+        CATransaction.begin()
+        CATransaction.setCompletionBlock {
+            flashLayer.removeFromSuperlayer()
+            completion?()
+        }
+        flashLayer.add(animationGroup, forKey: "flashAnimation")
+        CATransaction.commit()
+    }
+}

+ 5 - 21
TSLiveWallpaper/Common/TSNetWork/TSNetWork+Business.swift

@@ -10,32 +10,16 @@ private let baseURL = "http://ai.100yearslater.com"
 private let baseChinaURL = "http://ai.100yearslater100.com"
 private let baseChinaURL = "http://ai.100yearslater100.com"
 import Alamofire
 import Alamofire
 enum TSNeURLType:String {
 enum TSNeURLType:String {
-    
-//    case imageEmoji = "/api/image/emoji"         //文生emoji
+
     case actionInfo = "/api/action/info"         //查询生成过程接口
     case actionInfo = "/api/action/info"         //查询生成过程接口
-//    case chat = "/api/text/chat"                 //AI 对话接口
-//    case textPicCreate = "/api/image/create"     //文生图
     case upload = "/api/upload"                  //上传图片
     case upload = "/api/upload"                  //上传图片
     case imageRewrite = "/api/image/rewrite"     //图生图
     case imageRewrite = "/api/image/rewrite"     //图生图
-//    case imageToImageStyle = "/api/ops/aichat-img2img-config"     //图生图 风格列表
-//    case chatV2 = "/api/text/chat/v2"             //AI 对话接口V2,扩展了 DeepSeek 深度思考
-//    
+//
     case config = "/api/ops/old-photo-config"       //App配置
     case config = "/api/ops/old-photo-config"       //App配置
     case createVideo = "/api/video/create"               //视频生成
     case createVideo = "/api/video/create"               //视频生成
-    
-//
-//    case changeAge = "/api/image/change-age"       //换年龄
-//    case subscriptionApple = "/api/subscription/apple"       //苹果订阅
-//    case changeEmotion = "/api/image/change-emotion"       //更换表情
-//    case changeHair = "/api/image/change-hair"       //更换头发
-//    case imageRestore = "/api/image/restore"          //老照片修复
-//    case eyeOpen = "/api/image/eye-open"          //睁眼
-//    case pretty = "/api/image/pretty"          //美容
-//    case photoAnimation = "/api/image/animation"          //照片变活
-//    case photoExpand = "/api/image/outpaint"          //照片扩展
-//    
-//    case overResolution = "/api/image/over-resolution"          //图片超分辨率
-//    case changeClothes = "/api/image/change-clothes"          //换衣服
+    case imageInpaint = "/api/image/inpaint"             //图片涂抹
+
+
 
 
     
     
     func getUrlString() -> String {
     func getUrlString() -> String {

+ 59 - 0
TSLiveWallpaper/Common/Tool/TSCommonTool/TSCommonTool.swift

@@ -224,3 +224,62 @@ func kPercentlocalized(_ num:Int)-> String{
 let kAppName:String = "Old Photo"
 let kAppName:String = "Old Photo"
 let kUploadImageMaxBit10Size:Int = 10 * 1024 * 1024 //10M
 let kUploadImageMaxBit10Size:Int = 10 * 1024 * 1024 //10M
 let kUploadImageMaxBit5Size:Int = 5 * 1024 * 1024 //5M
 let kUploadImageMaxBit5Size:Int = 5 * 1024 * 1024 //5M
+
+
+func kShareContent(target: UIViewController,anyData:Any) {
+    let text = "Turn yourself into a Ghibli style with AI magic! 🎨✨ This app creates stunning anime, cyberpunk & more—just upload a photo. Try it now!"
+    kShareContent(target: target, anyData: anyData, text: text)
+}
+
+func kShareContent(target: UIViewController,anyData:Any?,text:String?) {
+    let urlString = "https://apps.apple.com/app/id\(appid)"
+    var activityItems:[Any] = []
+
+    if let anyData = anyData {
+        activityItems.append(anyData)
+    }
+    
+//    if let text = text {
+//        activityItems.append(text+"\nApp:"+urlString)
+//    }
+    
+    if let url = URL(string: "https://apps.apple.com/app/id\(appid)") {
+        activityItems.append(url)
+    }
+    
+    if activityItems.isEmpty {
+        return
+    }
+
+    let vc = UIActivityViewController(activityItems: activityItems, applicationActivities: nil)
+    vc.completionWithItemsHandler = { activity,completed, returnedItems, error in
+        switch activity {
+        case .copyToPasteboard:
+            UIPasteboard.general.string = text
+        case .saveToCameraRoll:
+            dePrint("保存到了相册")
+            kSaveSuccesswShared.show(atView:target.view)
+            
+            if completed{
+                TSMineVM.kFirstSaveRateAction()
+            }else {  // 用户取消分享
+                if let error = error {
+                    dePrint("分享失败: \(error.localizedDescription)")
+                } else {
+                    dePrint("用户取消分享")
+                }
+            }
+        
+        default:
+            dePrint("")
+        }
+    }
+
+    if UIDevice.current.userInterfaceIdiom == .pad {
+        vc.modalPresentationStyle = .popover
+        vc.popoverPresentationController?.sourceView = target.view
+        vc.popoverPresentationController?.sourceRect = target.view.bounds
+    }
+    
+    target.present(vc, animated: true)
+}

+ 5 - 4
TSLiveWallpaper/Data/Model/TSActionInfoModel.swift

@@ -87,20 +87,21 @@ class TSActionRequestModel : TSBaseModel {
     var imageUrl:String = ""
     var imageUrl:String = ""
     var imageUrlTimestamp:Int = 0
     var imageUrlTimestamp:Int = 0
     var generatorStyle:TSGeneratorImageStyle = .enhance
     var generatorStyle:TSGeneratorImageStyle = .enhance
-    
-    //暂时用不到,以后再说
     var model:String = ""   //决定生图的模型
     var model:String = ""   //决定生图的模型
-    
+    var maskUrl:String = ""
+    var imageUrls:[String] = []
+
     override func mapping(map: ObjectMapper.Map) {
     override func mapping(map: ObjectMapper.Map) {
         prompt              <- map["prompt"]
         prompt              <- map["prompt"]
         inputText           <- map["inputText"]
         inputText           <- map["inputText"]
         width               <- map["width"]
         width               <- map["width"]
         height              <- map["height"]
         height              <- map["height"]
-        
+        imageUrls            <- map["imageUrls"]
         imageUrl            <- map["imageUrl"]
         imageUrl            <- map["imageUrl"]
         imageUrlTimestamp   <- map["imageUrlTimestamp"]
         imageUrlTimestamp   <- map["imageUrlTimestamp"]
         generatorStyle      <- map["generatorStyle"]
         generatorStyle      <- map["generatorStyle"]
         model               <- map["model"]
         model               <- map["model"]
+        maskUrl             <- map["maskUrl"]
     }
     }
 }
 }
 
 

+ 108 - 72
TSLiveWallpaper/Data/OperationQueue/TSGenerateBaseOperation/TSGenerateBasePhotoOperation.swift

@@ -121,6 +121,7 @@ class TSGenerateBasePhotoOperation: TSGenerateBaseOperation , @unchecked Sendabl
         infoModel.request = TSActionRequestModel()
         infoModel.request = TSActionRequestModel()
         infoModel.request.imageUrl = upLoadImageUrl
         infoModel.request.imageUrl = upLoadImageUrl
         infoModel.request.imageUrlTimestamp = Date.timestampInt
         infoModel.request.imageUrlTimestamp = Date.timestampInt
+        infoModel.request.imageUrls = generateStyleModel.upLoadImageUrls
         
         
         infoModel.request.prompt = generateStyleModel.prompt
         infoModel.request.prompt = generateStyleModel.prompt
         infoModel.request.inputText = generateStyleModel.inputText
         infoModel.request.inputText = generateStyleModel.inputText
@@ -129,42 +130,7 @@ class TSGenerateBasePhotoOperation: TSGenerateBaseOperation , @unchecked Sendabl
         
         
         return infoModel
         return infoModel
     }
     }
-    
-    func uploadImage(generateStyleModel:TSAIListPhotoGeneratorModel,complete:@escaping (TSActionInfoModel?)->Void) {
-        let upLoadImage = generateStyleModel.upLoadImage
-        if let imageUrl = generateStyleModel.upLoadImageUrl,imageUrl.contains("http") {
-            complete(createActionInfoModel(generateStyleModel: generateStyleModel))
-            return
-        }
-        
-        stopNetwork = false
-        stateDatauPblished = (.start,nil)
-        
-        stateDatauPblished = (.progressString(uploadingPhoto(progress: 0.0)),currentActionInfoModel)
-        uploadRequest = TSNetworkShared.uploadImage(upLoadImage: upLoadImage, maxKb: imageMaxKb) { [weak self]  progress in
-            guard let self = self else { return }
-            if generatingProgress == 0 {
-                stateDatauPblished = (.progressString(uploadingPhoto(progress: progress)),currentActionInfoModel)
-            }
-        } completion: { [weak self]  data, error in
-            guard let self = self else { return }
-            if stopNetwork == true { return }
-            if let error = error {
-                generateStyleModel.upLoadImageUrl = nil
-                self.stateDatauPblished = (TSProgressState.getFailed(error.tsDesc,error.tsCode),nil)
-                complete(nil)
-            }else{
-                if let string = data as? String {
-                    generateStyleModel.upLoadImageUrl = string
-                    TSImageStoreTool.storeImage(image: upLoadImage, urlString: string)
 
 
-                    complete(createActionInfoModel(generateStyleModel: generateStyleModel))
-                }else{
-                    complete(nil)
-                }
-            }
-        }
-    }
     
     
     func creatImage(oldModel:TSActionInfoModel,complete:@escaping (Bool)->Void) {
     func creatImage(oldModel:TSActionInfoModel,complete:@escaping (Bool)->Void) {
         
         
@@ -182,43 +148,6 @@ class TSGenerateBasePhotoOperation: TSGenerateBaseOperation , @unchecked Sendabl
         
         
         stateDatauPblished = (.progressString(generating(progress: 0.0)),currentActionInfoModel)
         stateDatauPblished = (.progressString(generating(progress: 0.0)),currentActionInfoModel)
  
  
-        
-//        let request = currentActionInfoModel.request
-//        var urlType:TSNeURLType = .imageRewrite
-//        var postDict:[String:Any] = [
-//            "device":getUserInfoJsonString(),
-//            "imageUrl":request.imageUrl,
-//            "model":request.generatorStyle.aiModel
-//        ]
-//        switch request.generatorStyle {
-//        case .enhance:
-//            urlType = .imageRewrite
-//            postDict["prompt"] = "把图片变清晰"
-//        case .colorize:
-//            urlType = .imageRewrite
-//            postDict["prompt"] = "Add suitable colors to photos"
-//        case .descratch:
-//            urlType = .imageRewrite
-//            postDict["prompt"] = "Remove the photo's scratches and dirt"
-//        case .enlighten:
-//            urlType = .imageRewrite
-//            postDict["prompt"] = "Adjust the light and darkness of the photo to make the overall look coordinated"
-//            
-//        case .recreate:
-//            urlType = .imageRewrite
-//            postDict["prompt"] = "Recreate damaged portraits and added suitable color for photo"
-//            
-//        case .creatVideo:
-//            urlType = .createVideo
-//            postDict["prompt"] = request.prompt
-//            postDict["duration"] = 5
-//            postDict["quality"] = "720p"
-//            
-//        default:
-//            urlType = .imageRewrite
-//            postDict["prompt"] = "把图片变清晰"
-//        }
-
         guard let getPostContent = getPostContent() else { return }
         guard let getPostContent = getPostContent() else { return }
         creatRequest = TSNetworkShared.post(urlType: getPostContent.0,parameters: getPostContent.1) { [weak self] data,error in
         creatRequest = TSNetworkShared.post(urlType: getPostContent.0,parameters: getPostContent.1) { [weak self] data,error in
             guard let self = self else { return }
             guard let self = self else { return }
@@ -276,6 +205,110 @@ class TSGenerateBasePhotoOperation: TSGenerateBaseOperation , @unchecked Sendabl
         creatRequest?.cancel()
         creatRequest?.cancel()
     }
     }
 }
 }
+
+
+extension TSGenerateBasePhotoOperation {
+    
+    //上传一张图片
+    func uploadImage(generateStyleModel:TSAIListPhotoGeneratorModel,complete:@escaping (TSActionInfoModel?)->Void) {
+        //走多张图片上传逻辑
+        if let upLoadImages = generateStyleModel.upLoadImages ,upLoadImages.count > 0{
+            uploadImages(generateStyleModel: generateStyleModel, complete: complete)
+            return
+        }
+        
+        let upLoadImage = generateStyleModel.upLoadImage
+        if let imageUrl = generateStyleModel.upLoadImageUrl,imageUrl.contains("http") {
+            complete(createActionInfoModel(generateStyleModel: generateStyleModel))
+            return
+        }
+        
+        stopNetwork = false
+        stateDatauPblished = (.start,nil)
+        
+        stateDatauPblished = (.progressString(uploadingPhoto(progress: 0.0)),currentActionInfoModel)
+        uploadRequest = TSNetworkShared.uploadImage(upLoadImage: upLoadImage, maxKb: imageMaxKb) { [weak self]  progress in
+            guard let self = self else { return }
+            if generatingProgress == 0 {
+                stateDatauPblished = (.progressString(uploadingPhoto(progress: progress)),currentActionInfoModel)
+            }
+        } completion: { [weak self]  data, error in
+            guard let self = self else { return }
+            if stopNetwork == true { return }
+            if let error = error {
+                generateStyleModel.upLoadImageUrl = nil
+                self.stateDatauPblished = (TSProgressState.getFailed(error.tsDesc,error.tsCode),nil)
+                complete(nil)
+            }else{
+                if let string = data as? String {
+                    generateStyleModel.upLoadImageUrl = string
+                    TSImageStoreTool.storeImage(image: upLoadImage, urlString: string)
+
+                    complete(createActionInfoModel(generateStyleModel: generateStyleModel))
+                }else{
+                    complete(nil)
+                }
+            }
+        }
+    }
+    
+    //上传多张图片
+    func uploadImages(generateStyleModel:TSAIListPhotoGeneratorModel,complete:@escaping (TSActionInfoModel?)->Void) {
+        guard let upLoadImages = generateStyleModel.upLoadImages else { return }
+        
+        var uploadImageUrls = [String?](repeating: nil, count: upLoadImages.count) // 预分配数组,保持原始顺序
+        var errorOccurred = false
+        
+        let progressRatio:Float = 1.0/Float(upLoadImages.count)//进度分割比例
+        var totalProgress:Float = 0.0//总进度
+        
+        stopNetwork = false
+        stateDatauPblished = (.start,nil)
+        stateDatauPblished = (.progressString(uploadingPhoto(progress: 0.0)),nil)
+        
+        let group = DispatchGroup()
+        for (index, image) in upLoadImages.enumerated() {
+            group.enter()
+            uploadRequest = TSNetworkShared.uploadImage(upLoadImage: image, maxKb: generateStyleModel.generatorStyle.imageMaxKb) { [weak self]  progress in
+                guard let self = self else { return }
+                totalProgress+=progress*progressRatio
+                stateDatauPblished = (.progressString(uploadingPhoto(progress: totalProgress)),nil)
+            } completion: { [weak self]  data, error in
+                guard let self = self else { return }
+                if let error = error {
+                    errorOccurred = true
+                    self.stateDatauPblished = (TSProgressState.getFailed(error.tsDesc,error.tsCode),nil)
+                }else{
+                    if let string = data as? String {
+                        // 按照原始索引位置存储结果
+                        uploadImageUrls[index] = string
+                    }
+                }
+                group.leave()
+            }
+        }
+
+        group.notify(queue: .main) {
+            if !errorOccurred && uploadImageUrls.compactMap({ $0 }).count == upLoadImages.count {
+                // 所有图片上传成功,且顺序已保持
+                let successfulUrls = uploadImageUrls.compactMap { $0 }
+                
+                generateStyleModel.upLoadImageUrl = successfulUrls.first
+                generateStyleModel.upLoadImageUrls = successfulUrls
+                
+                // 存储图片到本地(顺序一致)
+                 for (index, url) in successfulUrls.enumerated() {
+                     TSImageStoreTool.storeImage(image: upLoadImages[index], urlString: url)
+                 }
+                complete(self.createActionInfoModel(generateStyleModel: generateStyleModel))
+            }else{
+                self.stateDatauPblished = (TSProgressState.generalNormalFailed,nil)
+                complete(nil)
+            }
+        }
+    }
+    
+}
 extension TSGenerateBasePhotoOperation {
 extension TSGenerateBasePhotoOperation {
 
 
     func getPostContent()->(TSNeURLType,[String:Any])?{
     func getPostContent()->(TSNeURLType,[String:Any])?{
@@ -293,6 +326,9 @@ extension TSGenerateBasePhotoOperation {
             postDict["prompt"] = request.prompt
             postDict["prompt"] = request.prompt
             postDict["duration"] = 5
             postDict["duration"] = 5
             postDict["quality"] = "720p"
             postDict["quality"] = "720p"
+        case .remove:
+            urlType = .imageInpaint
+            postDict["maskUrl"] = request.imageUrls.last ?? request.imageUrl
         default:
         default:
             postDict["prompt"] = request.prompt
             postDict["prompt"] = request.prompt
             break;
             break;

+ 10 - 1
TSLiveWallpaper/Data/TSDBManager/TSDBActionInfoModel.swift

@@ -131,6 +131,9 @@ class TSDBActionRequestModel : Object {
     
     
     @Persisted var imageUrl:String = ""
     @Persisted var imageUrl:String = ""
     @Persisted var imageUrlTimestamp:Int = 0
     @Persisted var imageUrlTimestamp:Int = 0
+    @Persisted var imageUrls = List<String>()//惰性加载特性
+    @Persisted var maskUrl:String = ""
+    
     
     
     @Persisted var model:String = ""
     @Persisted var model:String = ""
     @Persisted var generatorStyle:String = ""
     @Persisted var generatorStyle:String = ""
@@ -152,6 +155,11 @@ class TSDBActionRequestModel : Object {
 
 
         self.model = requestModel.model
         self.model = requestModel.model
         self.generatorStyle = requestModel.generatorStyle.rawValue
         self.generatorStyle = requestModel.generatorStyle.rawValue
+        
+        let list = List<String>()
+        list.append(objectsIn: requestModel.imageUrls)
+        self.imageUrls = list
+        self.maskUrl = requestModel.maskUrl
     }
     }
     
     
     
     
@@ -164,7 +172,8 @@ class TSDBActionRequestModel : Object {
         
         
         model.imageUrl = self.imageUrl
         model.imageUrl = self.imageUrl
         model.imageUrlTimestamp = self.imageUrlTimestamp
         model.imageUrlTimestamp = self.imageUrlTimestamp
- 
+        model.imageUrls = Array(self.imageUrls)
+        model.maskUrl = self.maskUrl
         model.model = self.model
         model.model = self.model
         model.generatorStyle = TSGeneratorImageStyle(rawValue: self.generatorStyle) ?? .enhance
         model.generatorStyle = TSGeneratorImageStyle(rawValue: self.generatorStyle) ?? .enhance
         
         

+ 2 - 1
TSLiveWallpaper/Data/TSRealmManager/TSRealmManager.swift

@@ -24,9 +24,10 @@ class TSRealmManager {
         /*设置新的版本号
         /*设置新的版本号
          3.6.1 ->4
          3.6.1 ->4
          3.6.6 ->7
          3.6.6 ->7
+         3.6.8 ->8
          **/
          **/
    
    
-        let newSchemaVersion: UInt64 = 7
+        let newSchemaVersion: UInt64 = 8
         // 获取默认配置
         // 获取默认配置
         var config = Realm.Configuration.defaultConfiguration
         var config = Realm.Configuration.defaultConfiguration
         // 设置新版本号
         // 设置新版本号

+ 1 - 1
TSLiveWallpaper/LaunchVC/TSLaunchVC.swift

@@ -109,7 +109,7 @@ class TSLaunchVC: UIViewController {
 //        launchView.frame = UIScreen.main.bounds
 //        launchView.frame = UIScreen.main.bounds
         
         
         let launchView = UIImageView(frame: UIScreen.main.bounds)
         let launchView = UIImageView(frame: UIScreen.main.bounds)
-        launchView.image = UIImage(named: "launch3")
+        launchView.image = UIImage(named: "launch4")
         launchView.contentMode = .scaleAspectFit
         launchView.contentMode = .scaleAspectFit
         view.addSubview(launchView)
         view.addSubview(launchView)
     }
     }

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

@@ -140,3 +140,15 @@
 "Update" = "تحديث";
 "Update" = "تحديث";
 "Adjust Light Tips" = "نصائح لضبط الإضاءة";
 "Adjust Light Tips" = "نصائح لضبط الإضاءة";
 "Update to PRO" = "التحديث إلى PRO";
 "Update to PRO" = "التحديث إلى PRO";
+
+"Say Hi" = "قل مرحبا";
+"Smile" = "يبتسم";
+"Hug" = "حضن";
+"Heart Gesture" = "لفتة القلب";
+"Forehead Kiss" = "قبلة الجبين";
+"Kiss" = "قبلة";
+"Blow Kiss" = "قبلة ضربة";
+"Stroll" = "نزهة";
+"Select the unwanted area and remove them easily" = "حدد المنطقة غير المرغوب فيها ثم قم بإزالتها بسهولة";
+"Remove Objects" = "إزالة الكائنات";
+"Remove" = "يزيل";

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

@@ -139,3 +139,15 @@
 "Update" = "Update";
 "Update" = "Update";
 "Adjust Light Tips" = "Adjust Light Tips";
 "Adjust Light Tips" = "Adjust Light Tips";
 "Update to PRO" = "Update to PRO";
 "Update to PRO" = "Update to PRO";
+
+"Say Hi" = "Say Hi";
+"Smile" = "Smile";
+"Hug" = "Hug";
+"Heart Gesture" = "Heart Gesture";
+"Forehead Kiss" = "Forehead Kiss";
+"Kiss" = "Kiss";
+"Blow Kiss" = "Blow Kiss";
+"Stroll" = "Stroll";
+"Select the unwanted area and remove them easily" = "Select the unwanted area and remove them easily";
+"Remove Objects" = "Remove Objects";
+"Remove" = "Remove";

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

@@ -140,3 +140,15 @@
 "Update" = "Actualizar";
 "Update" = "Actualizar";
 "Adjust Light Tips" = "Consejos para ajustar la luz";
 "Adjust Light Tips" = "Consejos para ajustar la luz";
 "Update to PRO" = "Actualización a PRO";
 "Update to PRO" = "Actualización a PRO";
+
+"Say Hi" = "Saluda";
+"Smile" = "Sonrisa";
+"Hug" = "Abrazo";
+"Heart Gesture" = "Gesto del corazón";
+"Forehead Kiss" = "Beso en la frente";
+"Kiss" = "Beso";
+"Blow Kiss" = "Beso soplado";
+"Stroll" = "Paseo";
+"Select the unwanted area and remove them easily" = "Seleccione el área no deseada y elimínela fácilmente";
+"Remove Objects" = "Eliminar objetos";
+"Remove" = "Eliminar";

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

@@ -138,3 +138,15 @@
 "%d%" = "%d%%";
 "%d%" = "%d%%";
 "Adjust Light Tips" = "光調整のヒント";
 "Adjust Light Tips" = "光調整のヒント";
 "Update to PRO" = "PROにアップデート";
 "Update to PRO" = "PROにアップデート";
+
+"Say Hi" = "こんにちは";
+"Smile" = "笑顔";
+"Hug" = "ハグ";
+"Heart Gesture" = "ハートのジェスチャー";
+"Forehead Kiss" = "額キス";
+"Kiss" = "キス";
+"Blow Kiss" = "投げキス";
+"Stroll" = "散歩";
+"Select the unwanted area and remove them easily" = "不要な部分を選択して簡単に削除できます";
+"Remove Objects" = "オブジェクトを削除";
+"Remove" = "取り除く";

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

@@ -138,3 +138,15 @@
 "%d%" = "%d%%";
 "%d%" = "%d%%";
 "Adjust Light Tips" = "조명 조절 팁";
 "Adjust Light Tips" = "조명 조절 팁";
 "Update to PRO" = "PRO로 업데이트";
 "Update to PRO" = "PRO로 업데이트";
+
+"Say Hi" = "안녕하세요";
+"Smile" = "웃다";
+"Hug" = "껴안다";
+"Heart Gesture" = "하트 제스처";
+"Forehead Kiss" = "이마 키스";
+"Kiss" = "키스";
+"Blow Kiss" = "블로우 키스";
+"Stroll" = "떠돌아 다니다";
+"Select the unwanted area and remove them easily" = "원치 않는 영역을 선택하여 쉽게 제거하세요";
+"Remove Objects" = "객체 제거";
+"Remove" = "제거하다";

BIN
TSLiveWallpaper/launch3.png


BIN
TSLiveWallpaper/launch4.png


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

@@ -138,3 +138,15 @@
 "%d%" = "%d%%";
 "%d%" = "%d%%";
 "Adjust Light Tips" = "光線調整提示";
 "Adjust Light Tips" = "光線調整提示";
 "Update to PRO" = "升級成為會員";
 "Update to PRO" = "升級成為會員";
+
+"Say Hi" = "打招呼";
+"Smile" = "微笑";
+"Hug" = "擁抱";
+"Heart Gesture" = "心形手勢";
+"Forehead Kiss" = "額頭之吻";
+"Kiss" = "吻";
+"Blow Kiss" = "飛吻";
+"Stroll" = "漫步";
+"Select the unwanted area and remove them easily" = "選擇不需要的區域並輕鬆刪除它們";
+"Remove Objects" = "移除對象";
+"Remove" = "消除";