Ver código fonte

2.6(1)打包

100Years 2 semanas atrás
pai
commit
651fa7dd0e
61 arquivos alterados com 1149 adições e 393 exclusões
  1. 34 6
      AIEmoji.xcodeproj/project.pbxproj
  2. 22 0
      AIEmoji/Assets.xcassets/Common/launch_text.imageset/Contents.json
  3. BIN
      AIEmoji/Assets.xcassets/Common/launch_text.imageset/launch_text@2x.png
  4. BIN
      AIEmoji/Assets.xcassets/Common/launch_text.imageset/launch_text@3x.png
  5. 2 1
      AIEmoji/Assets.xcassets/PTP/ptp_example_image0.imageset/Contents.json
  6. BIN
      AIEmoji/Assets.xcassets/PTP/ptp_example_image0.imageset/ptp_example_image0.png
  7. BIN
      AIEmoji/Assets.xcassets/PTP/ptp_example_image0.imageset/ptp_example_image0@2x.png
  8. BIN
      AIEmoji/Assets.xcassets/PTP/ptp_example_image0.imageset/ptp_example_image0@3x.png
  9. 2 1
      AIEmoji/Assets.xcassets/PTP/ptp_example_image1.imageset/Contents.json
  10. BIN
      AIEmoji/Assets.xcassets/PTP/ptp_example_image1.imageset/ptp_example_image1.png
  11. BIN
      AIEmoji/Assets.xcassets/PTP/ptp_example_image1.imageset/ptp_example_image1@2x.png
  12. BIN
      AIEmoji/Assets.xcassets/PTP/ptp_example_image1.imageset/ptp_example_image1@3x.png
  13. 22 0
      AIEmoji/Assets.xcassets/PTP/ptp_upload_example.imageset/Contents.json
  14. BIN
      AIEmoji/Assets.xcassets/PTP/ptp_upload_example.imageset/ptp_upload_example@2x.png
  15. BIN
      AIEmoji/Assets.xcassets/PTP/ptp_upload_example.imageset/ptp_upload_example@3x.png
  16. 22 0
      AIEmoji/Assets.xcassets/PTP/textToEmoji_banner.imageset/Contents.json
  17. BIN
      AIEmoji/Assets.xcassets/PTP/textToEmoji_banner.imageset/textToEmoji_banner@2x.png
  18. BIN
      AIEmoji/Assets.xcassets/PTP/textToEmoji_banner.imageset/textToEmoji_banner@3x.png
  19. 22 0
      AIEmoji/Assets.xcassets/PTP/textToPhoto_banner.imageset/Contents.json
  20. BIN
      AIEmoji/Assets.xcassets/PTP/textToPhoto_banner.imageset/textToPhoto_banner@2x.png
  21. BIN
      AIEmoji/Assets.xcassets/PTP/textToPhoto_banner.imageset/textToPhoto_banner@3x.png
  22. BIN
      AIEmoji/Assets.xcassets/VIP/purchase_bj.imageset/purchase_bj@2x.png
  23. BIN
      AIEmoji/Assets.xcassets/VIP/purchase_bj.imageset/purchase_bj@3x.png
  24. 22 0
      AIEmoji/Assets.xcassets/VIP/vip_feature_1.imageset/Contents.json
  25. BIN
      AIEmoji/Assets.xcassets/VIP/vip_feature_1.imageset/vip_feature_1@2x.png
  26. BIN
      AIEmoji/Assets.xcassets/VIP/vip_feature_1.imageset/vip_feature_1@3x.png
  27. 22 0
      AIEmoji/Assets.xcassets/VIP/vip_feature_2.imageset/Contents.json
  28. BIN
      AIEmoji/Assets.xcassets/VIP/vip_feature_2.imageset/vip_feature_2@2x.png
  29. BIN
      AIEmoji/Assets.xcassets/VIP/vip_feature_2.imageset/vip_feature_2@3x.png
  30. 22 0
      AIEmoji/Assets.xcassets/VIP/vip_feature_3.imageset/Contents.json
  31. BIN
      AIEmoji/Assets.xcassets/VIP/vip_feature_3.imageset/vip_feature_3@2x.png
  32. BIN
      AIEmoji/Assets.xcassets/VIP/vip_feature_3.imageset/vip_feature_3@3x.png
  33. 22 0
      AIEmoji/Assets.xcassets/VIP/vip_feature_4.imageset/Contents.json
  34. BIN
      AIEmoji/Assets.xcassets/VIP/vip_feature_4.imageset/vip_feature_4@2x.png
  35. BIN
      AIEmoji/Assets.xcassets/VIP/vip_feature_4.imageset/vip_feature_4@3x.png
  36. 3 3
      AIEmoji/Base.lproj/LaunchScreen.storyboard
  37. 2 28
      AIEmoji/Business/TSEmojisVC/TSEmojisVC/TSEmojisVC.swift
  38. 2 0
      AIEmoji/Business/TSGenmojiVC/TSGenmojiVC/View/TSGenmojiItemCell.swift
  39. 7 4
      AIEmoji/Business/TSGenmojiVC/TSGenmojiVC/ViewModel/TSGenmojiCollectionViewModel.swift
  40. 309 0
      AIEmoji/Business/TSPTPGeneratorVC/TSAIPhotoGeneratorBaseVC/TSAIPhotoBrowseVC.swift
  41. 151 0
      AIEmoji/Business/TSPTPGeneratorVC/TSAIPhotoGeneratorBaseVC/TSAIPhotoGeneratorBaseVC.swift
  42. 32 100
      AIEmoji/Business/TSPTPGeneratorVC/TSPTPGeneratorVC/TSPTPGeneratorVC.swift
  43. 57 1
      AIEmoji/Business/TSPTPGeneratorVC/TSPTPGeneratorVC/VM/TSPTPGeneratorVM.swift
  44. 26 2
      AIEmoji/Business/TSPTPGeneratorVC/TSPhotoToPhotoVC/Cell/TSPTPUploadCell.swift
  45. 43 6
      AIEmoji/Business/TSPTPGeneratorVC/TSPhotoToPhotoVC/TSPhotoToPhotoVC.swift
  46. 1 1
      AIEmoji/Business/TSPTPGeneratorVC/TSPhotoToPhotoVC/VM/TSPhotoToPhotoVM.swift
  47. 49 19
      AIEmoji/Business/TSPurchaseMembershipVC/TSPurchaseVC.swift
  48. 40 4
      AIEmoji/Business/TSSetingVC/SetingVC/View/SettingPurchaseTopView.swift
  49. 1 1
      AIEmoji/Business/TSTabBarController/TSTabBarController.swift
  50. 1 1
      AIEmoji/Business/TSTextGeneralPictureVC/TSTextGeneralPictureVC/TSTextGeneralPictureVC.swift
  51. 33 125
      AIEmoji/Business/TSTextGeneralPictureVC/TSTextPicGennerateVC/TSTextPicGennerateVC.swift
  52. 32 0
      AIEmoji/Business/TSTextGeneralPictureVC/TSTextPicGennerateVC/TSTextPicGennerateVM.swift
  53. 2 34
      AIEmoji/Business/VIewTool/TSCommonloadingView.swift
  54. 136 0
      AIEmoji/Business/VIewTool/TSGeneratorloadingView.swift
  55. 4 1
      AIEmoji/Common/Ex/UIFont+TSEx.swift
  56. 1 0
      AIEmoji/Common/Tool/TSCommonTool/TSCommonTool.swift
  57. 0 54
      AIEmoji/DataManger/Config/TSConfig.swift
  58. 3 1
      AIEmoji/Info.plist
  59. 0 0
      AIEmoji/Res/AccentURW-Reg.ttf
  60. BIN
      AIEmoji/Res/Kelsi-Regular.otf
  61. BIN
      AIEmoji/Res/Kelsi-fill.otf

+ 34 - 6
AIEmoji.xcodeproj/project.pbxproj

@@ -92,7 +92,12 @@
 		A80EDE082D700395003CD332 /* rotatingAnimation.gif in Resources */ = {isa = PBXBuildFile; fileRef = A80EDE072D700395003CD332 /* rotatingAnimation.gif */; };
 		A83404C82D9BEC0E00C140E4 /* UIFont+TSEx.swift in Sources */ = {isa = PBXBuildFile; fileRef = A83404C72D9BEC0700C140E4 /* UIFont+TSEx.swift */; };
 		A83404CC2D9BEED800C140E4 /* Poppins-BlackItalic.ttf in Resources */ = {isa = PBXBuildFile; fileRef = A83404CB2D9BEED800C140E4 /* Poppins-BlackItalic.ttf */; };
-		A83404CE2D9BF0D600C140E4 /* AccentURW.ttf in Resources */ = {isa = PBXBuildFile; fileRef = A83404CD2D9BF0D600C140E4 /* AccentURW.ttf */; };
+		A83404D12D9D16FA00C140E4 /* TSAIPhotoGeneratorBaseVC.swift in Sources */ = {isa = PBXBuildFile; fileRef = A83404D02D9D16F800C140E4 /* TSAIPhotoGeneratorBaseVC.swift */; };
+		A83404D32D9D23FA00C140E4 /* TSGeneratorloadingView.swift in Sources */ = {isa = PBXBuildFile; fileRef = A83404D22D9D23CA00C140E4 /* TSGeneratorloadingView.swift */; };
+		A83404D52D9D28D700C140E4 /* TSAIPhotoBrowseVC.swift in Sources */ = {isa = PBXBuildFile; fileRef = A83404D42D9D28CE00C140E4 /* TSAIPhotoBrowseVC.swift */; };
+		A83404D82D9D34ED00C140E4 /* Kelsi-fill.otf in Resources */ = {isa = PBXBuildFile; fileRef = A83404D62D9D34ED00C140E4 /* Kelsi-fill.otf */; };
+		A83404D92D9D34ED00C140E4 /* Kelsi-Regular.otf in Resources */ = {isa = PBXBuildFile; fileRef = A83404D72D9D34ED00C140E4 /* Kelsi-Regular.otf */; };
+		A83404DB2D9D382200C140E4 /* AccentURW-Reg.ttf in Resources */ = {isa = PBXBuildFile; fileRef = A83404DA2D9D382200C140E4 /* AccentURW-Reg.ttf */; };
 		A85E478F2D67115A0018D62D /* TSTextGeneralPictureVC.swift in Sources */ = {isa = PBXBuildFile; fileRef = A85E478E2D6711590018D62D /* TSTextGeneralPictureVC.swift */; };
 		A85E47922D6728A00018D62D /* TSTextGeneralPictureVM.swift in Sources */ = {isa = PBXBuildFile; fileRef = A85E47912D67289F0018D62D /* TSTextGeneralPictureVM.swift */; };
 		A85E47962D672ADA0018D62D /* TSTextPicGennerateVC.swift in Sources */ = {isa = PBXBuildFile; fileRef = A85E47952D672AD90018D62D /* TSTextPicGennerateVC.swift */; };
@@ -286,7 +291,12 @@
 		A80EDE072D700395003CD332 /* rotatingAnimation.gif */ = {isa = PBXFileReference; lastKnownFileType = image.gif; path = rotatingAnimation.gif; sourceTree = "<group>"; };
 		A83404C72D9BEC0700C140E4 /* UIFont+TSEx.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "UIFont+TSEx.swift"; sourceTree = "<group>"; };
 		A83404CB2D9BEED800C140E4 /* Poppins-BlackItalic.ttf */ = {isa = PBXFileReference; lastKnownFileType = file; path = "Poppins-BlackItalic.ttf"; sourceTree = "<group>"; };
-		A83404CD2D9BF0D600C140E4 /* AccentURW.ttf */ = {isa = PBXFileReference; lastKnownFileType = file; path = AccentURW.ttf; sourceTree = "<group>"; };
+		A83404D02D9D16F800C140E4 /* TSAIPhotoGeneratorBaseVC.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TSAIPhotoGeneratorBaseVC.swift; sourceTree = "<group>"; };
+		A83404D22D9D23CA00C140E4 /* TSGeneratorloadingView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TSGeneratorloadingView.swift; sourceTree = "<group>"; };
+		A83404D42D9D28CE00C140E4 /* TSAIPhotoBrowseVC.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TSAIPhotoBrowseVC.swift; sourceTree = "<group>"; };
+		A83404D62D9D34ED00C140E4 /* Kelsi-fill.otf */ = {isa = PBXFileReference; lastKnownFileType = file; path = "Kelsi-fill.otf"; sourceTree = "<group>"; };
+		A83404D72D9D34ED00C140E4 /* Kelsi-Regular.otf */ = {isa = PBXFileReference; lastKnownFileType = file; path = "Kelsi-Regular.otf"; sourceTree = "<group>"; };
+		A83404DA2D9D382200C140E4 /* AccentURW-Reg.ttf */ = {isa = PBXFileReference; lastKnownFileType = file; path = "AccentURW-Reg.ttf"; sourceTree = "<group>"; };
 		A85E478E2D6711590018D62D /* TSTextGeneralPictureVC.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TSTextGeneralPictureVC.swift; sourceTree = "<group>"; };
 		A85E47912D67289F0018D62D /* TSTextGeneralPictureVM.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TSTextGeneralPictureVM.swift; sourceTree = "<group>"; };
 		A85E47952D672AD90018D62D /* TSTextPicGennerateVC.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TSTextPicGennerateVC.swift; sourceTree = "<group>"; };
@@ -887,6 +897,7 @@
 		A80EDDDC2D6EB17D003CD332 /* TSPTPGeneratorVC */ = {
 			isa = PBXGroup;
 			children = (
+				A83404CF2D9D16E400C140E4 /* TSAIPhotoGeneratorBaseVC */,
 				A80EDE042D6F3429003CD332 /* TSPTPBrowseVC */,
 				A80EDDE92D6EBFF1003CD332 /* TSPhotoToPhotoVC */,
 				A80EDDDD2D6EB19A003CD332 /* TSPTPGeneratorVC */,
@@ -980,6 +991,15 @@
 			path = Ex;
 			sourceTree = "<group>";
 		};
+		A83404CF2D9D16E400C140E4 /* TSAIPhotoGeneratorBaseVC */ = {
+			isa = PBXGroup;
+			children = (
+				A83404D02D9D16F800C140E4 /* TSAIPhotoGeneratorBaseVC.swift */,
+				A83404D42D9D28CE00C140E4 /* TSAIPhotoBrowseVC.swift */,
+			);
+			path = TSAIPhotoGeneratorBaseVC;
+			sourceTree = "<group>";
+		};
 		A85E478D2D670DF10018D62D /* TSTextGeneralPictureVC */ = {
 			isa = PBXGroup;
 			children = (
@@ -1374,6 +1394,7 @@
 			children = (
 				A89EA6B92D5DDE4E000EB181 /* TSPageNullView.swift */,
 				A8F7763B2D3B429A00AA6E93 /* TSCommonloadingView.swift */,
+				A83404D22D9D23CA00C140E4 /* TSGeneratorloadingView.swift */,
 				A8F776282D3A709200AA6E93 /* UILabel */,
 				A8F775342D38FC9A00AA6E93 /* TSViewTool.swift */,
 			);
@@ -1550,8 +1571,10 @@
 		A8FB02AE2D3E38FA0031A396 /* Res */ = {
 			isa = PBXGroup;
 			children = (
-				A83404CD2D9BF0D600C140E4 /* AccentURW.ttf */,
+				A83404D62D9D34ED00C140E4 /* Kelsi-fill.otf */,
+				A83404D72D9D34ED00C140E4 /* Kelsi-Regular.otf */,
 				A83404CB2D9BEED800C140E4 /* Poppins-BlackItalic.ttf */,
+				A83404DA2D9D382200C140E4 /* AccentURW-Reg.ttf */,
 				A80EDE072D700395003CD332 /* rotatingAnimation.gif */,
 				A89EA6972D5B19F0000EB181 /* Butterfly🦋.json */,
 				A80E723E2D3F4D3000C64288 /* Universe🌍.json */,
@@ -1655,9 +1678,10 @@
 			isa = PBXResourcesBuildPhase;
 			buildActionMask = 2147483647;
 			files = (
+				A83404D82D9D34ED00C140E4 /* Kelsi-fill.otf in Resources */,
+				A83404D92D9D34ED00C140E4 /* Kelsi-Regular.otf in Resources */,
 				A80E72482D3F4F0A00C64288 /* templates.json in Resources */,
 				A83404CC2D9BEED800C140E4 /* Poppins-BlackItalic.ttf in Resources */,
-				A83404CE2D9BF0D600C140E4 /* AccentURW.ttf in Resources */,
 				A87587162D81734300286A66 /* text_to_photo_style.json in Resources */,
 				A8EEADD42D3E6C660032C5A0 /* Flower💐.json in Resources */,
 				A8EEADE92D3E76D90032C5A0 /* Beauty👸.json in Resources */,
@@ -1665,6 +1689,7 @@
 				A8EEADE02D3E75900032C5A0 /* Crystal🔮.json in Resources */,
 				A80E723C2D3F4CAA00C64288 /* Food🍔.json in Resources */,
 				A8EEADE72D3E76860032C5A0 /* Drink🥤.json in Resources */,
+				A83404DB2D9D382200C140E4 /* AccentURW-Reg.ttf in Resources */,
 				A80EDE082D700395003CD332 /* rotatingAnimation.gif in Resources */,
 				A8FB02D12D3E6B2A0031A396 /* Cat🐱.json in Resources */,
 				A80E72462D3F4EED00C64288 /* sticker.json in Resources */,
@@ -1839,6 +1864,7 @@
 				A83404C82D9BEC0E00C140E4 /* UIFont+TSEx.swift in Sources */,
 				A8F776482D3DE9F600AA6E93 /* TSSmallIconBrowseCell.swift in Sources */,
 				A8F7753D2D3918F800AA6E93 /* TSNetWork+Business.swift in Sources */,
+				A83404D12D9D16FA00C140E4 /* TSAIPhotoGeneratorBaseVC.swift in Sources */,
 				A80327BF2D81578900AF7878 /* TSPromptTextView.swift in Sources */,
 				A80EDE022D6F1CCD003CD332 /* TSPTPGeneratorVC.swift in Sources */,
 				A85E479F2D6859FA0018D62D /* TSRandomTextPicker.swift in Sources */,
@@ -1855,9 +1881,11 @@
 				A8F7763C2D3B429B00AA6E93 /* TSCommonloadingView.swift in Sources */,
 				A8F776322D3A771400AA6E93 /* TSGenmojiCollectionViewModel.swift in Sources */,
 				A80E721E2D3F3A7500C64288 /* DiyElement.swift in Sources */,
+				A83404D32D9D23FA00C140E4 /* TSGeneratorloadingView.swift in Sources */,
 				A8F776372D3A806E00AA6E93 /* TSGenmojiItemCell.swift in Sources */,
 				A89EA6692D59AA31000EB181 /* CameraInputBarAccessoryView.swift in Sources */,
 				A89EA66B2D59AA31000EB181 /* TSTextMessageContentCell.swift in Sources */,
+				A83404D52D9D28D700C140E4 /* TSAIPhotoBrowseVC.swift in Sources */,
 				A89EA66C2D59AA31000EB181 /* TSMessageContentCell.swift in Sources */,
 				A87587122D81702700286A66 /* TSUserDefaultData.swift in Sources */,
 				A89EA66D2D59AA31000EB181 /* TableViewCells.swift in Sources */,
@@ -1928,7 +1956,7 @@
 					"$(inherited)",
 					"@executable_path/Frameworks",
 				);
-				MARKETING_VERSION = 2.5;
+				MARKETING_VERSION = 2.6;
 				PRODUCT_BUNDLE_IDENTIFIER = com.girl.music.wallpaper;
 				PRODUCT_NAME = "$(TARGET_NAME)";
 				SUPPORTED_PLATFORMS = "iphoneos iphonesimulator";
@@ -1967,7 +1995,7 @@
 					"$(inherited)",
 					"@executable_path/Frameworks",
 				);
-				MARKETING_VERSION = 2.5;
+				MARKETING_VERSION = 2.6;
 				PRODUCT_BUNDLE_IDENTIFIER = com.girl.music.wallpaper;
 				PRODUCT_NAME = "$(TARGET_NAME)";
 				SUPPORTED_PLATFORMS = "iphoneos iphonesimulator";

+ 22 - 0
AIEmoji/Assets.xcassets/Common/launch_text.imageset/Contents.json

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

BIN
AIEmoji/Assets.xcassets/Common/launch_text.imageset/launch_text@2x.png


BIN
AIEmoji/Assets.xcassets/Common/launch_text.imageset/launch_text@3x.png


+ 2 - 1
AIEmoji/Assets.xcassets/PTP/ptp_example_image0.imageset/Contents.json

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

BIN
AIEmoji/Assets.xcassets/PTP/ptp_example_image0.imageset/ptp_example_image0.png


BIN
AIEmoji/Assets.xcassets/PTP/ptp_example_image0.imageset/ptp_example_image0@2x.png


BIN
AIEmoji/Assets.xcassets/PTP/ptp_example_image0.imageset/ptp_example_image0@3x.png


+ 2 - 1
AIEmoji/Assets.xcassets/PTP/ptp_example_image1.imageset/Contents.json

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

BIN
AIEmoji/Assets.xcassets/PTP/ptp_example_image1.imageset/ptp_example_image1.png


BIN
AIEmoji/Assets.xcassets/PTP/ptp_example_image1.imageset/ptp_example_image1@2x.png


BIN
AIEmoji/Assets.xcassets/PTP/ptp_example_image1.imageset/ptp_example_image1@3x.png


+ 22 - 0
AIEmoji/Assets.xcassets/PTP/ptp_upload_example.imageset/Contents.json

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

BIN
AIEmoji/Assets.xcassets/PTP/ptp_upload_example.imageset/ptp_upload_example@2x.png


BIN
AIEmoji/Assets.xcassets/PTP/ptp_upload_example.imageset/ptp_upload_example@3x.png


+ 22 - 0
AIEmoji/Assets.xcassets/PTP/textToEmoji_banner.imageset/Contents.json

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

BIN
AIEmoji/Assets.xcassets/PTP/textToEmoji_banner.imageset/textToEmoji_banner@2x.png


BIN
AIEmoji/Assets.xcassets/PTP/textToEmoji_banner.imageset/textToEmoji_banner@3x.png


+ 22 - 0
AIEmoji/Assets.xcassets/PTP/textToPhoto_banner.imageset/Contents.json

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

BIN
AIEmoji/Assets.xcassets/PTP/textToPhoto_banner.imageset/textToPhoto_banner@2x.png


BIN
AIEmoji/Assets.xcassets/PTP/textToPhoto_banner.imageset/textToPhoto_banner@3x.png


BIN
AIEmoji/Assets.xcassets/VIP/purchase_bj.imageset/purchase_bj@2x.png


BIN
AIEmoji/Assets.xcassets/VIP/purchase_bj.imageset/purchase_bj@3x.png


+ 22 - 0
AIEmoji/Assets.xcassets/VIP/vip_feature_1.imageset/Contents.json

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

BIN
AIEmoji/Assets.xcassets/VIP/vip_feature_1.imageset/vip_feature_1@2x.png


BIN
AIEmoji/Assets.xcassets/VIP/vip_feature_1.imageset/vip_feature_1@3x.png


+ 22 - 0
AIEmoji/Assets.xcassets/VIP/vip_feature_2.imageset/Contents.json

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

BIN
AIEmoji/Assets.xcassets/VIP/vip_feature_2.imageset/vip_feature_2@2x.png


BIN
AIEmoji/Assets.xcassets/VIP/vip_feature_2.imageset/vip_feature_2@3x.png


+ 22 - 0
AIEmoji/Assets.xcassets/VIP/vip_feature_3.imageset/Contents.json

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

BIN
AIEmoji/Assets.xcassets/VIP/vip_feature_3.imageset/vip_feature_3@2x.png


BIN
AIEmoji/Assets.xcassets/VIP/vip_feature_3.imageset/vip_feature_3@3x.png


+ 22 - 0
AIEmoji/Assets.xcassets/VIP/vip_feature_4.imageset/Contents.json

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

BIN
AIEmoji/Assets.xcassets/VIP/vip_feature_4.imageset/vip_feature_4@2x.png


BIN
AIEmoji/Assets.xcassets/VIP/vip_feature_4.imageset/vip_feature_4@3x.png


+ 3 - 3
AIEmoji/Base.lproj/LaunchScreen.storyboard

@@ -16,8 +16,8 @@
                         <rect key="frame" x="0.0" y="0.0" width="393" height="852"/>
                         <autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
                         <subviews>
-                            <imageView clipsSubviews="YES" userInteractionEnabled="NO" contentMode="scaleAspectFit" horizontalHuggingPriority="251" verticalHuggingPriority="251" image="launch_img" translatesAutoresizingMaskIntoConstraints="NO" id="FfL-7D-71P">
-                                <rect key="frame" x="91.666666666666686" y="325" width="210" height="50"/>
+                            <imageView clipsSubviews="YES" userInteractionEnabled="NO" contentMode="scaleAspectFit" horizontalHuggingPriority="251" verticalHuggingPriority="251" image="launch_text" translatesAutoresizingMaskIntoConstraints="NO" id="FfL-7D-71P">
+                                <rect key="frame" x="98" y="325" width="197" height="45.333333333333314"/>
                             </imageView>
                         </subviews>
                         <viewLayoutGuide key="safeArea" id="6Tk-OE-BBY"/>
@@ -34,6 +34,6 @@
         </scene>
     </scenes>
     <resources>
-        <image name="launch_img" width="210" height="50"/>
+        <image name="launch_text" width="197" height="45.333332061767578"/>
     </resources>
 </document>

+ 2 - 28
AIEmoji/Business/TSEmojisVC/TSEmojisVC/TSEmojisVC.swift

@@ -10,7 +10,7 @@ import JXPagingView
 class TSEmojisVC: TSBaseVC {
     
     let viewModel = TSEmojisColViewModel()
-    var tableHeaderViewHeight: Int = 150
+    var tableHeaderViewHeight: Int = 0//150
     var headerInSectionHeight: Int = 50
     
     
@@ -34,19 +34,6 @@ class TSEmojisVC: TSBaseVC {
             make.leading.equalTo(16)
         }
         
-//        let setBtn = UIButton.createButton(image: UIImage(named: "setting")) { [weak self]  in
-//            guard let self = self else { return }
-//            let setingVC = TSSetingVC()
-//            setingVC.hidesBottomBarWhenPushed = true
-//            navigationController?.pushViewController(setingVC, animated: true)
-//        }
-//        navBarView.barView.addSubview(setBtn)
-//        setBtn.snp.makeConstraints { make in
-//            make.centerY.equalToSuperview()
-//            make.trailing.equalTo(-16)
-//            make.width.height.equalTo(24)
-//        }
-        
         navBarView.barView.addSubview(vipBtn)
         vipBtn.snp.makeConstraints { make in
             make.centerY.equalToSuperview()
@@ -70,17 +57,6 @@ class TSEmojisVC: TSBaseVC {
             make.height.equalTo(117*kDesignScale)
         }
         
-//        let closeBtn = UIButton.createButton{ [weak self]  in
-//            guard let self = self else { return }
-//            viewModel.isHiddenBanner = true
-//            pagingView.reloadData()
-//        }
-//        view.addSubview(closeBtn)
-//        closeBtn.snp.makeConstraints { make in
-//            make.top.equalTo(16)
-//            make.trailing.equalTo(-16)
-//            make.width.height.equalTo(50)
-//        }
         return view
     }()
     
@@ -166,13 +142,11 @@ class TSEmojisVC: TSBaseVC {
 extension TSEmojisVC: JXPagingViewDelegate {
 
     func tableHeaderViewHeight(in pagingView: JXPagingView) -> Int {
-//        return viewModel.isHiddenBanner ? 0 : tableHeaderViewHeight
         return tableHeaderViewHeight
     }
 
     func tableHeaderView(in pagingView: JXPagingView) -> UIView {
-//        return viewModel.isHiddenBanner ? UIView() : headerView
-        return headerView
+        return UIView() //headerView
     }
 
     func heightForPinSectionHeader(in pagingView: JXPagingView) -> Int {

+ 2 - 0
AIEmoji/Business/TSGenmojiVC/TSGenmojiVC/View/TSGenmojiItemCell.swift

@@ -22,6 +22,7 @@ class TSGenmojiItemCell: TSBaseCollectionCell {
             make.top.edges.equalTo(UIEdgeInsets(top: 4, left: 6, bottom: 4, right: 6))
         }
         exampleView.isHidden = true
+        exampleView.cornerRadius = 10.0
         return exampleView
     }()
     
@@ -44,6 +45,7 @@ class TSGenmojiItemCell: TSBaseCollectionCell {
         exampleView.snp.makeConstraints { make in
             make.top.equalTo(8)
             make.leading.equalTo(8)
+            make.height.equalTo(20)
         }
     }
     

+ 7 - 4
AIEmoji/Business/TSGenmojiVC/TSGenmojiVC/ViewModel/TSGenmojiCollectionViewModel.swift

@@ -52,8 +52,10 @@ enum TSGenmojiCoLStyple : Int {
             return UIEdgeInsets(top: 0, left: 16, bottom: 10, right: 16)
         case .ptpEntrance:
             return UIEdgeInsets(top: 17, left: 17, bottom: 0, right: 15)
-        case .ptpUpload,.ptpSelectStyle:
+        case .ptpSelectStyle:
             return UIEdgeInsets(top: 0, left: 0, bottom: 0, right: 0)
+        case .ptpUpload:
+            return UIEdgeInsets(top: 0, left: 16, bottom: 0, right: 16)
         }
     }
         
@@ -95,7 +97,8 @@ enum TSGenmojiCoLStyple : Int {
         case .ptpEntrance:
             return CGSize(width: k_ScreenWidth-32, height: 117)
         case .ptpUpload:
-            return CGSize(width: k_ScreenWidth, height: 248)
+//            return CGSize(width: k_ScreenWidth, height: 248)
+            return CGSize(width: k_ScreenWidth, height: 232)
         case .ptpSelectStyle:
             return CGSize(width: k_ScreenWidth, height: 110)
         case .ptpPicHistory:
@@ -120,9 +123,9 @@ enum TSGenmojiCoLStyple : Int {
     
     var headerViewSize:CGSize {
         switch self {
-        case .generate,.textPicGenerate,.ptpEntrance,.ptpUpload:
+        case .generate,.textPicGenerate,.ptpEntrance:
             return CGSize.zero
-        case .history,.textPicHistory,.ptpPicHistory,.ptpSelectStyle:
+        case .history,.textPicHistory,.ptpPicHistory,.ptpSelectStyle,.ptpUpload:
             return CGSizeMake(k_ScreenWidth, 60)
         }
     }

+ 309 - 0
AIEmoji/Business/TSPTPGeneratorVC/TSAIPhotoGeneratorBaseVC/TSAIPhotoBrowseVC.swift

@@ -0,0 +1,309 @@
+//
+//  TSAIPhotoBrowseVC.swift
+//  AIEmoji
+//
+//  Created by 100Years on 2025/4/2.
+//
+
+private let cellId = "TSAIPhotoBrowseCell"
+class TSAIPhotoBrowseVC: TSBaseVC {
+
+    var dataModelArray = [TSGenmojiModel]()
+    var currentImage:UIImage?{
+        let cell = collectionView.cellForItem(at: IndexPath(item: currentIndex, section: 0)) as? TSAIPhotoBrowseCell
+        var image = cell?.netWorkImageView.image
+        image = image?.pngImage
+        return image
+    }
+
+    var currentModel:TSGenmojiModel?{
+        if let model = dataModelArray.safeObj(At: currentIndex){
+            return model
+        }
+        return nil
+    }
+    
+    
+    var currentIndex:Int = 0 {
+        didSet{
+            reloadUI()
+        }
+    }
+    
+    lazy var collectionView: UICollectionView = {
+
+        let layout = UICollectionViewFlowLayout()
+        layout.scrollDirection = .vertical
+        
+        let collectionView = UICollectionView(frame: .zero, collectionViewLayout: layout)
+        collectionView.delegate = self
+        collectionView.dataSource = self
+        collectionView.showsVerticalScrollIndicator = false
+        collectionView.showsHorizontalScrollIndicator = false
+        collectionView.backgroundColor = .clear
+        if #available(iOS 11.0, *) {
+            collectionView.contentInsetAdjustmentBehavior = .never
+        }
+        collectionView.register(TSAIPhotoBrowseCell.self, forCellWithReuseIdentifier: cellId)
+        collectionView.isPagingEnabled = true
+        collectionView.isHidden = true
+        if let flowLayout = collectionView.collectionViewLayout as? UICollectionViewFlowLayout {
+            flowLayout.minimumInteritemSpacing = 0
+            flowLayout.minimumLineSpacing = 0
+            flowLayout.scrollDirection = .horizontal
+            flowLayout.itemSize = CGSize(width: k_ScreenWidth, height: k_ScreenHeight)
+        }
+        return collectionView
+    }()
+    
+    
+    lazy var leftBtn: UIButton = {
+        let leftBtn = UIButton.createButton(image: UIImage(named: "page_left")){ [weak self]  in
+            guard let self = self else { return }
+            self.collectionView.scrollToItem(at:  IndexPath(item: self.currentIndex-1, section: 0), at: .left, animated: true)
+        }
+        return leftBtn
+    }()
+    
+    lazy var rightBtn: UIButton = {
+        let rightBtn = UIButton.createButton(image: UIImage(named: "page_right")){ [weak self]  in
+            guard let self = self else { return }
+            self.collectionView.scrollToItem(at: IndexPath(item: self.currentIndex+1, section: 0), at: .left, animated: true)
+        }
+        return rightBtn
+    }()
+        
+
+    //保存按钮
+    lazy var bigSaveBtn: UIButton = {
+        let bigSaveBtn = kCreateNormalSubmitBtn(title: "Save".localized) { [weak self]  in
+            guard let self = self else { return }
+            clickSubmitBtn()
+        }
+        bigSaveBtn.frame = CGRectMake(0, 0, 252, 44)
+        bigSaveBtn.cornerRadius = 22.0
+        return bigSaveBtn
+    }()
+    
+    lazy var xBtn: UIButton = {
+        let xBtn = UIButton.createButton(image: UIImage(named: "close_gray")) { [weak self]  in
+            guard let self = self else { return }
+            clickXBtn()
+        }
+        return xBtn
+    }()
+    
+    override func createView() {
+        super.createView()
+        
+        setNavBarViewHidden(true)
+        
+        contentView.addSubview(collectionView)
+        collectionView.snp.makeConstraints { make in
+            make.edges.equalTo(0)
+        }
+        
+        contentView.addSubview(leftBtn)
+        leftBtn.snp.makeConstraints { make in
+            make.leading.equalTo(17)
+            make.centerY.equalToSuperview()
+            make.width.height.equalTo(40)
+        }
+        
+        contentView.addSubview(rightBtn)
+        rightBtn.snp.makeConstraints { make in
+            make.trailing.equalTo(-18)
+            make.centerY.equalToSuperview()
+            make.width.height.equalTo(40)
+        }
+        
+        DispatchQueue.main.async {
+//        kDelayMainShort {
+            self.collectionView.isHidden = false
+            self.collectionView.reloadData()
+            self.collectionView.setContentOffset(CGPoint(x: CGFloat(self.currentIndex) * self.collectionView.frame.size.width, y: 0), animated: false)
+
+            if let flowLayout = self.collectionView.collectionViewLayout as? UICollectionViewFlowLayout {
+                flowLayout.itemSize = self.collectionView.bounds.size
+            }
+        }
+        
+
+        contentView.addSubview(bigSaveBtn)
+        bigSaveBtn.snp.makeConstraints { make in
+            make.centerX.equalToSuperview()
+            make.bottom.equalTo(-8-k_Height_safeAreaInsetsBottom())
+            make.width.equalTo(bigSaveBtn.width)
+            make.height.equalTo(bigSaveBtn.height)
+        }
+        
+        //关闭按钮
+        contentView.addSubview(xBtn)
+        xBtn.snp.makeConstraints { make in
+            make.top.equalTo(k_Height_StatusBar + 4)
+            make.leading.equalTo(16)
+            make.width.equalTo(36)
+            make.height.equalTo(36)
+        }
+    }
+    
+    @objc func clickSubmitBtn(){
+        
+        if JudgeVip(){
+            return
+        }
+        
+        if let image = currentImage{
+            PhotoManagerShared.saveImageToAlbum(image) { success, error in
+                if success {
+                    kSavePhotoSuccesswShared.show(atView: self.view)
+                }else{
+                    debugPrint(error)
+                }
+            }
+        }else{
+            kShowToastDataMissing()
+        }
+    }
+    
+    
+    func JudgeVip() -> Bool {
+        return kJudgeVip(externalBool: currentModel?.response.vip ?? false , vc: self, closePageBlock: nil)
+    }
+    
+    @objc func clickXBtn(){
+        pop()
+    }
+}
+
+
+extension TSAIPhotoBrowseVC {
+    
+    func reloadUI() {
+        //判断前后是否还有,以此来确定左右翻页按钮
+        var isHiddenLeft = false
+        var isHiddenRight = false
+        if dataModelArray.count == 1{
+            isHiddenLeft = true
+            isHiddenRight = true
+        }else if currentIndex == 0 {
+            isHiddenLeft = true
+        }else if currentIndex+1 >= dataModelArray.count {
+            isHiddenRight = true
+        }
+        
+        leftBtn.isHidden = isHiddenLeft
+        rightBtn.isHidden = isHiddenRight
+    }
+}
+
+//MARK: UICollectionViewDataSource
+extension TSAIPhotoBrowseVC:UICollectionViewDataSource,UICollectionViewDelegate {
+    
+    func scrollViewDidEndDecelerating(_ scrollView: UIScrollView) {
+        resetIndexWithOffset(scrollView)
+    }
+
+    func scrollViewDidEndScrollingAnimation(_ scrollView: UIScrollView) {
+        resetIndexWithOffset(scrollView)
+    }
+
+    private func resetIndexWithOffset(_ scrollView: UIScrollView) {
+        let item = Int((scrollView.contentOffset.x / scrollView.bounds.width).rounded())
+        currentIndex = item
+    }
+    
+    func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
+        return dataModelArray.count
+    }
+    
+    func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
+        let cell = collectionView.dequeueReusableCell(withReuseIdentifier: cellId, for: indexPath) as! TSAIPhotoBrowseCell
+        if let model = dataModelArray.safeObj(At: indexPath.item){
+            cell.model = model
+        }
+        return cell
+    }
+    
+}
+
+
+class TSAIPhotoBrowseCell : TSBaseCollectionCell{
+
+    lazy var exampleView: UIView = {
+        let exampleView = UIView()
+        exampleView.backgroundColor = "#232323".uiColor.withAlphaComponent(0.3)
+        
+        let textLabel = UILabel.createLabel(
+            text: "Example".localized,
+            font: .font(size: 12),
+            textColor: .white
+        )
+        
+        exampleView.addSubview(textLabel)
+        textLabel.snp.makeConstraints { make in
+            make.top.edges.equalTo(UIEdgeInsets(top: 4, left: 6, bottom: 4, right: 6))
+        }
+        exampleView.isHidden = true
+        exampleView.cornerRadius = 10.0
+        return exampleView
+    }()
+    
+    lazy var netWorkImageView : UIImageView = {
+        let netWorkImageView = UIImageView.createImageView(imageName: "",contentMode: .scaleAspectFit,corner: 24.0)
+        return netWorkImageView
+    }()
+
+    lazy var vipImageView: UIImageView = {
+        let vipImageView = UIImageView.createImageView(imageName:"vip_side_icon")
+        vipImageView.contentMode = .scaleToFill
+        vipImageView.isHidden = true
+        return vipImageView
+    }()
+
+    override func creatUI() {
+        let w = k_ScreenWidth
+        let h = k_ScreenHeight
+        bgContentView.addSubview(netWorkImageView)
+        netWorkImageView.snp.makeConstraints { make in
+            make.center.equalToSuperview()
+            make.width.equalTo(w)
+            make.height.equalTo(h)
+        }
+
+        netWorkImageView.addSubview(vipImageView)
+        vipImageView.snp.makeConstraints { make in
+            make.width.height.equalTo(40)
+            make.top.equalTo(-5)
+            make.trailing.equalTo(5)
+        }
+        
+        contentView.addSubview(exampleView)
+        exampleView.snp.makeConstraints { make in
+            make.bottom.equalTo(-(44+8+k_Height_safeAreaInsetsBottom()+20))
+            make.centerX.equalToSuperview()
+            make.height.equalTo(20)
+        }
+        
+    }
+    
+    var model:TSGenmojiModel = TSGenmojiModel(){
+        didSet{
+            
+            if model.modelType == .example {
+                exampleView.isHidden = false
+                netWorkImageView.image = UIImage(named:model.response.resultUrl)
+                netWorkImageView.adaptiveScale()
+            }else{
+                exampleView.isHidden = true
+                netWorkImageView.setAsyncImage(urlString: model.response.resultUrl,placeholder: kPlaceholderImage,contentMode: .scaleAspectFit, completion: { [weak self] image in
+                    guard let self = self else { return }
+                    netWorkImageView.adaptiveScale()
+                })
+            }
+            
+            vipImageView.isHidden = !model.response.vip
+            
+        }
+    }
+}

+ 151 - 0
AIEmoji/Business/TSPTPGeneratorVC/TSAIPhotoGeneratorBaseVC/TSAIPhotoGeneratorBaseVC.swift

@@ -0,0 +1,151 @@
+//
+//  TSAIPhotoGeneratorBaseVC.swift
+//  AIEmoji
+//
+//  Created by 100Years on 2025/4/1.
+//
+
+class TSAIPhotoGeneratorBaseVC: TSBaseVC {
+    lazy var bottomViewH = 60+k_Height_safeAreaInsetsBottom()
+//    lazy var topBgView: UIView = {
+//        let topBgView = UIView(frame: CGRectMake(0, 0, k_ScreenWidth, k_ScreenHeight-bottomViewH))
+//        topBgView.backgroundColor = "#111111".uiColor
+//        return topBgView
+//    }()
+    
+    
+    lazy var netWorkImageView: UIImageView = {
+        let netWorkImageView = UIImageView(frame: CGRectMake(0, 0, k_ScreenWidth, k_ScreenHeight))
+        netWorkImageView.backgroundColor = "#111111".uiColor
+        netWorkImageView.contentMode = .scaleAspectFit
+        return netWorkImageView
+    }()
+    
+    
+    lazy var bottomView: UIView = {
+        let bottom = 60+k_Height_safeAreaInsetsBottom()
+        let bottomView = UIView(frame: CGRectMake(0, k_ScreenHeight-bottomViewH, k_ScreenWidth, bottomViewH))
+        bottomView.backgroundColor = "#222222".uiColor
+        bottomView.cornersRound(radius: 20, corner: [.topLeft,.topRight])
+        bottomView.isHidden = true
+        return bottomView
+    }()
+
+    
+    lazy var xBtn: UIButton = {
+        let xBtn = UIButton.createButton(image: UIImage(named: "close_gray")) { [weak self]  in
+            guard let self = self else { return }
+            clickXBtn()
+        }
+        return xBtn
+    }()
+    
+    //重试按钮
+    lazy var tryAgainBtn: UIButton = {
+        let tryAgainBtn = kCreateNormalSubmitBtn(title: "Try Again".localized) { [weak self]  in
+            guard let self = self else { return }
+            clickTryAgainBtn()
+        }
+        tryAgainBtn.cornerRadius = 22.0
+        return tryAgainBtn
+    }()
+    
+    //左边重新生成按钮
+    lazy var regenerateBtn: TSVerticalButton = {
+        let regenerateBtn = TSVerticalButton()
+        regenerateBtn.setUpButton(title: "Regenerate".localized,
+                                  image: UIImage(named: "refresh_gary"),
+                                  font: .font(size: 11),
+                                  titleColor: .white.withAlphaComponent(0.8)){ [weak self]  in
+            guard let self = self else { return }
+            clickRegenerateBtn()
+        }
+        return regenerateBtn
+    }()
+
+    
+    //右边大保存按钮
+    lazy var bigSaveBtn: UIButton = {
+        let bigSaveBtn = kCreateNormalSubmitBtn(title: "Save".localized) { [weak self]  in
+            guard let self = self else { return }
+            clickSaveBtn()
+        }
+        bigSaveBtn.cornerRadius = 22.0
+        return bigSaveBtn
+    }()
+    
+   
+    //点击空白,关闭页面
+    var isClickTheBlankClosePage = true
+    
+    override func createView() {
+        view.backgroundColor = .clear
+        setNavBarViewHidden(true)
+
+        contentView.addSubview(netWorkImageView)
+        contentView.addSubview(bottomView)
+        //关闭按钮
+        contentView.addSubview(xBtn)
+        xBtn.snp.makeConstraints { make in
+            make.top.equalTo(k_Height_StatusBar + 4)
+            make.leading.equalTo(16)
+            make.width.equalTo(36)
+            make.height.equalTo(36)
+        }
+        
+        let bottomBtnTop:CGFloat = 8.0
+        //重试
+        bottomView.addSubview(tryAgainBtn)
+        tryAgainBtn.snp.makeConstraints { make in
+            make.top.equalTo(bottomBtnTop)
+            make.trailing.equalTo(-16)
+            make.width.equalTo(252)
+            make.height.equalTo(44)
+        }
+        //保存
+        bottomView.addSubview(bigSaveBtn)
+        bigSaveBtn.snp.makeConstraints { make in
+            make.top.equalTo(bottomBtnTop)
+            make.trailing.equalTo(-16)
+            make.width.equalTo(252)
+            make.height.equalTo(44)
+        }
+        
+        //重新生成
+        bottomView.addSubview(regenerateBtn)
+        regenerateBtn.snp.makeConstraints { make in
+            make.top.equalTo(bottomBtnTop)
+            make.leading.equalTo(16)
+            make.width.equalTo(86)
+            make.height.equalTo(44)
+        }
+        
+    }
+    
+    func closePage() {
+        self.dismiss(animated: true, completion: nil)
+    }
+
+    //重试
+    @objc func clickTryAgainBtn(){
+        
+    }
+    
+    @objc func clickRegenerateBtn(){
+        
+    }
+    //保存功能
+    @objc func clickSaveBtn(){
+        
+    }
+    
+    @objc func clickXBtn(){
+        closePage()
+    }
+    
+    @objc private func dismissKeyboard() {
+        if isClickTheBlankClosePage {
+            closePage()
+        }
+    }
+}

+ 32 - 100
AIEmoji/Business/TSPTPGeneratorVC/TSPTPGeneratorVC/TSPTPGeneratorVC.swift

@@ -5,7 +5,7 @@
 //  Created by 100Years on 2025/2/26.
 //
 
-class TSPTPGeneratorVC: TSBottomAlertVC {
+class TSPTPGeneratorVC: TSAIPhotoGeneratorBaseVC {
     
     var imageModel:TSGenmojiModel?
     var complete:((TSGenmojiModel)->Void)
@@ -33,84 +33,20 @@ class TSPTPGeneratorVC: TSBottomAlertVC {
         fatalError("init(coder:) has not been implemented")
     }
     
-    lazy var netWorkImageView : UIImageView = {
-        let netWorkImageView = UIImageView.createImageView(imageName: "",corner: 16.0)
-        netWorkImageView.isHidden = true
-        return netWorkImageView
-    }()
-    
-    
-    lazy var generateInView : TSCommonloadingView = {
-        let generateInView = TSCommonloadingView()
+
+    lazy var generateInView : TSGeneratorloadingView = {
+        let generateInView = TSGeneratorloadingView()
         return generateInView
     }()
     
-    //大保存按钮
-    lazy var bigSaveBtn: UIButton = {
-        let bigSaveBtn = kCreateNormalSubmitBtn(title: "Save".localized) { [weak self]  in
-            guard let self = self else { return }
-            clickConfirmBtn()
-        }
-        bigSaveBtn.isHidden = true
-        return bigSaveBtn
-    }()
-    
-    lazy var regenerateBtn: UIButton = {
-        let regenerateBtn = UIButton.createButton(
-            title: "regenerate",
-            image: UIImage(named: "refresh_gary"),
-            backgroundColor:.white.withAlphaComponent(0.1),
-            font: .font(size: 12),
-            titleColor: .white.withAlphaComponent(0.6),
-            corner: 8.0)
-        { [weak self]  in
-            guard let self = self else { return }
-            clickSubmitBtn()
-        }
-        regenerateBtn.contentEdgeInsets = UIEdgeInsets(top: 4, left: 7, bottom: 4, right: 7)
-        regenerateBtn.imageEdgeInsets = UIEdgeInsets(top: 0, left: -4, bottom: 0, right: 0)
-        regenerateBtn.isHidden = true
-        return regenerateBtn
-    }()
-    
     override func createView() {
-        super.createView()
-        
-        bottomView.frame = CGRectMake(0, 92, k_ScreenWidth, k_ScreenHeight-92)
-        cancelBtn.isHidden = true
-        confirmBtn.isHidden = true
-        submitBtn.isHidden = true
-        
-        bottomView.addSubview(bigSaveBtn)
-        bigSaveBtn.snp.makeConstraints { make in
-            make.bottom.equalTo(-34)
-            make.centerX.equalToSuperview()
-            make.width.equalTo(329)
-            make.height.equalTo(60)
-        }
-        
-        bottomView.addSubview(generateInView)
-        generateInView.snp.makeConstraints { make in
-            make.center.equalToSuperview()
-        }
-        
-        bottomView.addSubview(netWorkImageView)
-        let netWorkImageViewW = k_ScreenWidth - 120.0
-        let netWorkImageViewH = netWorkImageViewW/kTextWHScale
-        netWorkImageView.snp.makeConstraints { make in
-            make.top.equalTo(90*kDesignScale)
-            make.centerX.equalToSuperview()
-            make.width.equalTo(netWorkImageViewW)
-            make.height.equalTo(netWorkImageViewH)
-        }
 
-        bottomView.addSubview(regenerateBtn)
-        regenerateBtn.snp.makeConstraints { make in
-            make.top.equalTo(netWorkImageView.snp.bottom).offset(16)
-            make.centerX.equalToSuperview()
-            make.height.equalTo(28)
+        contentView.addSubview(generateInView)
+        generateInView.snp.makeConstraints { make in
+            make.edges.equalToSuperview()
         }
         
+        super.createView()
     }
     
     override func closePage() {
@@ -119,7 +55,12 @@ class TSPTPGeneratorVC: TSBottomAlertVC {
     }
     
     //重试
-    @objc override func clickSubmitBtn(){
+    @objc override func clickTryAgainBtn(){
+        clickRegenerateBtn()
+    }
+    
+    //重新生成
+    @objc override func clickRegenerateBtn(){
         //判断 vip
         if kJudgeVip(externalBool: kPurchaseDefault.freeNumAvailable(type: .picToPic) == false, vc: self) {[weak self] in
             guard let self = self else { return }
@@ -129,7 +70,7 @@ class TSPTPGeneratorVC: TSBottomAlertVC {
     }
     
     //保存功能
-    @objc override func clickConfirmBtn(){
+    @objc override func clickSaveBtn(){
         if let image = getSuccessImage() {
             PhotoManagerShared.saveImageToAlbum(image) { success, error in
                 if success {
@@ -183,11 +124,9 @@ extension TSPTPGeneratorVC {
         generateInView.isHidden = false
         generateInView.showLoading(text: text)
         generateInView.isRotating = true
-        submitBtn.isHidden = true
-        confirmBtn.isHidden = true
-        bigSaveBtn.isHidden = true
+        
         isClickTheBlankClosePage = false
-        regenerateBtn.isHidden = true
+        bottomView.isHidden = true
         netWorkImageView.isHidden = true
     }
     
@@ -195,11 +134,9 @@ extension TSPTPGeneratorVC {
         generateInView.isHidden = false
         generateInView.showLoading(text: "Generating...".localized)
         generateInView.isRotating = true
-        submitBtn.isHidden = true
-        confirmBtn.isHidden = true
-        bigSaveBtn.isHidden = true
+
         isClickTheBlankClosePage = false
-        regenerateBtn.isHidden = true
+        bottomView.isHidden = true
         netWorkImageView.isHidden = true
     }
     
@@ -208,37 +145,32 @@ extension TSPTPGeneratorVC {
         generateInView.isHidden = false
         generateInView.showError(text: msg)
         generateInView.isRotating = false
-        submitBtn.isHidden = false
-        bigSaveBtn.isHidden = true
+
         isClickTheBlankClosePage = true
-        regenerateBtn.isHidden = true
+        
+        tryAgainBtn.isHidden = false
+        bigSaveBtn.isHidden = true
+        bottomView.isHidden = false
         netWorkImageView.isHidden = true
     }
     
     func showSuccess(model:TSGenmojiModel){
         generateInView.isHidden = true
         generateInView.isRotating = false
-        submitBtn.isHidden = true
-        bigSaveBtn.isHidden = false
+
         imageModel = model
         isClickTheBlankClosePage = true
-        regenerateBtn.isHidden = false
         
-        cancelBtn.isEnabled = false
-        confirmBtn.isEnabled = false
+        tryAgainBtn.isHidden = false
+        bigSaveBtn.isHidden = false
+        bottomView.isHidden = false
         netWorkImageView.isHidden = false
         
-//        netWorkImageView.snp.updateConstraints { make in
-//            make.top.equalTo(94)
-//            make.centerX.equalToSuperview()
-//            make.width.equalTo(249*kDesignScale)
-//            make.height.equalTo(441*kDesignScale)
-//        }
-        
-        self.netWorkImageView.setAsyncImage(urlString: model.response.resultUrl,placeholder:kPlaceholderImage){ [weak self] image in
+
+        self.netWorkImageView.setAsyncImage(urlString: model.response.resultUrl,placeholder:kPlaceholderImage,backgroundColor:netWorkImageView.backgroundColor!){ [weak self] image in
             guard let self = self else { return }
-            cancelBtn.isEnabled = true
-            confirmBtn.isEnabled = true
+            
+            netWorkImageView.adaptiveScale()
         }
         
         kPurchaseDefault.useOnceForFree(type: .picToPic)

+ 57 - 1
AIEmoji/Business/TSPTPGeneratorVC/TSPTPGeneratorVC/VM/TSPTPGeneratorVM.swift

@@ -5,6 +5,33 @@
 //  Created by 100Years on 2025/2/25.
 //
 import Alamofire
+
+var kRandomBoolLastResult:Bool = true
+func kRandomBool() -> Bool {
+   if !kRandomBoolLastResult {
+       // 如果上一次是 false,这次必须返回 true
+       kRandomBoolLastResult = true
+       return true
+   } else {
+       // 如果上一次是 true,随机返回 true 或 false
+       let randomResult = Bool.random()
+       kRandomBoolLastResult = randomResult
+       return randomResult
+   }
+}
+
+let actionInfoDictPoster:[String:Any] = [
+    "actionType":"image_create",
+    "comments": "Success",
+    "costTime":9,
+    "createdTimestamp":1742183242,
+    "id":2449,
+    "percent":1,
+    "request":"{\"prompt\": \"Traditional Chinese ink painting style phoenix soaring through misty mountain peaks, dynamic black brushstrokes with crimson accents on rice paper texture, Googie architecture space station, 1950s atomic age aesthetic, curved aluminum panels, starburst patterns, glass dome observatory --edge_threshold 0.5 --atomic_age_style 0.8 --chrome_reflection 1.2\", \"width\": 800, \"height\": 1440, \"countryCode\": \"FR\"}",
+    "response": "{\"resultUrl\": \"https://be-aigc.s3-accelerate.amazonaws.com/4c946f78-b1e7-4ffe-ba18-fff26b10178c.png\"}",
+    "status":"success"
+]
+
 class TSPTPGeneratorVM {
     
     var uploadRequest:Request?
@@ -24,7 +51,36 @@ class TSPTPGeneratorVM {
         self.upLoadImage = upLoadImage
     }
     
-
+//    //模拟数据
+//    func creatImage() {
+//        
+//        stateDatauPblished = (.start,nil)
+//        stateDatauPblished = (.progressString(generating(progress: 0.0)),nil)
+//
+//        kDelayOnMainThread(0.2) {
+//            self.stateDatauPblished = (.progressString(self.generating(progress: 0.2)),nil)
+//        }
+//        
+//        kDelayOnMainThread(0.5) {
+//            self.stateDatauPblished = (.progressString(self.generating(progress: 0.5)),nil)
+//        }
+//        
+//        kDelayOnMainThread(0.8) {
+//            self.stateDatauPblished = (.progressString(self.generating(progress: 0.8)),nil)
+//        }
+//
+//
+//        kDelayOnMainThread(2.0) {
+//            if kRandomBool() {
+//                let infoModel = TSGenmojiModel(JSON:actionInfoDictPoster )
+//                self.stateDatauPblished = (.success(nil),infoModel)
+//            }else{
+//                self.stateDatauPblished = (.failed("error?.localizedDescription"),nil)
+//            }
+//        }
+//        
+//    }
+    
     func creatImage() {
         guard let imageUrl = imageUrl else { return }
         generatingProgress = 0

+ 26 - 2
AIEmoji/Business/TSPTPGeneratorVC/TSPhotoToPhotoVC/Cell/TSPTPUploadCell.swift

@@ -7,15 +7,19 @@
 
 class TSPTPUploadCell : TSBaseCollectionCell{
     
+    let ptpUploadExample:UIImage? = UIImage(named: "ptp_upload_example")
+    
     var upLoadImage:UIImage? = nil {
         didSet{
             if let image = upLoadImage {
                 upLoadView.isHidden = true
+                uploadExampleImageView.isHidden = true
                 uploadImageView.isHidden = false
                 deleteBtn.isHidden = false
                 uploadImageView.image = image
             }else {
                 upLoadView.isHidden = false
+                uploadExampleImageView.isHidden = false
                 uploadImageView.isHidden = true
                 deleteBtn.isHidden = true
                 uploadImageView.image = nil
@@ -45,6 +49,15 @@ class TSPTPUploadCell : TSBaseCollectionCell{
         return bgView
     }()
     
+    lazy var uploadExampleImageView: UIImageView = {
+        let uploadExampleImageView = UIImageView()
+        uploadExampleImageView.image = UIImage(named: "ptp_upload_example")
+        uploadExampleImageView.contentMode = .scaleAspectFill
+        uploadExampleImageView.cornerRadius = 12
+        uploadExampleImageView.isHidden = false
+        return uploadExampleImageView
+    }()
+    
     lazy var uploadImageView: UIImageView = {
         let uploadImageView = UIImageView()
         uploadImageView.contentMode = .scaleAspectFit
@@ -71,6 +84,12 @@ class TSPTPUploadCell : TSBaseCollectionCell{
             make.centerX.equalToSuperview()
         }
         
+        bgView.addSubview(uploadExampleImageView)
+        uploadExampleImageView.snp.makeConstraints { make in
+            make.top.leading.equalTo(8)
+            make.bottom.trailing.equalTo(-8)
+        }
+        
         bgView.addSubview(uploadImageView)
         uploadImageView.snp.makeConstraints { make in
             make.top.leading.equalTo(8)
@@ -93,9 +112,14 @@ class TSPTPUploadCell : TSBaseCollectionCell{
     
     override func creatUI() {
         contentView.addSubview(bgView)
+//        bgView.snp.makeConstraints { make in
+//            make.leading.top.equalTo(16)
+//            make.bottom.trailing.equalTo(-16)
+//        }
         bgView.snp.makeConstraints { make in
-            make.leading.top.equalTo(16)
-            make.bottom.trailing.equalTo(-16)
+            make.leading.equalTo(16)
+            make.trailing.equalTo(-16)
+            make.top.bottom.equalTo(0)
         }
         
         contentView.addSubview(deleteBtn)

+ 43 - 6
AIEmoji/Business/TSPTPGeneratorVC/TSPhotoToPhotoVC/TSPhotoToPhotoVC.swift

@@ -61,11 +61,28 @@ class TSPhotoToPhotoVC: TSBaseVC {
     
     //###################################### 入口 view ######################################
     
-    lazy var bannerBtn: UIButton = {
-        let bannerBtn = UIButton.createButton(backgroundImage: UIImage(named: "ptp_banner"))
-        bannerBtn.addTarget(self, action: #selector(clickPTPEnterView), for: .touchUpInside)
-        bannerBtn.frame = CGRect(x: 16, y: 17, width: k_ScreenWidth-32, height: 117)
-        return bannerBtn
+//    lazy var bannerBtn: UIButton = {
+//        let bannerBtn = UIButton.createButton(backgroundImage: UIImage(named: "ptp_banner"))
+//        bannerBtn.addTarget(self, action: #selector(clickPTPEnterView), for: .touchUpInside)
+//        bannerBtn.frame = CGRect(x: 16, y: 17, width: k_ScreenWidth-32, height: 117)
+//        return bannerBtn
+//    }()
+    let bannerY:CGFloat = 17
+    let bannerW:CGFloat = 166*kDesignScale
+    let bannerH:CGFloat = 117*kDesignScale
+    lazy var textToPhotoBannerBtn: UIButton = {
+        let textToPhotoBannerBtn = UIButton.createButton(backgroundImage: UIImage(named: "textToPhoto_banner"))
+        textToPhotoBannerBtn.addTarget(self, action: #selector(clickTextToPhoto), for: .touchUpInside)
+        textToPhotoBannerBtn.frame = CGRect(x: 16, y: bannerY, width: bannerW, height: bannerH)
+        return textToPhotoBannerBtn
+    }()
+
+    lazy var textToEmojiBannerBtn: UIButton = {
+        let textToEmojiBannerBtn = UIButton.createButton(backgroundImage: UIImage(named: "textToEmoji_banner"))
+        textToEmojiBannerBtn.addTarget(self, action: #selector(clickTextToEmoji), for: .touchUpInside)
+        let x = textToPhotoBannerBtn.x + textToPhotoBannerBtn.width + 11.0
+        textToEmojiBannerBtn.frame = CGRect(x: x, y: bannerY, width: bannerW, height: bannerH)
+        return textToEmojiBannerBtn
     }()
     
     lazy var collectionComponent: TSCollectionViewComponent = {
@@ -122,7 +139,8 @@ class TSPhotoToPhotoVC: TSBaseVC {
                     dataModelArray.append(itemModel.dataModel)
                 }
                 
-                let browseVC = TSPTPBrowseVC()
+//                let browseVC = TSPTPBrowseVC()
+                let browseVC = TSAIPhotoBrowseVC()
                 browseVC.dataModelArray = dataModelArray
                 browseVC.currentIndex = indexPath.item
                 kPresentModalVC(target: self, modelVC: browseVC,transitionStyle: .crossDissolve)
@@ -175,11 +193,22 @@ class TSPhotoToPhotoVC: TSBaseVC {
             make.height.equalTo(48)
         }
         
+//        //顶部入口跳转按钮
+//        let vcViewH = bannerBtn.frame.origin.y+bannerBtn.frame.size.height
+//        collectionComponent.collectionView.addSubview(bannerBtn)
+//        collectionComponent.collectionView.contentInset = UIEdgeInsets(top: vcViewH, left: 0, bottom: 20, right: 0)
+//        bannerBtn.y = -bannerBtn.frame.size.height
+        
+        
         //顶部入口跳转按钮
+        let bannerBtn = textToPhotoBannerBtn
         let vcViewH = bannerBtn.frame.origin.y+bannerBtn.frame.size.height
         collectionComponent.collectionView.addSubview(bannerBtn)
         collectionComponent.collectionView.contentInset = UIEdgeInsets(top: vcViewH, left: 0, bottom: 20, right: 0)
         bannerBtn.y = -bannerBtn.frame.size.height
+
+        collectionComponent.collectionView.addSubview(textToEmojiBannerBtn)
+        textToEmojiBannerBtn.y = bannerBtn.y
     }
     
     override func dealThings() {
@@ -210,6 +239,14 @@ extension TSPhotoToPhotoVC {
         kPushVC(target: self, modelVC: TSTextGeneralPictureVC())
     }
     
+    @objc func clickTextToPhoto() {
+        kPushVC(target: self, modelVC: TSTextGeneralPictureVC())
+    }
+    
+    @objc func clickTextToEmoji() {
+        kPushVC(target: self, modelVC: TSGenmojiVC())
+    }
+    
     func uploadImage(){
         generateImage()
     }

+ 1 - 1
AIEmoji/Business/TSPTPGeneratorVC/TSPhotoToPhotoVC/VM/TSPhotoToPhotoVM.swift

@@ -63,7 +63,7 @@ class TSPhotoToPhotoVM {
     lazy var uploadSectionModel: TSGenmojiCoLSectionModel = {
         let uploadSectionModel = TSGenmojiCoLSectionModel()
         uploadSectionModel.style = .ptpUpload
-        uploadSectionModel.name = ""
+        uploadSectionModel.name = "Upload Image".localized
         
         let itemModel = TSGenmojiCoLItemModel()
         itemModel.style = .ptpUpload

+ 49 - 19
AIEmoji/Business/TSPurchaseMembershipVC/TSPurchaseVC.swift

@@ -10,7 +10,7 @@ import SwiftUI
 import SwiftUIX
 class PurchaseViewModel : ObservableObject{
     
-    @Published var selectedType: PremiumPeriod = .month
+    @Published var selectedType: PremiumPeriod = .year
     
     /// 订阅publisher
     let buyPublisher  = PassthroughSubject<Bool,Never>()
@@ -219,10 +219,12 @@ struct PurchaseView :View {
     
     var body: some View {
         ScrollView {
-            Spacer().frame(height: 116)
+            Spacer().frame(height: 31)
             
             VStack {
-                Image("vip_big_icon").resizable().frame(width: 263, height: 63)
+         
+                customText(text: " \(kAppName) ",fontName: .KelsiFill,color:UIColor.themeColor.color).frame(height: 53*kDesignScale)
+                
                 Spacer().frame(height: 16)
                 
                 Text("Premium")
@@ -230,35 +232,44 @@ struct PurchaseView :View {
                     .padding(EdgeInsets(top: 0, leading: 20, bottom: 0, trailing: 20))
                     .frame(height: 34)
                     .foregroundColor(.white)
-                    .background(Color.white.opacity(0.1))
+                    .background(.hex("#222222"))
                     .cornerRadius(17.0)
+                    .overlay(
+                        RoundedRectangle(cornerRadius: 16)
+                            .stroke(Color.hex("#FA794F"), lineWidth: 2) // 边框
+                    )
 
                 Spacer().frame(height: 36)
                 
                 ZStack {
-                    VStack(alignment: .leading,spacing: 8) {
+                    VStack(alignment: .leading,spacing: 16) {
                         
-                        HStack(spacing: 8) {
-                            Image("check").resizable().frame(width: 24, height: 24)
-                            Text("Unlimited Wallpaper")
+                        HStack(spacing: 12) {
+                            Image("vip_feature_1").resizable().frame(width: 24, height: 24)
+                            Text("Unlimited AI image generation")
                         }
                         
-                        HStack(spacing: 8) {
-                            Image("check").resizable().frame(width: 24, height: 24)
-                            Text("Unlimited AI Emoji")
+                        HStack(spacing: 12) {
+                            Image("vip_feature_2").resizable().frame(width: 24, height: 24)
+                            Text("Change image styles")
                         }
                         
-                        HStack(spacing: 8) {
-                            Image("check").resizable().frame(width: 24, height: 24)
-                            Text("100% No Ads").multilineTextAlignment(.leading)
+                        HStack(spacing: 12) {
+                            Image("vip_feature_3").resizable().frame(width: 24, height: 24)
+                            Text("Unlimited AI chat").multilineTextAlignment(.leading)
                         }
                         
-                    }.font(.font(size: 16)).foregroundColor(UIColor.lesserText.color)
+                        HStack(spacing: 12) {
+                            Image("vip_feature_4").resizable().frame(width: 24, height: 24)
+                            Text("Ad-free experience").multilineTextAlignment(.leading)
+                        }
+                        
+                    }.font(.font(size: 16)).foregroundColor(UIColor.white.color)
                 }
          
             }
             
-            Spacer().frame(height: 25)
+            Spacer().frame(height: 44)
             
             
             VStack(spacing: 12) {
@@ -284,12 +295,12 @@ struct PurchaseView :View {
                     viewModel.buyPublisher.send(true)
                 } label: {
                     ZStack {
-                        Image("submit_btn_bg").resizable().aspectRatio(contentMode: .fill)
+                        Color.hex("#FFBD59")
                         Text("Continue")
                             .font(.system(size: 16))
                             .foregroundColor(.hex("#111111"))
                             
-                    }.frame(maxWidth: .infinity ,maxHeight: 48.0)
+                    }.frame(maxWidth: .infinity ,minHeight: 48.0)
                         .cornerRadius(24.0)
                 }
                 
@@ -305,7 +316,7 @@ struct PurchaseView :View {
                 }
 
                 HStack(spacing: 8) {
-                    Text("Term of us")
+                    Text("Terms of us")
                         .onTapGesture {
                             viewModel.termPublisher.send(true)
                         }
@@ -323,6 +334,25 @@ struct PurchaseView :View {
             }.padding(.horizontal)
         }
     }
+    
+    // 定义一个返回 View 的方法
+    func customText(text:String,fontName:FontName,color:Color) -> some View {
+        let gorgeousColor = color //UIColor.themeColor.color
+        return Text(text)
+            .font(.font(name: fontName,size: 48))
+        
+            .gradientForeground(
+                colors: [.hex("#FA794F"),.hex("#F8C32A"),.hex("#FEFBF4")],
+                startPoint: UnitPoint.leading,
+                endPoint: UnitPoint.trailing
+            )
+        
+        
+//            .shadow(color: gorgeousColor.opacity(0.7), radius: 6, x: 0, y: 0)
+        
+            .foregroundColor(gorgeousColor)
+            .frame(height: 20)
+    }
 }
 
 

+ 40 - 4
AIEmoji/Business/TSSetingVC/SetingVC/View/SettingPurchaseTopView.swift

@@ -18,8 +18,8 @@ struct SettingPurchaseTopView: View {
                 VStack {
                     Spacer().frame(height: 20)
                     
-                    Image(.settingVip).resizable().frame(width: 210*kDesignScale, height: 50*kDesignScale)
-                    
+//                    Image(.settingVip).resizable().frame(width: 210*kDesignScale, height: 50*kDesignScale)
+                    customGradientText(text: " \(kAppName) ",fontName: .KelsiFill).frame(height: 50*kDesignScale)
                     Spacer()
                     
                     Text("Due Date:".localized + " \(PurchaseManager.default.expiredDateString)")
@@ -35,8 +35,8 @@ struct SettingPurchaseTopView: View {
                     Spacer().frame(width:20)
                     
                     VStack(alignment: .leading,spacing: 12) {
-                        Image(.settingNoVip).resizable().frame(width: 186*kDesignScale, height: 44*kDesignScale)
-                        
+//                        Image(.settingNoVip).resizable().frame(width: 186*kDesignScale, height: 44*kDesignScale)
+                        customText(text: " \(kAppName) ",fontName: .KelsiRegular,color:UIColor.white.color).frame(height: 50*kDesignScale)
                         HStack {
                             Text("Limited Time Discount")
                                 .font(.font(size: 14))
@@ -68,4 +68,40 @@ struct SettingPurchaseTopView: View {
             }
         }
     }
+    
+    // 定义一个返回 View 的方法
+    func customText(text:String,fontName:FontName,color:Color) -> some View {
+        let gorgeousColor = color //UIColor.themeColor.color
+        return Text(text)
+            .font(.font(name: fontName,size: 48))
+//            .gradientForeground(
+//                colors: [gorgeousColor,gorgeousColor],
+//                startPoint: UnitPoint.leading,
+//                endPoint: UnitPoint.trailing
+//            )
+//            .shadow(color: gorgeousColor.opacity(0.7), radius: 6, x: 0, y: 0)
+            .foregroundColor(gorgeousColor)
+            .frame(height: 20)
+    }
+    
+    func customGradientText(text:String,fontName:FontName) -> some View {
+        return Text(text)
+            .font(.font(name: fontName,size: 48))
+            .gradientForeground(
+                colors: [.hex("#FA794F"),.hex("#F8C32A"),.hex("#FEFBF4")],
+                startPoint: UnitPoint.leading,
+                endPoint: UnitPoint.trailing
+            )
+//            .shadow(color: gorgeousColor.opacity(0.7), radius: 6, x: 0, y: 0)
+            .frame(height: 20)
+    }
+    
+    // 定义一个返回 View 的方法
+    func customTimeText(text:String) -> some View {
+        Text(text)
+            .font(.font(size: 14))
+            .frame(height: 14)
+            .foregroundColor(UIColor.white.withAlphaComponent(0.6).color)
+        
+    }
 }

+ 1 - 1
AIEmoji/Business/TSTabBarController/TSTabBarController.swift

@@ -26,7 +26,7 @@ class TSTabBarController: UITabBarController {
     @objc private func setUpData() {
         viewControllerArray = ["TSPhotoToPhotoVC","TSChatViewController","TSEmojisVC","TSSetingVC"]
 //        viewControllerArray = ["TSTTPInputVC","TSChatViewController","TSEmojisVC","TSSetingVC"]
-        titleArray = ["Wallpaper","Chat","Emojis","Setting"]
+        titleArray = ["Photo","Chat","Emoji","Setting"]
         selectedImageArray = [
             "tabbar_select_pic",
             "tabbar_select_aichat",

+ 1 - 1
AIEmoji/Business/TSTextGeneralPictureVC/TSTextGeneralPictureVC/TSTextGeneralPictureVC.swift

@@ -33,7 +33,7 @@ class TSTextGeneralPictureVC: TSBaseVC {
                         dataModelArray.append(itemModel.dataModel)
                     }
                     
-                    let browseVC = TSBigIconBrowseVC()
+                    let browseVC = TSAIPhotoBrowseVC()
                     browseVC.dataModelArray = dataModelArray
                     browseVC.currentIndex = indexPath.item
                     kPresentModalVC(target: self, modelVC: browseVC,transitionStyle: .crossDissolve)

+ 33 - 125
AIEmoji/Business/TSTextGeneralPictureVC/TSTextPicGennerateVC/TSTextPicGennerateVC.swift

@@ -5,7 +5,7 @@
 //  Created by 100Years on 2025/2/20.
 //
 
-class TSTextPicGennerateVC: TSBottomAlertVC {
+class TSTextPicGennerateVC: TSAIPhotoGeneratorBaseVC {
     
     var imageModel:TSGenmojiModel?
     var complete:((TSGenmojiModel)->Void)
@@ -21,91 +21,22 @@ class TSTextPicGennerateVC: TSBottomAlertVC {
     @MainActor required init?(coder: NSCoder) {
         fatalError("init(coder:) has not been implemented")
     }
-    
-    lazy var netWorkImageView : UIImageView = {
-        let netWorkImageView = UIImageView.createImageView(imageName: "",corner: 16.0)
-        netWorkImageView.isHidden = true
-        return netWorkImageView
-    }()
-    
-    
-    lazy var generateInView : TSCommonloadingView = {
-        let generateInView = TSCommonloadingView()
+
+    lazy var generateInView : TSGeneratorloadingView = {
+        let generateInView = TSGeneratorloadingView()
         return generateInView
     }()
     
-    //大保存按钮
-    lazy var bigSaveBtn: UIButton = {
-        let bigSaveBtn = kCreateNormalSubmitBtn(title: "Save".localized) { [weak self]  in
-            guard let self = self else { return }
-            clickConfirmBtn()
-        }
-        bigSaveBtn.isHidden = true
-        return bigSaveBtn
-    }()
-    
-    lazy var regenerateBtn: UIButton = {
-        let regenerateBtn = UIButton.createButton(
-            title: "regenerate",
-            image: UIImage(named: "refresh_gary"),
-            backgroundColor:.white.withAlphaComponent(0.1),
-            font: .font(size: 12),
-            titleColor: .white.withAlphaComponent(0.6),
-            corner: 8.0)
-        { [weak self]  in
-            guard let self = self else { return }
-            clickSubmitBtn()
-        }
-        regenerateBtn.contentEdgeInsets = UIEdgeInsets(top: 4, left: 7, bottom: 4, right: 7)
-        regenerateBtn.imageEdgeInsets = UIEdgeInsets(top: 0, left: -4, bottom: 0, right: 0)
-        regenerateBtn.isHidden = true
-        return regenerateBtn
-    }()
-    
+
     override func createView() {
-        super.createView()
-        
-        bottomView.frame = CGRectMake(0, 92, k_ScreenWidth, k_ScreenHeight-92)
-        cancelBtn.isHidden = true
-        confirmBtn.isHidden = true
-        
-        bottomView.addSubview(bigSaveBtn)
-        bigSaveBtn.snp.makeConstraints { make in
-            make.bottom.equalTo(-34)
-            make.centerX.equalToSuperview()
-            make.width.equalTo(329)
-            make.height.equalTo(60)
-        }
-        
-        bottomView.addSubview(generateInView)
+
+        contentView.addSubview(generateInView)
         generateInView.snp.makeConstraints { make in
-            make.center.equalToSuperview()
+            make.edges.equalToSuperview()
         }
         
-        bottomView.addSubview(netWorkImageView)
-//        netWorkImageView.snp.makeConstraints { make in
-//            make.top.equalTo(94)
-//            make.centerX.equalToSuperview()
-//            make.width.equalTo(249*kDesignScale)
-//            make.height.equalTo(441*kDesignScale)
-//        }
-        
-        let netWorkImageViewW = k_ScreenWidth - 120.0
-        let netWorkImageViewH = netWorkImageViewW/kTextWHScale
-        netWorkImageView.snp.makeConstraints { make in
-            make.top.equalTo(90*kDesignScale)
-            make.centerX.equalToSuperview()
-            make.width.equalTo(netWorkImageViewW)
-            make.height.equalTo(netWorkImageViewH)
-        }
+        super.createView()
 
-        bottomView.addSubview(regenerateBtn)
-        regenerateBtn.snp.makeConstraints { make in
-            make.top.equalTo(netWorkImageView.snp.bottom).offset(16)
-            make.centerX.equalToSuperview()
-            make.height.equalTo(28)
-        }
-        
     }
     
     override func closePage() {
@@ -114,10 +45,13 @@ class TSTextPicGennerateVC: TSBottomAlertVC {
     }
     
     
-    
-    
     //重试
-    @objc override func clickSubmitBtn(){
+    @objc override func clickTryAgainBtn(){
+        clickRegenerateBtn()
+    }
+    
+    //重新生成
+    @objc override func clickRegenerateBtn(){
         //判断 vip
         if kJudgeVip(externalBool: kPurchaseDefault.freeNumAvailable(type: .textGeneratePic) == false, vc: self) {[weak self] in
             guard let self = self else { return }
@@ -126,15 +60,9 @@ class TSTextPicGennerateVC: TSBottomAlertVC {
         viewModel.creatImageEmoji(text:aiText)
     }
     
-//    @objc override func clickCancelBtn(){
-//        if let image = getSuccessImage() {
-//            UIDevice.copyImage(image: image)
-//            kSavePhotoSuccesswShared.show(atView: self.view,text: "Copy Successfully".localized,showViewBtn:false)
-//        }
-//    }
-    
+
     //保存功能
-    @objc override func clickConfirmBtn(){
+    @objc override func clickSaveBtn(){
         if let image = getSuccessImage() {
             PhotoManagerShared.saveImageToAlbum(image) { success, error in
                 if success {
@@ -187,13 +115,9 @@ extension TSTextPicGennerateVC {
         generateInView.isHidden = false
         generateInView.showLoading(text: text)
         generateInView.isRotating = true
-        submitBtn.isHidden = true
-//        cancelBtn.isHidden = true
-//        xBtn.isHidden = false
-        confirmBtn.isHidden = true
-        bigSaveBtn.isHidden = true
+
         isClickTheBlankClosePage = false
-        regenerateBtn.isHidden = true
+        bottomView.isHidden = true
         netWorkImageView.isHidden = true
     }
     
@@ -201,13 +125,9 @@ extension TSTextPicGennerateVC {
         generateInView.isHidden = false
         generateInView.showLoading(text: "Generating...".localized)
         generateInView.isRotating = true
-        submitBtn.isHidden = true
-//        cancelBtn.isHidden = true
-//        xBtn.isHidden = false
-        confirmBtn.isHidden = true
-        bigSaveBtn.isHidden = true
+        
         isClickTheBlankClosePage = false
-        regenerateBtn.isHidden = true
+        bottomView.isHidden = true
         netWorkImageView.isHidden = true
     }
     
@@ -216,44 +136,32 @@ extension TSTextPicGennerateVC {
         generateInView.isHidden = false
         generateInView.showError(text: msg)
         generateInView.isRotating = false
-        submitBtn.isHidden = false
-        bigSaveBtn.isHidden = true
-//        cancelBtn.isHidden = true
-//        confirmBtn.isHidden = true
-//        xBtn.isHidden = false
+        
         isClickTheBlankClosePage = true
-        regenerateBtn.isHidden = true
+        
+        tryAgainBtn.isHidden = false
+        bigSaveBtn.isHidden = true
+        bottomView.isHidden = false
         netWorkImageView.isHidden = true
     }
     
     func showSuccess(model:TSGenmojiModel){
         generateInView.isHidden = true
         generateInView.isRotating = false
-        submitBtn.isHidden = true
-        bigSaveBtn.isHidden = false
-//        cancelBtn.isHidden = true
-//        confirmBtn.isHidden = false
-//        xBtn.isHidden = false
+
         imageModel = model
         isClickTheBlankClosePage = true
-        regenerateBtn.isHidden = false
         
-        cancelBtn.isEnabled = false
-        confirmBtn.isEnabled = false
+        tryAgainBtn.isHidden = false
+        bigSaveBtn.isHidden = false
+        bottomView.isHidden = false
         netWorkImageView.isHidden = false
         
-//        netWorkImageView.snp.updateConstraints { make in
-//            make.top.equalTo(94)
-//            make.centerX.equalToSuperview()
-//            make.width.equalTo(249*kDesignScale)
-//            make.height.equalTo(441*kDesignScale)
-//        }
-        
         
-        self.netWorkImageView.setAsyncImage(urlString: model.response.resultUrl,placeholder:kPlaceholderImage){ [weak self] image in
+        self.netWorkImageView.setAsyncImage(urlString: model.response.resultUrl,placeholder:kPlaceholderImage,backgroundColor:netWorkImageView.backgroundColor!){ [weak self] image in
             guard let self = self else { return }
-            cancelBtn.isEnabled = true
-            confirmBtn.isEnabled = true
+            
+            netWorkImageView.adaptiveScale()
         }
         
         kPurchaseDefault.useOnceForFree(type: .textGeneratePic)

+ 32 - 0
AIEmoji/Business/TSTextGeneralPictureVC/TSTextPicGennerateVC/TSTextPicGennerateVM.swift

@@ -21,6 +21,37 @@ class TSTextPicGennerateVM {
     @Published var stateDatauPblished:(TSProgressState,TSGenmojiModel?) = (TSProgressState.none,nil)
     var aiText:String = ""
     var generatingProgress = 0
+    
+//    //模拟数据
+//    //width 和 height 必须是 32 的倍数
+//    func creatImageEmoji(text:String,width:Int = Int(kTextPicW) ,height:Int = Int(kTextPicH)) {
+//        stateDatauPblished = (.start,nil)
+//        stateDatauPblished = (.progressString(generating(progress: 0.0)),nil)
+//
+//        kDelayOnMainThread(0.2) {
+//            self.stateDatauPblished = (.progressString(self.generating(progress: 0.2)),nil)
+//        }
+//        
+//        kDelayOnMainThread(0.5) {
+//            self.stateDatauPblished = (.progressString(self.generating(progress: 0.5)),nil)
+//        }
+//        
+//        kDelayOnMainThread(0.8) {
+//            self.stateDatauPblished = (.progressString(self.generating(progress: 0.8)),nil)
+//        }
+//
+//
+//        kDelayOnMainThread(2.0) {
+//            if kRandomBool() {
+//                let infoModel = TSGenmojiModel(JSON:actionInfoDictPoster )
+//                self.stateDatauPblished = (.success(nil),infoModel)
+//            }else{
+//                self.stateDatauPblished = (.failed("error?.localizedDescription"),nil)
+//            }
+//        }
+//        
+//    }
+    
     //width 和 height 必须是 32 的倍数
     func creatImageEmoji(text:String,width:Int = Int(kTextPicW) ,height:Int = Int(kTextPicH)) {
         generatingProgress = 0
@@ -46,6 +77,7 @@ class TSTextPicGennerateVM {
         }
     }
     
+    
     func getActionInfo(action_id:Int){
         queryRequest = TSNetworkShared.get(urlType: .actionInfo,parameters: ["action_id":action_id]) { [weak self] data,error in
             guard let self = self else { return }

+ 2 - 34
AIEmoji/Business/VIewTool/TSCommonloadingView.swift

@@ -33,14 +33,14 @@ class TSCommonloadingView: TSBaseView {
     }()
     
     lazy var textLabel: UILabel = {
-//        let textLabel = UILabel.createLabel(font: .font(size: 12),textColor: .fromHex("#FFFFFF",alpha: 0.6))
-        let textLabel = UILabel.createLabel(font: .font(size: 18),textColor: .white)
+        let textLabel = UILabel.createLabel(font: .font(size: 12),textColor: .fromHex("#FFFFFF",alpha: 0.6))
         return textLabel
     }()
     
     private var targetView: UIView = UIView()
     
     override func creatUI() {
+        
         contentView.addSubview(imageView)
         imageView.snp.makeConstraints { make in
             make.width.height.equalTo(200.0)
@@ -123,38 +123,6 @@ class TSCommonloadingView: TSBaseView {
         isRotating = false
     }
     
-//    /// 开始旋转
-//    func startRotating(view:UIView,duration: Double = 2.0) {
-//        targetView = view
-//        stopRotating(view: view)
-//        let rotationAnimation = CABasicAnimation(keyPath: "transform.rotation.z")
-//        rotationAnimation.toValue = CGFloat.pi * 2
-//        rotationAnimation.duration = duration
-//        rotationAnimation.isCumulative = true
-//        rotationAnimation.repeatCount = .infinity
-//
-//        view.layer.add(rotationAnimation, forKey: "rotationAnimation")
-//    }
-//
-//    /// 停止旋转
-//    func stopRotating(view:UIView) {
-//        view.layer.removeAnimation(forKey: "rotationAnimation")
-//    }
-//    
-//    func showLoading(text:String){
-//        imageView.image = UIImage(named: "rotating")
-//        textLabel.text = text
-//        isRotating = true
-//    }
-//    
-//    func showError(text:String){
-//        imageView.image = UIImage(named: "failed")
-//        textLabel.text = text
-//        isRotating = false
-//    }
-
-    
-    
     @objc private func handleAppDidEnterBackground() {
         stopRotating(view: targetView)
     }

+ 136 - 0
AIEmoji/Business/VIewTool/TSGeneratorloadingView.swift

@@ -0,0 +1,136 @@
+//
+//  TSGeneratorloadingView.swift
+//  AIEmoji
+//
+//  Created by 100Years on 2025/4/2.
+//
+
+import Kingfisher
+
+class TSGeneratorloadingView: TSBaseView {
+    
+    lazy var imageView: UIImageView = {
+        let imageView = UIImageView.createImageView(imageName: "failed_big")
+        imageView.isHidden = true
+        return imageView
+    }()
+    
+    lazy var animatedImageView: AnimatedImageView = {
+        let animatedImageView = AnimatedImageView()
+        animatedImageView.autoPlayAnimatedImage = false
+        if let gifURL = Bundle.main.url(forResource: "rotatingAnimation", withExtension: "gif") {
+            animatedImageView.kf.setImage(with: gifURL, options: [.cacheOriginalImage]) { result in
+                switch result {
+                case .success(let value):
+                    print("GIF 加载成功: \(value.source.url?.absoluteString ?? "")")
+                case .failure(let error):
+                    print("GIF 加载失败: \(error.localizedDescription)")
+                }
+            }
+        }
+        
+        return animatedImageView
+    }()
+    
+    lazy var textLabel: UILabel = {
+        let textLabel = UILabel.createLabel(font: .font(size: 18),textColor: .white,textAlignment: .center)
+        return textLabel
+    }()
+    
+    private var targetView: UIView = UIView()
+    
+    override func creatUI() {
+        
+        let blurEffect = createBlurEffectView(style: .dark)
+        contentView.addSubview(blurEffect)
+        
+        contentView.addSubview(imageView)
+        imageView.snp.makeConstraints { make in
+            make.width.height.equalTo(200.0)
+            make.centerX.equalToSuperview()
+            make.top.equalTo(300.0)
+        }
+        
+        contentView.addSubview(animatedImageView)
+        animatedImageView.snp.makeConstraints { make in
+            make.width.height.equalTo(200.0)
+            make.centerX.equalToSuperview()
+            make.top.equalTo(300.0)
+        }
+  
+        contentView.addSubview(textLabel)
+        textLabel.snp.makeConstraints { make in
+            make.top.equalTo(imageView.snp.bottom).offset(0)
+            make.leading.equalTo(16)
+            make.trailing.equalTo(-16)
+        }
+    }
+    
+    
+    override func dealThings() {
+        // 监听应用生命周期事件
+        NotificationCenter.default.addObserver(
+            self,
+            selector: #selector(handleAppDidEnterBackground),
+            name: UIApplication.didEnterBackgroundNotification,
+            object: nil
+        )
+        
+        NotificationCenter.default.addObserver(
+            self,
+            selector: #selector(handleAppWillEnterForeground),
+            name: UIApplication.willEnterForegroundNotification,
+            object: nil
+        )
+    }
+    
+    
+    lazy var isRotating = false{
+        didSet{
+            if isRotating == true{
+                startRotating(view: imageView)
+            }else{
+                stopRotating(view: imageView)
+            }
+        }
+    }
+    
+    
+    /// 开始旋转
+    func startRotating(view:UIView,duration: Double = 2.0) {
+        kDelayMainShort {
+            self.animatedImageView.startAnimating()
+        }
+    }
+
+    /// 停止旋转
+    func stopRotating(view:UIView) {
+        animatedImageView.stopAnimating()
+    }
+    
+    func showLoading(text:String){
+        animatedImageView.isHidden = false
+        imageView.isHidden = true
+        
+        textLabel.text = text
+        isRotating = true
+    }
+    
+    func showError(text:String){
+        animatedImageView.isHidden = true
+        
+        imageView.isHidden = false
+        imageView.image = UIImage(named: "failed_big")
+        
+        textLabel.text = text
+        isRotating = false
+    }
+    
+    @objc private func handleAppDidEnterBackground() {
+        stopRotating(view: targetView)
+    }
+
+    @objc private func handleAppWillEnterForeground() {
+        isRotating = isRotating
+    }
+}

+ 4 - 1
AIEmoji/Common/Ex/UIFont+TSEx.swift

@@ -6,6 +6,9 @@
 //
 
 public extension FontName {
-    static let AccentURW   = "AccentURW"
+    static let AccentURW   = "AccentURWReg"
     static let PoppinsBlackItalic   = "Poppins-BlackItalic"
+    
+    static let KelsiFill   = "Kelsi 1"
+    static let KelsiRegular   = "Kelsi"
 }

+ 1 - 0
AIEmoji/Common/Tool/TSCommonTool/TSCommonTool.swift

@@ -221,3 +221,4 @@ func kExecuteOnMainThread(_ block: @escaping () -> Void) {
     }
 }
 
+let kAppName:String = "Ghiblix"

+ 0 - 54
AIEmoji/DataManger/Config/TSConfig.swift

@@ -4,60 +4,6 @@
 //
 //  Created by 100Years on 2024/12/20.
 //
-//class TSConfig: NSObject {
-//    static let appLanguage: String = {
-//        let systemLanguages = UserDefaults.standard.value(forKey: "AppleLanguages")
-//        var currentLanguage: String?
-//        if let arr = systemLanguages as? [String] {
-//            currentLanguage = arr.first
-//        }
-//        else if let str = systemLanguages as? String {
-//            currentLanguage = str
-//        }
-//        return currentLanguage ?? ""
-//    }()
-//    
-//    static let appLanguageShort: String? = {
-//        let currentLanguage = Bundle.main.preferredLocalizations.first
-//        if let str = currentLanguage?.components(separatedBy: "-").first,
-//           str.count >= 2 {
-//            return str
-//        }
-//        return nil
-//    }()
-//    
-//    static let isLanguageZh: Bool = {
-//        if appLanguage.lowercased().hasPrefix("zh") {
-//            return true
-//        }
-//        return false
-//    }()
-//    
-//    static let isLanguageJa: Bool = {
-//        if appLanguage.lowercased().hasPrefix("ja") {
-//            return true
-//        }
-//        return false
-//    }()
-//    
-//    static var languageSuffix: String {
-//        if appLanguage.lowercased().hasPrefix("zh") {
-//            return "-zh"
-//        }
-//        return ""
-//    }
-    
-//    static var isChinaRegion: Bool {
-//#if DEBUG
-//        return true
-//#endif
-//        let localeId = Locale.current.identifier
-//        return localeId.contains("_CN")
-//    }
-//    
-//    static let appid = "6740220736" 
-//
-//}
 
 extension UIColor {
     /// 背景色

+ 3 - 1
AIEmoji/Info.plist

@@ -10,7 +10,9 @@
 	<key>UIAppFonts</key>
 	<array>
 		<string>Poppins-BlackItalic.ttf</string>
-		<string>AccentURW.ttf</string>
+		<string>AccentURW-Reg.ttf</string>
+		<string>Kelsi-fill.otf</string>
+		<string>Kelsi-Regular.otf</string>
 	</array>
 </dict>
 </plist>

+ 0 - 0
AIEmoji/Res/AccentURW.ttf → AIEmoji/Res/AccentURW-Reg.ttf


BIN
AIEmoji/Res/Kelsi-Regular.otf


BIN
AIEmoji/Res/Kelsi-fill.otf