Browse Source

生成 ai 图片已开发完毕

100Years 2 months ago
parent
commit
78e66a6722
100 changed files with 2754 additions and 71 deletions
  1. 92 0
      .gitignore
  2. 781 31
      AIEmoji.xcodeproj/project.pbxproj
  3. 78 0
      AIEmoji.xcodeproj/xcshareddata/xcschemes/AIEmoji.xcscheme
  4. 9 1
      AIEmoji.xcodeproj/xcuserdata/100years.xcuserdatad/xcschemes/xcschememanagement.plist
  5. 10 0
      AIEmoji.xcworkspace/contents.xcworkspacedata
  6. 17 15
      AIEmoji/AppDelegate.swift
  7. 6 0
      AIEmoji/Assets.xcassets/Common/Contents.json
  8. 22 0
      AIEmoji/Assets.xcassets/Common/delete.imageset/Contents.json
  9. BIN
      AIEmoji/Assets.xcassets/Common/delete.imageset/delete@2x.png
  10. BIN
      AIEmoji/Assets.xcassets/Common/delete.imageset/delete@3x.png
  11. 22 0
      AIEmoji/Assets.xcassets/Common/failed.imageset/Contents.json
  12. BIN
      AIEmoji/Assets.xcassets/Common/failed.imageset/failed@2x.png
  13. BIN
      AIEmoji/Assets.xcassets/Common/failed.imageset/failed@3x.png
  14. 22 0
      AIEmoji/Assets.xcassets/Common/navi_back_white.imageset/Contents.json
  15. BIN
      AIEmoji/Assets.xcassets/Common/navi_back_white.imageset/navi_back_white@2x.png
  16. BIN
      AIEmoji/Assets.xcassets/Common/navi_back_white.imageset/navi_back_white@3x.png
  17. 22 0
      AIEmoji/Assets.xcassets/Common/page_left.imageset/Contents.json
  18. BIN
      AIEmoji/Assets.xcassets/Common/page_left.imageset/page_left@2x.png
  19. BIN
      AIEmoji/Assets.xcassets/Common/page_left.imageset/page_left@3x.png
  20. 22 0
      AIEmoji/Assets.xcassets/Common/page_right.imageset/Contents.json
  21. BIN
      AIEmoji/Assets.xcassets/Common/page_right.imageset/page_right@2x.png
  22. BIN
      AIEmoji/Assets.xcassets/Common/page_right.imageset/page_right@3x.png
  23. 22 0
      AIEmoji/Assets.xcassets/Common/rotating.imageset/Contents.json
  24. BIN
      AIEmoji/Assets.xcassets/Common/rotating.imageset/rotating@2x.png
  25. BIN
      AIEmoji/Assets.xcassets/Common/rotating.imageset/rotating@3x.png
  26. 22 0
      AIEmoji/Assets.xcassets/Common/setting.imageset/Contents.json
  27. BIN
      AIEmoji/Assets.xcassets/Common/setting.imageset/setting@2x.png
  28. BIN
      AIEmoji/Assets.xcassets/Common/setting.imageset/setting@3x.png
  29. 22 0
      AIEmoji/Assets.xcassets/Common/submit_btn_bg.imageset/Contents.json
  30. BIN
      AIEmoji/Assets.xcassets/Common/submit_btn_bg.imageset/submit_btn_bg@2x.png
  31. BIN
      AIEmoji/Assets.xcassets/Common/submit_btn_bg.imageset/submit_btn_bg@3x.png
  32. 22 0
      AIEmoji/Assets.xcassets/Common/submit_btn_small_bg.imageset/Contents.json
  33. BIN
      AIEmoji/Assets.xcassets/Common/submit_btn_small_bg.imageset/submit_btn_small_bg@2x.png
  34. BIN
      AIEmoji/Assets.xcassets/Common/submit_btn_small_bg.imageset/submit_btn_small_bg@3x.png
  35. 22 0
      AIEmoji/Assets.xcassets/Common/success_icon.imageset/Contents.json
  36. BIN
      AIEmoji/Assets.xcassets/Common/success_icon.imageset/icon_已下载@2x.png
  37. BIN
      AIEmoji/Assets.xcassets/Common/success_icon.imageset/icon_已下载@3x.png
  38. 22 0
      AIEmoji/Assets.xcassets/Common/tutorials_banner.imageset/Contents.json
  39. BIN
      AIEmoji/Assets.xcassets/Common/tutorials_banner.imageset/tutorials_banner@2x.png
  40. BIN
      AIEmoji/Assets.xcassets/Common/tutorials_banner.imageset/tutorials_banner@3x.png
  41. 22 0
      AIEmoji/Assets.xcassets/Common/white_right_arrow.imageset/Contents.json
  42. BIN
      AIEmoji/Assets.xcassets/Common/white_right_arrow.imageset/white_right_arrow@2x.png
  43. BIN
      AIEmoji/Assets.xcassets/Common/white_right_arrow.imageset/white_right_arrow@3x.png
  44. 22 0
      AIEmoji/Assets.xcassets/Common/x.imageset/Contents.json
  45. BIN
      AIEmoji/Assets.xcassets/Common/x.imageset/x@2x.png
  46. BIN
      AIEmoji/Assets.xcassets/Common/x.imageset/x@3x.png
  47. 6 0
      AIEmoji/Assets.xcassets/Emojis/Contents.json
  48. 22 0
      AIEmoji/Assets.xcassets/Emojis/nav_title_emojis.imageset/Contents.json
  49. BIN
      AIEmoji/Assets.xcassets/Emojis/nav_title_emojis.imageset/nav_title_genmoji@2x.png
  50. BIN
      AIEmoji/Assets.xcassets/Emojis/nav_title_emojis.imageset/nav_title_genmoji@3x.png
  51. 6 0
      AIEmoji/Assets.xcassets/Genmoji/Contents.json
  52. 22 0
      AIEmoji/Assets.xcassets/Genmoji/genmoji_robot.imageset/Contents.json
  53. BIN
      AIEmoji/Assets.xcassets/Genmoji/genmoji_robot.imageset/genmoji_robot@2x.png
  54. BIN
      AIEmoji/Assets.xcassets/Genmoji/genmoji_robot.imageset/genmoji_robot@3x.png
  55. 22 0
      AIEmoji/Assets.xcassets/Genmoji/nav_title_genmoji.imageset/Contents.json
  56. BIN
      AIEmoji/Assets.xcassets/Genmoji/nav_title_genmoji.imageset/nav_title_emojis@2x.png
  57. BIN
      AIEmoji/Assets.xcassets/Genmoji/nav_title_genmoji.imageset/nav_title_emojis@3x.png
  58. 6 0
      AIEmoji/Assets.xcassets/Tabbar/Contents.json
  59. 22 0
      AIEmoji/Assets.xcassets/Tabbar/tabbar_select_edit.imageset/Contents.json
  60. BIN
      AIEmoji/Assets.xcassets/Tabbar/tabbar_select_edit.imageset/tabbar_select_edit@2x.png
  61. BIN
      AIEmoji/Assets.xcassets/Tabbar/tabbar_select_edit.imageset/tabbar_select_edit@3x.png
  62. 22 0
      AIEmoji/Assets.xcassets/Tabbar/tabbar_select_home.imageset/Contents.json
  63. BIN
      AIEmoji/Assets.xcassets/Tabbar/tabbar_select_home.imageset/tabbar_select_home@2x.png
  64. BIN
      AIEmoji/Assets.xcassets/Tabbar/tabbar_select_home.imageset/tabbar_select_home@3x.png
  65. 22 0
      AIEmoji/Assets.xcassets/Tabbar/tabbar_select_mark.imageset/Contents.json
  66. BIN
      AIEmoji/Assets.xcassets/Tabbar/tabbar_select_mark.imageset/tabbar_select_mark@2x.png
  67. BIN
      AIEmoji/Assets.xcassets/Tabbar/tabbar_select_mark.imageset/tabbar_select_mark@3x.png
  68. 22 0
      AIEmoji/Assets.xcassets/Tabbar/tabbar_select_mine.imageset/Contents.json
  69. BIN
      AIEmoji/Assets.xcassets/Tabbar/tabbar_select_mine.imageset/tabbar_select_mine@2x.png
  70. BIN
      AIEmoji/Assets.xcassets/Tabbar/tabbar_select_mine.imageset/tabbar_select_mine@3x.png
  71. 22 0
      AIEmoji/Assets.xcassets/Tabbar/tabbar_select_random.imageset/Contents.json
  72. BIN
      AIEmoji/Assets.xcassets/Tabbar/tabbar_select_random.imageset/tabbar_select_random@2x.png
  73. BIN
      AIEmoji/Assets.xcassets/Tabbar/tabbar_select_random.imageset/tabbar_select_random@3x.png
  74. 22 0
      AIEmoji/Assets.xcassets/Tabbar/tabbar_unSelect_edit.imageset/Contents.json
  75. BIN
      AIEmoji/Assets.xcassets/Tabbar/tabbar_unSelect_edit.imageset/tabbar_unSelect_edit@2x.png
  76. BIN
      AIEmoji/Assets.xcassets/Tabbar/tabbar_unSelect_edit.imageset/tabbar_unSelect_edit@3x.png
  77. 22 0
      AIEmoji/Assets.xcassets/Tabbar/tabbar_unSelect_home.imageset/Contents.json
  78. BIN
      AIEmoji/Assets.xcassets/Tabbar/tabbar_unSelect_home.imageset/tabbar_unSelect_home@2x.png
  79. BIN
      AIEmoji/Assets.xcassets/Tabbar/tabbar_unSelect_home.imageset/tabbar_unSelect_home@3x.png
  80. 22 0
      AIEmoji/Assets.xcassets/Tabbar/tabbar_unSelect_mine.imageset/Contents.json
  81. BIN
      AIEmoji/Assets.xcassets/Tabbar/tabbar_unSelect_mine.imageset/tabbar_unSelect_mine@2x.png
  82. BIN
      AIEmoji/Assets.xcassets/Tabbar/tabbar_unSelect_mine.imageset/tabbar_unSelect_mine@3x.png
  83. 22 0
      AIEmoji/Assets.xcassets/Tabbar/tabbar_unSelect_random.imageset/Contents.json
  84. BIN
      AIEmoji/Assets.xcassets/Tabbar/tabbar_unSelect_random.imageset/tabbar_unSelect_random@2x.png
  85. BIN
      AIEmoji/Assets.xcassets/Tabbar/tabbar_unSelect_random.imageset/tabbar_unSelect_random@3x.png
  86. 0 24
      AIEmoji/Base.lproj/Main.storyboard
  87. 117 0
      AIEmoji/Business/General/TSBottomAlertVC.swift
  88. 182 0
      AIEmoji/Business/General/TSSmallIconBrowseVC/TSSmallIconBrowseVC.swift
  89. 24 0
      AIEmoji/Business/General/TSSmallIconBrowseVC/View/TSSmallIconBrowseCell.swift
  90. 139 0
      AIEmoji/Business/TSEmojisVC/TSEmojisChildVC/TSEmojisChildVC.swift
  91. 14 0
      AIEmoji/Business/TSEmojisVC/TSEmojisChildVC/ViewModel/TSEmojisChildColViewModel.swift
  92. 147 0
      AIEmoji/Business/TSEmojisVC/TSEmojisVC/TSEmojisVC.swift
  93. 22 0
      AIEmoji/Business/TSEmojisVC/TSEmojisVC/ViewModel/TSEmojisColViewModel.swift
  94. 157 0
      AIEmoji/Business/TSGenmojiVC/TSGenmojiGennerateVC/TSGenmojiGennerateVC.swift
  95. 62 0
      AIEmoji/Business/TSGenmojiVC/TSGenmojiGennerateVC/TSGenmojiGennerateViewModel.swift
  96. 59 0
      AIEmoji/Business/TSGenmojiVC/TSGenmojiVC/Model/TSGenmojiModel.swift
  97. 118 0
      AIEmoji/Business/TSGenmojiVC/TSGenmojiVC/TSGenmojiVC.swift
  98. 46 0
      AIEmoji/Business/TSGenmojiVC/TSGenmojiVC/View/TSGenmojiColSectionView.swift
  99. 71 0
      AIEmoji/Business/TSGenmojiVC/TSGenmojiVC/View/TSGenmojiGennerateCell.swift
  100. 35 0
      AIEmoji/Business/TSGenmojiVC/TSGenmojiVC/View/TSGenmojiItemCell.swift

+ 92 - 0
.gitignore

@@ -0,0 +1,92 @@
+# Xcode
+#
+# gitignore contributors: remember to update Global/Xcode.gitignore, Objective-C.gitignore & Swift.gitignore
+
+## User settings
+xcuserdata/
+
+## compatibility with Xcode 8 and earlier (ignoring not required starting Xcode 9)
+*.xcscmblueprint
+*.xccheckout
+
+## compatibility with Xcode 3 and earlier (ignoring not required starting Xcode 4)
+build/
+DerivedData/
+*.moved-aside
+*.pbxuser
+!default.pbxuser
+*.mode1v3
+!default.mode1v3
+*.mode2v3
+!default.mode2v3
+*.perspectivev3
+!default.perspectivev3
+
+## Obj-C/Swift specific
+*.hmap
+
+## App packaging
+*.ipa
+*.dSYM.zip
+*.dSYM
+
+## Playgrounds
+timeline.xctimeline
+playground.xcworkspace
+
+# Swift Package Manager
+#
+# Add this line if you want to avoid checking in source code from Swift Package Manager dependencies.
+# Packages/
+# Package.pins
+# Package.resolved
+# *.xcodeproj
+#
+# Xcode automatically generates this directory with a .xcworkspacedata file and xcuserdata
+# hence it is not needed unless you have added a package configuration file to your project
+# .swiftpm
+
+.build/
+
+# CocoaPods
+#
+# We recommend against adding the Pods directory to your .gitignore. However
+# you should judge for yourself, the pros and cons are mentioned at:
+# https://guides.cocoapods.org/using/using-cocoapods.html#should-i-check-the-pods-directory-into-source-control
+
+Pods/
+!Podfile.lock
+
+# Add this line if you want to avoid checking in source code from the Xcode workspace
+# *.xcworkspace
+
+# Carthage
+#
+# Add this line if you want to avoid checking in source code from Carthage dependencies.
+# Carthage/Checkouts
+
+Carthage/Build/
+
+# Accio dependency management
+Dependencies/
+.accio/
+
+# fastlane
+#
+# It is recommended to not store the screenshots in the git repo.
+# Instead, use fastlane to re-generate the screenshots whenever they are needed.
+# For more information about the recommended setup visit:
+# https://docs.fastlane.tools/best-practices/source-control/#source-control
+
+fastlane/report.xml
+fastlane/Preview.html
+fastlane/screenshots/**/*.png
+fastlane/test_output
+
+# Code Injection
+#
+# After new code Injection tools there's a generated folder /iOSInjectionProject
+# https://github.com/johnno1962/injectionforxcode
+
+iOSInjectionProject/
+

+ 781 - 31
AIEmoji.xcodeproj/project.pbxproj

@@ -6,47 +6,222 @@
 	objectVersion = 77;
 	objects = {
 
+/* Begin PBXBuildFile section */
+		A8F7748B2D38E8B700AA6E93 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = A8F774812D38E8B700AA6E93 /* AppDelegate.swift */; };
+		A8F7748E2D38E8B700AA6E93 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = A8F774822D38E8B700AA6E93 /* Assets.xcassets */; };
+		A8F774902D38E8B700AA6E93 /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = A8F774852D38E8B700AA6E93 /* LaunchScreen.storyboard */; };
+		A8F774D92D38EA8C00AA6E93 /* UICollectionView+More.swift in Sources */ = {isa = PBXBuildFile; fileRef = A8F774D22D38EA8C00AA6E93 /* UICollectionView+More.swift */; };
+		A8F774DA2D38EA8C00AA6E93 /* UIFont+Ex.swift in Sources */ = {isa = PBXBuildFile; fileRef = A8F774AA2D38EA8C00AA6E93 /* UIFont+Ex.swift */; };
+		A8F774DB2D38EA8C00AA6E93 /* AVAsset+Ex.swift in Sources */ = {isa = PBXBuildFile; fileRef = A8F774A02D38EA8C00AA6E93 /* AVAsset+Ex.swift */; };
+		A8F774DC2D38EA8C00AA6E93 /* NSString+Ex.swift in Sources */ = {isa = PBXBuildFile; fileRef = A8F774A52D38EA8C00AA6E93 /* NSString+Ex.swift */; };
+		A8F774DE2D38EA8C00AA6E93 /* UIDevice+Extension.swift in Sources */ = {isa = PBXBuildFile; fileRef = A8F774A92D38EA8C00AA6E93 /* UIDevice+Extension.swift */; };
+		A8F774E02D38EA8C00AA6E93 /* TSCommonTool.swift in Sources */ = {isa = PBXBuildFile; fileRef = A8F774C72D38EA8C00AA6E93 /* TSCommonTool.swift */; };
+		A8F774E12D38EA8C00AA6E93 /* TSFileManagerTool.swift in Sources */ = {isa = PBXBuildFile; fileRef = A8F774CA2D38EA8C00AA6E93 /* TSFileManagerTool.swift */; };
+		A8F774E22D38EA8C00AA6E93 /* UICollectionView+Ex.swift in Sources */ = {isa = PBXBuildFile; fileRef = A8F774A72D38EA8C00AA6E93 /* UICollectionView+Ex.swift */; };
+		A8F774E32D38EA8C00AA6E93 /* TSBasicItemModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = A8F7749A2D38EA8C00AA6E93 /* TSBasicItemModel.swift */; };
+		A8F774E42D38EA8C00AA6E93 /* Component.swift in Sources */ = {isa = PBXBuildFile; fileRef = A8F774D12D38EA8C00AA6E93 /* Component.swift */; };
+		A8F774E52D38EA8C00AA6E93 /* Color+Ex.swift in Sources */ = {isa = PBXBuildFile; fileRef = A8F7749C2D38EA8C00AA6E93 /* Color+Ex.swift */; };
+		A8F774E62D38EA8C00AA6E93 /* UIScreen.swift in Sources */ = {isa = PBXBuildFile; fileRef = A8F774AE2D38EA8C00AA6E93 /* UIScreen.swift */; };
+		A8F774E82D38EA8C00AA6E93 /* CollectionViewComponent.swift in Sources */ = {isa = PBXBuildFile; fileRef = A8F774CF2D38EA8C00AA6E93 /* CollectionViewComponent.swift */; };
+		A8F774E92D38EA8C00AA6E93 /* UILabel+Ex.swift in Sources */ = {isa = PBXBuildFile; fileRef = A8F774AD2D38EA8C00AA6E93 /* UILabel+Ex.swift */; };
+		A8F774EB2D38EA8C00AA6E93 /* TSBaseNavigationC.swift in Sources */ = {isa = PBXBuildFile; fileRef = A8F774962D38EA8C00AA6E93 /* TSBaseNavigationC.swift */; };
+		A8F774EC2D38EA8C00AA6E93 /* TSToastTool.swift in Sources */ = {isa = PBXBuildFile; fileRef = A8F774CC2D38EA8C00AA6E93 /* TSToastTool.swift */; };
+		A8F774ED2D38EA8C00AA6E93 /* Font+Ex.swift in Sources */ = {isa = PBXBuildFile; fileRef = A8F7749D2D38EA8C00AA6E93 /* Font+Ex.swift */; };
+		A8F774EE2D38EA8C00AA6E93 /* UIViewController+Ex.swift in Sources */ = {isa = PBXBuildFile; fileRef = A8F774B02D38EA8C00AA6E93 /* UIViewController+Ex.swift */; };
+		A8F774EF2D38EA8C00AA6E93 /* UIImage+Ex.swift in Sources */ = {isa = PBXBuildFile; fileRef = A8F774AB2D38EA8C00AA6E93 /* UIImage+Ex.swift */; };
+		A8F774F02D38EA8C00AA6E93 /* TSBaseCollectionCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = A8F774932D38EA8C00AA6E93 /* TSBaseCollectionCell.swift */; };
+		A8F774F12D38EA8C00AA6E93 /* CGFloat+Ex.swift in Sources */ = {isa = PBXBuildFile; fileRef = A8F774A12D38EA8C00AA6E93 /* CGFloat+Ex.swift */; };
+		A8F774F22D38EA8C00AA6E93 /* TSBaseView.swift in Sources */ = {isa = PBXBuildFile; fileRef = A8F774992D38EA8C00AA6E93 /* TSBaseView.swift */; };
+		A8F774F42D38EA8C00AA6E93 /* TSBaseNavigationBarView.swift in Sources */ = {isa = PBXBuildFile; fileRef = A8F774952D38EA8C00AA6E93 /* TSBaseNavigationBarView.swift */; };
+		A8F774F52D38EA8C00AA6E93 /* Array+Ex.swift in Sources */ = {isa = PBXBuildFile; fileRef = A8F7749F2D38EA8C00AA6E93 /* Array+Ex.swift */; };
+		A8F774F62D38EA8C00AA6E93 /* UIImageView+Ex.swift in Sources */ = {isa = PBXBuildFile; fileRef = A8F774AC2D38EA8C00AA6E93 /* UIImageView+Ex.swift */; };
+		A8F774F82D38EA8C00AA6E93 /* TSSimpleTableView.swift in Sources */ = {isa = PBXBuildFile; fileRef = A8F774D42D38EA8C00AA6E93 /* TSSimpleTableView.swift */; };
+		A8F774F92D38EA8C00AA6E93 /* UIColor+Ex.swift in Sources */ = {isa = PBXBuildFile; fileRef = A8F774A82D38EA8C00AA6E93 /* UIColor+Ex.swift */; };
+		A8F774FA2D38EA8C00AA6E93 /* TSBaseModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = A8F774942D38EA8C00AA6E93 /* TSBaseModel.swift */; };
+		A8F774FB2D38EA8C00AA6E93 /* TSNetwork.swift in Sources */ = {isa = PBXBuildFile; fileRef = A8F774B62D38EA8C00AA6E93 /* TSNetwork.swift */; };
+		A8F774FE2D38EA8C00AA6E93 /* Int+Ex.swift in Sources */ = {isa = PBXBuildFile; fileRef = A8F774A42D38EA8C00AA6E93 /* Int+Ex.swift */; };
+		A8F774FF2D38EA8C00AA6E93 /* UserDefault+Ex.swift in Sources */ = {isa = PBXBuildFile; fileRef = A8F774B12D38EA8C00AA6E93 /* UserDefault+Ex.swift */; };
+		A8F775002D38EA8C00AA6E93 /* WindowHelper.swift in Sources */ = {isa = PBXBuildFile; fileRef = A8F774CD2D38EA8C00AA6E93 /* WindowHelper.swift */; };
+		A8F775012D38EA8C00AA6E93 /* UIButton+Ex.swift in Sources */ = {isa = PBXBuildFile; fileRef = A8F774A62D38EA8C00AA6E93 /* UIButton+Ex.swift */; };
+		A8F775022D38EA8C00AA6E93 /* Dictionary+Ex.swift in Sources */ = {isa = PBXBuildFile; fileRef = A8F774A32D38EA8C00AA6E93 /* Dictionary+Ex.swift */; };
+		A8F775032D38EA8C00AA6E93 /* GlobalImports.swift in Sources */ = {isa = PBXBuildFile; fileRef = A8F774B42D38EA8C00AA6E93 /* GlobalImports.swift */; };
+		A8F775062D38EA8C00AA6E93 /* Date+Ex.swift in Sources */ = {isa = PBXBuildFile; fileRef = A8F774A22D38EA8C00AA6E93 /* Date+Ex.swift */; };
+		A8F775072D38EA8C00AA6E93 /* View+Ex.swift in Sources */ = {isa = PBXBuildFile; fileRef = A8F774B22D38EA8C00AA6E93 /* View+Ex.swift */; };
+		A8F775082D38EA8C00AA6E93 /* UITableView+Ex.swift in Sources */ = {isa = PBXBuildFile; fileRef = A8F774AF2D38EA8C00AA6E93 /* UITableView+Ex.swift */; };
+		A8F775092D38EA8C00AA6E93 /* CommonSectionComponent.swift in Sources */ = {isa = PBXBuildFile; fileRef = A8F774D02D38EA8C00AA6E93 /* CommonSectionComponent.swift */; };
+		A8F7750A2D38EA8C00AA6E93 /* TSNetworkTool.swift in Sources */ = {isa = PBXBuildFile; fileRef = A8F774CB2D38EA8C00AA6E93 /* TSNetworkTool.swift */; };
+		A8F7750B2D38EA8C00AA6E93 /* TSBaseTabViewCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = A8F774972D38EA8C00AA6E93 /* TSBaseTabViewCell.swift */; };
+		A8F7750D2D38EA8C00AA6E93 /* TSBaseVC.swift in Sources */ = {isa = PBXBuildFile; fileRef = A8F774982D38EA8C00AA6E93 /* TSBaseVC.swift */; };
+		A8F775172D38EB7400AA6E93 /* TSTabBarController.swift in Sources */ = {isa = PBXBuildFile; fileRef = A8F775162D38EB7400AA6E93 /* TSTabBarController.swift */; };
+		A8F775192D38EC6800AA6E93 /* TSEmojisVC.swift in Sources */ = {isa = PBXBuildFile; fileRef = A8F775182D38EC6700AA6E93 /* TSEmojisVC.swift */; };
+		A8F7751B2D38EC9800AA6E93 /* TSGenmojiVC.swift in Sources */ = {isa = PBXBuildFile; fileRef = A8F7751A2D38EC9700AA6E93 /* TSGenmojiVC.swift */; };
+		A8F7751D2D38ECA700AA6E93 /* TSWallpaperVC.swift in Sources */ = {isa = PBXBuildFile; fileRef = A8F7751C2D38ECA600AA6E93 /* TSWallpaperVC.swift */; };
+		A8F775252D38ED8300AA6E93 /* TSConfig.swift in Sources */ = {isa = PBXBuildFile; fileRef = A8F775232D38ED8300AA6E93 /* TSConfig.swift */; };
+		A8F775282D38F08C00AA6E93 /* IBaseResponse.swift in Sources */ = {isa = PBXBuildFile; fileRef = A8F775262D38F08C00AA6E93 /* IBaseResponse.swift */; };
+		A8F775292D38F08C00AA6E93 /* INetConfiguration.swift in Sources */ = {isa = PBXBuildFile; fileRef = A8F775272D38F08C00AA6E93 /* INetConfiguration.swift */; };
+		A8F7752E2D38F19D00AA6E93 /* NetResponse.swift in Sources */ = {isa = PBXBuildFile; fileRef = A8F7752B2D38F19D00AA6E93 /* NetResponse.swift */; };
+		A8F7752F2D38F19D00AA6E93 /* NetWork+HandyJson.swift in Sources */ = {isa = PBXBuildFile; fileRef = A8F7752C2D38F19D00AA6E93 /* NetWork+HandyJson.swift */; };
+		A8F775302D38F19D00AA6E93 /* NetConfiguration.swift in Sources */ = {isa = PBXBuildFile; fileRef = A8F7752A2D38F19D00AA6E93 /* NetConfiguration.swift */; };
+		A8F775322D38FA5E00AA6E93 /* UITextView+Ex.swift in Sources */ = {isa = PBXBuildFile; fileRef = A8F775312D38FA5200AA6E93 /* UITextView+Ex.swift */; };
+		A8F775352D38FC9A00AA6E93 /* TSViewTool.swift in Sources */ = {isa = PBXBuildFile; fileRef = A8F775342D38FC9A00AA6E93 /* TSViewTool.swift */; };
+		A8F775382D390C3C00AA6E93 /* TSNetworkManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = A8F775372D390C3C00AA6E93 /* TSNetworkManager.swift */; };
+		A8F7753B2D3918DE00AA6E93 /* TSNetworkManager+Loading.swift in Sources */ = {isa = PBXBuildFile; fileRef = A8F7753A2D3918D700AA6E93 /* TSNetworkManager+Loading.swift */; };
+		A8F7753D2D3918F800AA6E93 /* TSNetWork+Business.swift in Sources */ = {isa = PBXBuildFile; fileRef = A8F7753C2D3918E200AA6E93 /* TSNetWork+Business.swift */; };
+		A8F7753F2D39340E00AA6E93 /* TSSetingVC.swift in Sources */ = {isa = PBXBuildFile; fileRef = A8F7753E2D39340D00AA6E93 /* TSSetingVC.swift */; };
+		A8F775432D39346400AA6E93 /* TSSetingModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = A8F775422D39346100AA6E93 /* TSSetingModel.swift */; };
+		A8F775452D39347100AA6E93 /* TSSetingViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = A8F775442D39346700AA6E93 /* TSSetingViewModel.swift */; };
+		A8F775492D3935D600AA6E93 /* TSBusinessWebVC.swift in Sources */ = {isa = PBXBuildFile; fileRef = A8F775472D3935D600AA6E93 /* TSBusinessWebVC.swift */; };
+		A8F7754B2D39376800AA6E93 /* TSSettingListView.swift in Sources */ = {isa = PBXBuildFile; fileRef = A8F7754A2D39376700AA6E93 /* TSSettingListView.swift */; };
+		A8F7754E2D39E59100AA6E93 /* TSGenmojiModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = A8F7754D2D39E58B00AA6E93 /* TSGenmojiModel.swift */; };
+		A8F775502D39ECED00AA6E93 /* PhotoManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = A8F7754F2D39ECED00AA6E93 /* PhotoManager.swift */; };
+		A8F775532D3A038800AA6E93 /* SwiftUIX in Frameworks */ = {isa = PBXBuildFile; productRef = A8F775522D3A038800AA6E93 /* SwiftUIX */; };
+		A8F776212D3A3F0200AA6E93 /* TSEmojisChildVC.swift in Sources */ = {isa = PBXBuildFile; fileRef = A8F776202D3A3F0100AA6E93 /* TSEmojisChildVC.swift */; };
+		A8F776272D3A6EC200AA6E93 /* TSGenmojiTextView.swift in Sources */ = {isa = PBXBuildFile; fileRef = A8F776262D3A6EBA00AA6E93 /* TSGenmojiTextView.swift */; };
+		A8F7762B2D3A70B200AA6E93 /* PaddedLabel.swift in Sources */ = {isa = PBXBuildFile; fileRef = A8F7762A2D3A70AF00AA6E93 /* PaddedLabel.swift */; };
+		A8F7762D2D3A74A100AA6E93 /* TSGenmojiGennerateCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = A8F7762C2D3A748800AA6E93 /* TSGenmojiGennerateCell.swift */; };
+		A8F7762F2D3A765400AA6E93 /* TSGenmojiViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = A8F7762E2D3A764E00AA6E93 /* TSGenmojiViewModel.swift */; };
+		A8F776322D3A771400AA6E93 /* TSGenmojiCollectionViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = A8F776312D3A771100AA6E93 /* TSGenmojiCollectionViewModel.swift */; };
+		A8F776352D3A7C2B00AA6E93 /* TSGenmojiColSectionView.swift in Sources */ = {isa = PBXBuildFile; fileRef = A8F776342D3A7C1C00AA6E93 /* TSGenmojiColSectionView.swift */; };
+		A8F776372D3A806E00AA6E93 /* TSGenmojiItemCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = A8F776362D3A805700AA6E93 /* TSGenmojiItemCell.swift */; };
+		A8F776392D3B38E600AA6E93 /* TSGenmojiGennerateVC.swift in Sources */ = {isa = PBXBuildFile; fileRef = A8F776382D3B38D600AA6E93 /* TSGenmojiGennerateVC.swift */; };
+		A8F7763C2D3B429B00AA6E93 /* TSCommonloadingView.swift in Sources */ = {isa = PBXBuildFile; fileRef = A8F7763B2D3B429A00AA6E93 /* TSCommonloadingView.swift */; };
+		A8F7763F2D3B68E100AA6E93 /* TSGenmojiGennerateViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = A8F7763E2D3B68E000AA6E93 /* TSGenmojiGennerateViewModel.swift */; };
+		A8F776422D3B75FC00AA6E93 /* TSBottomAlertVC.swift in Sources */ = {isa = PBXBuildFile; fileRef = A8F776412D3B75EF00AA6E93 /* TSBottomAlertVC.swift */; };
+		A8F776452D3DE8A800AA6E93 /* TSSmallIconBrowseVC.swift in Sources */ = {isa = PBXBuildFile; fileRef = A8F776442D3DE8A600AA6E93 /* TSSmallIconBrowseVC.swift */; };
+		A8F776482D3DE9F600AA6E93 /* TSSmallIconBrowseCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = A8F776472D3DE9C200AA6E93 /* TSSmallIconBrowseCell.swift */; };
+		A8F7764B2D3E008500AA6E93 /* TSEmojisChildColViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = A8F7764A2D3E007100AA6E93 /* TSEmojisChildColViewModel.swift */; };
+		A8F7764E2D3E00A800AA6E93 /* TSEmojisColViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = A8F7764D2D3E00A000AA6E93 /* TSEmojisColViewModel.swift */; };
+		D34BB2B8FE0DBF83E06A3FC4 /* Pods_AIEmoji.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 86FB4D6AEFDDA7A2017F307C /* Pods_AIEmoji.framework */; };
+/* End PBXBuildFile section */
+
 /* Begin PBXFileReference section */
+		6E77A292B548CD79E381757E /* Pods-AIEmoji.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-AIEmoji.release.xcconfig"; path = "Target Support Files/Pods-AIEmoji/Pods-AIEmoji.release.xcconfig"; sourceTree = "<group>"; };
+		86FB4D6AEFDDA7A2017F307C /* Pods_AIEmoji.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_AIEmoji.framework; sourceTree = BUILT_PRODUCTS_DIR; };
 		A8F774692D38E8B000AA6E93 /* AIEmoji.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = AIEmoji.app; sourceTree = BUILT_PRODUCTS_DIR; };
+		A8F774812D38E8B700AA6E93 /* AppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = "<group>"; };
+		A8F774822D38E8B700AA6E93 /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = "<group>"; };
+		A8F774832D38E8B700AA6E93 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = "<group>"; };
+		A8F774842D38E8B700AA6E93 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/LaunchScreen.storyboard; sourceTree = "<group>"; };
+		A8F774932D38EA8C00AA6E93 /* TSBaseCollectionCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TSBaseCollectionCell.swift; sourceTree = "<group>"; };
+		A8F774942D38EA8C00AA6E93 /* TSBaseModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TSBaseModel.swift; sourceTree = "<group>"; };
+		A8F774952D38EA8C00AA6E93 /* TSBaseNavigationBarView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TSBaseNavigationBarView.swift; sourceTree = "<group>"; };
+		A8F774962D38EA8C00AA6E93 /* TSBaseNavigationC.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TSBaseNavigationC.swift; sourceTree = "<group>"; };
+		A8F774972D38EA8C00AA6E93 /* TSBaseTabViewCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TSBaseTabViewCell.swift; sourceTree = "<group>"; };
+		A8F774982D38EA8C00AA6E93 /* TSBaseVC.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TSBaseVC.swift; sourceTree = "<group>"; };
+		A8F774992D38EA8C00AA6E93 /* TSBaseView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TSBaseView.swift; sourceTree = "<group>"; };
+		A8F7749A2D38EA8C00AA6E93 /* TSBasicItemModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TSBasicItemModel.swift; sourceTree = "<group>"; };
+		A8F7749C2D38EA8C00AA6E93 /* Color+Ex.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "Color+Ex.swift"; sourceTree = "<group>"; };
+		A8F7749D2D38EA8C00AA6E93 /* Font+Ex.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "Font+Ex.swift"; sourceTree = "<group>"; };
+		A8F7749F2D38EA8C00AA6E93 /* Array+Ex.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "Array+Ex.swift"; sourceTree = "<group>"; };
+		A8F774A02D38EA8C00AA6E93 /* AVAsset+Ex.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "AVAsset+Ex.swift"; sourceTree = "<group>"; };
+		A8F774A12D38EA8C00AA6E93 /* CGFloat+Ex.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "CGFloat+Ex.swift"; sourceTree = "<group>"; };
+		A8F774A22D38EA8C00AA6E93 /* Date+Ex.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "Date+Ex.swift"; sourceTree = "<group>"; };
+		A8F774A32D38EA8C00AA6E93 /* Dictionary+Ex.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "Dictionary+Ex.swift"; sourceTree = "<group>"; };
+		A8F774A42D38EA8C00AA6E93 /* Int+Ex.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "Int+Ex.swift"; sourceTree = "<group>"; };
+		A8F774A52D38EA8C00AA6E93 /* NSString+Ex.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "NSString+Ex.swift"; sourceTree = "<group>"; };
+		A8F774A62D38EA8C00AA6E93 /* UIButton+Ex.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "UIButton+Ex.swift"; sourceTree = "<group>"; };
+		A8F774A72D38EA8C00AA6E93 /* UICollectionView+Ex.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "UICollectionView+Ex.swift"; sourceTree = "<group>"; };
+		A8F774A82D38EA8C00AA6E93 /* UIColor+Ex.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "UIColor+Ex.swift"; sourceTree = "<group>"; };
+		A8F774A92D38EA8C00AA6E93 /* UIDevice+Extension.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "UIDevice+Extension.swift"; sourceTree = "<group>"; };
+		A8F774AA2D38EA8C00AA6E93 /* UIFont+Ex.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "UIFont+Ex.swift"; sourceTree = "<group>"; };
+		A8F774AB2D38EA8C00AA6E93 /* UIImage+Ex.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "UIImage+Ex.swift"; sourceTree = "<group>"; };
+		A8F774AC2D38EA8C00AA6E93 /* UIImageView+Ex.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "UIImageView+Ex.swift"; sourceTree = "<group>"; };
+		A8F774AD2D38EA8C00AA6E93 /* UILabel+Ex.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "UILabel+Ex.swift"; sourceTree = "<group>"; };
+		A8F774AE2D38EA8C00AA6E93 /* UIScreen.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = UIScreen.swift; sourceTree = "<group>"; };
+		A8F774AF2D38EA8C00AA6E93 /* UITableView+Ex.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "UITableView+Ex.swift"; sourceTree = "<group>"; };
+		A8F774B02D38EA8C00AA6E93 /* UIViewController+Ex.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "UIViewController+Ex.swift"; sourceTree = "<group>"; };
+		A8F774B12D38EA8C00AA6E93 /* UserDefault+Ex.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "UserDefault+Ex.swift"; sourceTree = "<group>"; };
+		A8F774B22D38EA8C00AA6E93 /* View+Ex.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "View+Ex.swift"; sourceTree = "<group>"; };
+		A8F774B42D38EA8C00AA6E93 /* GlobalImports.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = GlobalImports.swift; sourceTree = "<group>"; };
+		A8F774B62D38EA8C00AA6E93 /* TSNetwork.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TSNetwork.swift; sourceTree = "<group>"; };
+		A8F774C72D38EA8C00AA6E93 /* TSCommonTool.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TSCommonTool.swift; sourceTree = "<group>"; };
+		A8F774CA2D38EA8C00AA6E93 /* TSFileManagerTool.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TSFileManagerTool.swift; sourceTree = "<group>"; };
+		A8F774CB2D38EA8C00AA6E93 /* TSNetworkTool.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TSNetworkTool.swift; sourceTree = "<group>"; };
+		A8F774CC2D38EA8C00AA6E93 /* TSToastTool.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TSToastTool.swift; sourceTree = "<group>"; };
+		A8F774CD2D38EA8C00AA6E93 /* WindowHelper.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = WindowHelper.swift; sourceTree = "<group>"; };
+		A8F774CF2D38EA8C00AA6E93 /* CollectionViewComponent.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CollectionViewComponent.swift; sourceTree = "<group>"; };
+		A8F774D02D38EA8C00AA6E93 /* CommonSectionComponent.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CommonSectionComponent.swift; sourceTree = "<group>"; };
+		A8F774D12D38EA8C00AA6E93 /* Component.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Component.swift; sourceTree = "<group>"; };
+		A8F774D22D38EA8C00AA6E93 /* UICollectionView+More.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "UICollectionView+More.swift"; sourceTree = "<group>"; };
+		A8F774D42D38EA8C00AA6E93 /* TSSimpleTableView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TSSimpleTableView.swift; sourceTree = "<group>"; };
+		A8F775162D38EB7400AA6E93 /* TSTabBarController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TSTabBarController.swift; sourceTree = "<group>"; };
+		A8F775182D38EC6700AA6E93 /* TSEmojisVC.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TSEmojisVC.swift; sourceTree = "<group>"; };
+		A8F7751A2D38EC9700AA6E93 /* TSGenmojiVC.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TSGenmojiVC.swift; sourceTree = "<group>"; };
+		A8F7751C2D38ECA600AA6E93 /* TSWallpaperVC.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TSWallpaperVC.swift; sourceTree = "<group>"; };
+		A8F775232D38ED8300AA6E93 /* TSConfig.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TSConfig.swift; sourceTree = "<group>"; };
+		A8F775262D38F08C00AA6E93 /* IBaseResponse.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = IBaseResponse.swift; sourceTree = "<group>"; };
+		A8F775272D38F08C00AA6E93 /* INetConfiguration.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = INetConfiguration.swift; sourceTree = "<group>"; };
+		A8F7752A2D38F19D00AA6E93 /* NetConfiguration.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NetConfiguration.swift; sourceTree = "<group>"; };
+		A8F7752B2D38F19D00AA6E93 /* NetResponse.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NetResponse.swift; sourceTree = "<group>"; };
+		A8F7752C2D38F19D00AA6E93 /* NetWork+HandyJson.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "NetWork+HandyJson.swift"; sourceTree = "<group>"; };
+		A8F775312D38FA5200AA6E93 /* UITextView+Ex.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "UITextView+Ex.swift"; sourceTree = "<group>"; };
+		A8F775342D38FC9A00AA6E93 /* TSViewTool.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TSViewTool.swift; sourceTree = "<group>"; };
+		A8F775372D390C3C00AA6E93 /* TSNetworkManager.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TSNetworkManager.swift; sourceTree = "<group>"; };
+		A8F7753A2D3918D700AA6E93 /* TSNetworkManager+Loading.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "TSNetworkManager+Loading.swift"; sourceTree = "<group>"; };
+		A8F7753C2D3918E200AA6E93 /* TSNetWork+Business.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "TSNetWork+Business.swift"; sourceTree = "<group>"; };
+		A8F7753E2D39340D00AA6E93 /* TSSetingVC.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TSSetingVC.swift; sourceTree = "<group>"; };
+		A8F775422D39346100AA6E93 /* TSSetingModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TSSetingModel.swift; sourceTree = "<group>"; };
+		A8F775442D39346700AA6E93 /* TSSetingViewModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TSSetingViewModel.swift; sourceTree = "<group>"; };
+		A8F775472D3935D600AA6E93 /* TSBusinessWebVC.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TSBusinessWebVC.swift; sourceTree = "<group>"; };
+		A8F7754A2D39376700AA6E93 /* TSSettingListView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TSSettingListView.swift; sourceTree = "<group>"; };
+		A8F7754D2D39E58B00AA6E93 /* TSGenmojiModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TSGenmojiModel.swift; sourceTree = "<group>"; };
+		A8F7754F2D39ECED00AA6E93 /* PhotoManager.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PhotoManager.swift; sourceTree = "<group>"; };
+		A8F776202D3A3F0100AA6E93 /* TSEmojisChildVC.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TSEmojisChildVC.swift; sourceTree = "<group>"; };
+		A8F776262D3A6EBA00AA6E93 /* TSGenmojiTextView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TSGenmojiTextView.swift; sourceTree = "<group>"; };
+		A8F7762A2D3A70AF00AA6E93 /* PaddedLabel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PaddedLabel.swift; sourceTree = "<group>"; };
+		A8F7762C2D3A748800AA6E93 /* TSGenmojiGennerateCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TSGenmojiGennerateCell.swift; sourceTree = "<group>"; };
+		A8F7762E2D3A764E00AA6E93 /* TSGenmojiViewModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TSGenmojiViewModel.swift; sourceTree = "<group>"; };
+		A8F776312D3A771100AA6E93 /* TSGenmojiCollectionViewModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TSGenmojiCollectionViewModel.swift; sourceTree = "<group>"; };
+		A8F776342D3A7C1C00AA6E93 /* TSGenmojiColSectionView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TSGenmojiColSectionView.swift; sourceTree = "<group>"; };
+		A8F776362D3A805700AA6E93 /* TSGenmojiItemCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TSGenmojiItemCell.swift; sourceTree = "<group>"; };
+		A8F776382D3B38D600AA6E93 /* TSGenmojiGennerateVC.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TSGenmojiGennerateVC.swift; sourceTree = "<group>"; };
+		A8F7763B2D3B429A00AA6E93 /* TSCommonloadingView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TSCommonloadingView.swift; sourceTree = "<group>"; };
+		A8F7763E2D3B68E000AA6E93 /* TSGenmojiGennerateViewModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TSGenmojiGennerateViewModel.swift; sourceTree = "<group>"; };
+		A8F776412D3B75EF00AA6E93 /* TSBottomAlertVC.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TSBottomAlertVC.swift; sourceTree = "<group>"; };
+		A8F776442D3DE8A600AA6E93 /* TSSmallIconBrowseVC.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TSSmallIconBrowseVC.swift; sourceTree = "<group>"; };
+		A8F776472D3DE9C200AA6E93 /* TSSmallIconBrowseCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TSSmallIconBrowseCell.swift; sourceTree = "<group>"; };
+		A8F7764A2D3E007100AA6E93 /* TSEmojisChildColViewModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TSEmojisChildColViewModel.swift; sourceTree = "<group>"; };
+		A8F7764D2D3E00A000AA6E93 /* TSEmojisColViewModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TSEmojisColViewModel.swift; sourceTree = "<group>"; };
+		CA9B99CBEC45A6004629E790 /* Pods-AIEmoji.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-AIEmoji.debug.xcconfig"; path = "Target Support Files/Pods-AIEmoji/Pods-AIEmoji.debug.xcconfig"; sourceTree = "<group>"; };
 /* End PBXFileReference section */
 
-/* Begin PBXFileSystemSynchronizedBuildFileExceptionSet section */
-		A8F7747B2D38E8B200AA6E93 /* Exceptions for "AIEmoji" folder in "AIEmoji" target */ = {
-			isa = PBXFileSystemSynchronizedBuildFileExceptionSet;
-			membershipExceptions = (
-				Info.plist,
-			);
-			target = A8F774682D38E8B000AA6E93 /* AIEmoji */;
-		};
-/* End PBXFileSystemSynchronizedBuildFileExceptionSet section */
-
-/* Begin PBXFileSystemSynchronizedRootGroup section */
-		A8F7746B2D38E8B000AA6E93 /* AIEmoji */ = {
-			isa = PBXFileSystemSynchronizedRootGroup;
-			exceptions = (
-				A8F7747B2D38E8B200AA6E93 /* Exceptions for "AIEmoji" folder in "AIEmoji" target */,
-			);
-			path = AIEmoji;
-			sourceTree = "<group>";
-		};
-/* End PBXFileSystemSynchronizedRootGroup section */
-
 /* Begin PBXFrameworksBuildPhase section */
 		A8F774662D38E8B000AA6E93 /* Frameworks */ = {
 			isa = PBXFrameworksBuildPhase;
 			buildActionMask = 2147483647;
 			files = (
+				D34BB2B8FE0DBF83E06A3FC4 /* Pods_AIEmoji.framework in Frameworks */,
+				A8F775532D3A038800AA6E93 /* SwiftUIX in Frameworks */,
 			);
 			runOnlyForDeploymentPostprocessing = 0;
 		};
 /* End PBXFrameworksBuildPhase section */
 
 /* Begin PBXGroup section */
+		406F872E527C21AB2B2F0859 /* Pods */ = {
+			isa = PBXGroup;
+			children = (
+				CA9B99CBEC45A6004629E790 /* Pods-AIEmoji.debug.xcconfig */,
+				6E77A292B548CD79E381757E /* Pods-AIEmoji.release.xcconfig */,
+			);
+			path = Pods;
+			sourceTree = "<group>";
+		};
+		97C7E956DF0731529C52523E /* Frameworks */ = {
+			isa = PBXGroup;
+			children = (
+				86FB4D6AEFDDA7A2017F307C /* Pods_AIEmoji.framework */,
+			);
+			name = Frameworks;
+			sourceTree = "<group>";
+		};
 		A8F774602D38E8B000AA6E93 = {
 			isa = PBXGroup;
 			children = (
-				A8F7746B2D38E8B000AA6E93 /* AIEmoji */,
+				A8F7748A2D38E8B700AA6E93 /* AIEmoji */,
 				A8F7746A2D38E8B000AA6E93 /* Products */,
+				406F872E527C21AB2B2F0859 /* Pods */,
+				97C7E956DF0731529C52523E /* Frameworks */,
 			);
 			sourceTree = "<group>";
 		};
@@ -58,6 +233,417 @@
 			name = Products;
 			sourceTree = "<group>";
 		};
+		A8F7748A2D38E8B700AA6E93 /* AIEmoji */ = {
+			isa = PBXGroup;
+			children = (
+				A8F7751E2D38ED4500AA6E93 /* DataManger */,
+				A8F774922D38EA8C00AA6E93 /* Business */,
+				A8F774D82D38EA8C00AA6E93 /* Common */,
+				A8F774812D38E8B700AA6E93 /* AppDelegate.swift */,
+				A8F774822D38E8B700AA6E93 /* Assets.xcassets */,
+				A8F774832D38E8B700AA6E93 /* Info.plist */,
+				A8F774852D38E8B700AA6E93 /* LaunchScreen.storyboard */,
+			);
+			path = AIEmoji;
+			sourceTree = "<group>";
+		};
+		A8F774922D38EA8C00AA6E93 /* Business */ = {
+			isa = PBXGroup;
+			children = (
+				A8F776402D3B75EA00AA6E93 /* General */,
+				A8F775332D38FC8E00AA6E93 /* VIewTool */,
+				A8F775152D38EB5D00AA6E93 /* TSSetingVC */,
+				A8F775142D38EB5300AA6E93 /* TSWallpaperVC */,
+				A8F775132D38EB3F00AA6E93 /* TSGenmojiVC */,
+				A8F775112D38EB2800AA6E93 /* TSEmojisVC */,
+				A8F775102D38EAE800AA6E93 /* TSTabBarController */,
+			);
+			path = Business;
+			sourceTree = "<group>";
+		};
+		A8F7749B2D38EA8C00AA6E93 /* BaseClass */ = {
+			isa = PBXGroup;
+			children = (
+				A8F774932D38EA8C00AA6E93 /* TSBaseCollectionCell.swift */,
+				A8F774942D38EA8C00AA6E93 /* TSBaseModel.swift */,
+				A8F774952D38EA8C00AA6E93 /* TSBaseNavigationBarView.swift */,
+				A8F774962D38EA8C00AA6E93 /* TSBaseNavigationC.swift */,
+				A8F774972D38EA8C00AA6E93 /* TSBaseTabViewCell.swift */,
+				A8F774982D38EA8C00AA6E93 /* TSBaseVC.swift */,
+				A8F774992D38EA8C00AA6E93 /* TSBaseView.swift */,
+				A8F7749A2D38EA8C00AA6E93 /* TSBasicItemModel.swift */,
+			);
+			path = BaseClass;
+			sourceTree = "<group>";
+		};
+		A8F7749E2D38EA8C00AA6E93 /* SwiftUI */ = {
+			isa = PBXGroup;
+			children = (
+				A8F7749C2D38EA8C00AA6E93 /* Color+Ex.swift */,
+				A8F7749D2D38EA8C00AA6E93 /* Font+Ex.swift */,
+			);
+			path = SwiftUI;
+			sourceTree = "<group>";
+		};
+		A8F774B32D38EA8C00AA6E93 /* Ex */ = {
+			isa = PBXGroup;
+			children = (
+				A8F7749E2D38EA8C00AA6E93 /* SwiftUI */,
+				A8F7749F2D38EA8C00AA6E93 /* Array+Ex.swift */,
+				A8F774A02D38EA8C00AA6E93 /* AVAsset+Ex.swift */,
+				A8F774A12D38EA8C00AA6E93 /* CGFloat+Ex.swift */,
+				A8F774A22D38EA8C00AA6E93 /* Date+Ex.swift */,
+				A8F774A32D38EA8C00AA6E93 /* Dictionary+Ex.swift */,
+				A8F774A42D38EA8C00AA6E93 /* Int+Ex.swift */,
+				A8F774A52D38EA8C00AA6E93 /* NSString+Ex.swift */,
+				A8F774A62D38EA8C00AA6E93 /* UIButton+Ex.swift */,
+				A8F774A72D38EA8C00AA6E93 /* UICollectionView+Ex.swift */,
+				A8F774A82D38EA8C00AA6E93 /* UIColor+Ex.swift */,
+				A8F774A92D38EA8C00AA6E93 /* UIDevice+Extension.swift */,
+				A8F774AA2D38EA8C00AA6E93 /* UIFont+Ex.swift */,
+				A8F774AB2D38EA8C00AA6E93 /* UIImage+Ex.swift */,
+				A8F774AC2D38EA8C00AA6E93 /* UIImageView+Ex.swift */,
+				A8F774AD2D38EA8C00AA6E93 /* UILabel+Ex.swift */,
+				A8F774AE2D38EA8C00AA6E93 /* UIScreen.swift */,
+				A8F774AF2D38EA8C00AA6E93 /* UITableView+Ex.swift */,
+				A8F774B02D38EA8C00AA6E93 /* UIViewController+Ex.swift */,
+				A8F774B12D38EA8C00AA6E93 /* UserDefault+Ex.swift */,
+				A8F774B22D38EA8C00AA6E93 /* View+Ex.swift */,
+				A8F775312D38FA5200AA6E93 /* UITextView+Ex.swift */,
+			);
+			path = Ex;
+			sourceTree = "<group>";
+		};
+		A8F774B52D38EA8C00AA6E93 /* GlobalImports */ = {
+			isa = PBXGroup;
+			children = (
+				A8F774B42D38EA8C00AA6E93 /* GlobalImports.swift */,
+			);
+			path = GlobalImports;
+			sourceTree = "<group>";
+		};
+		A8F774B72D38EA8C00AA6E93 /* NetworkManager */ = {
+			isa = PBXGroup;
+			children = (
+				A8F7752D2D38F19D00AA6E93 /* middleware */,
+				A8F775262D38F08C00AA6E93 /* IBaseResponse.swift */,
+				A8F775272D38F08C00AA6E93 /* INetConfiguration.swift */,
+				A8F774B62D38EA8C00AA6E93 /* TSNetwork.swift */,
+				A8F775392D3918A100AA6E93 /* TSNetWork */,
+			);
+			path = NetworkManager;
+			sourceTree = "<group>";
+		};
+		A8F774C62D38EA8C00AA6E93 /* ThirdParty */ = {
+			isa = PBXGroup;
+			children = (
+			);
+			path = ThirdParty;
+			sourceTree = "<group>";
+		};
+		A8F774C82D38EA8C00AA6E93 /* TSCommonTool */ = {
+			isa = PBXGroup;
+			children = (
+				A8F774C72D38EA8C00AA6E93 /* TSCommonTool.swift */,
+			);
+			path = TSCommonTool;
+			sourceTree = "<group>";
+		};
+		A8F774CE2D38EA8C00AA6E93 /* Tool */ = {
+			isa = PBXGroup;
+			children = (
+				A8F774C82D38EA8C00AA6E93 /* TSCommonTool */,
+				A8F774CA2D38EA8C00AA6E93 /* TSFileManagerTool.swift */,
+				A8F7754F2D39ECED00AA6E93 /* PhotoManager.swift */,
+				A8F774CB2D38EA8C00AA6E93 /* TSNetworkTool.swift */,
+				A8F774CC2D38EA8C00AA6E93 /* TSToastTool.swift */,
+				A8F774CD2D38EA8C00AA6E93 /* WindowHelper.swift */,
+			);
+			path = Tool;
+			sourceTree = "<group>";
+		};
+		A8F774D32D38EA8C00AA6E93 /* UICollectionView+Component */ = {
+			isa = PBXGroup;
+			children = (
+				A8F774CF2D38EA8C00AA6E93 /* CollectionViewComponent.swift */,
+				A8F774D02D38EA8C00AA6E93 /* CommonSectionComponent.swift */,
+				A8F774D12D38EA8C00AA6E93 /* Component.swift */,
+				A8F774D22D38EA8C00AA6E93 /* UICollectionView+More.swift */,
+			);
+			path = "UICollectionView+Component";
+			sourceTree = "<group>";
+		};
+		A8F774D62D38EA8C00AA6E93 /* UITableView+TSItemModel */ = {
+			isa = PBXGroup;
+			children = (
+				A8F774D42D38EA8C00AA6E93 /* TSSimpleTableView.swift */,
+			);
+			path = "UITableView+TSItemModel";
+			sourceTree = "<group>";
+		};
+		A8F774D72D38EA8C00AA6E93 /* View */ = {
+			isa = PBXGroup;
+			children = (
+				A8F776292D3A70AA00AA6E93 /* UILabel */,
+				A8F774D32D38EA8C00AA6E93 /* UICollectionView+Component */,
+				A8F774D62D38EA8C00AA6E93 /* UITableView+TSItemModel */,
+			);
+			path = View;
+			sourceTree = "<group>";
+		};
+		A8F774D82D38EA8C00AA6E93 /* Common */ = {
+			isa = PBXGroup;
+			children = (
+				A8F7749B2D38EA8C00AA6E93 /* BaseClass */,
+				A8F774B32D38EA8C00AA6E93 /* Ex */,
+				A8F774B52D38EA8C00AA6E93 /* GlobalImports */,
+				A8F774B72D38EA8C00AA6E93 /* NetworkManager */,
+				A8F774C62D38EA8C00AA6E93 /* ThirdParty */,
+				A8F774CE2D38EA8C00AA6E93 /* Tool */,
+				A8F774D72D38EA8C00AA6E93 /* View */,
+			);
+			path = Common;
+			sourceTree = "<group>";
+		};
+		A8F775102D38EAE800AA6E93 /* TSTabBarController */ = {
+			isa = PBXGroup;
+			children = (
+				A8F775162D38EB7400AA6E93 /* TSTabBarController.swift */,
+			);
+			path = TSTabBarController;
+			sourceTree = "<group>";
+		};
+		A8F775112D38EB2800AA6E93 /* TSEmojisVC */ = {
+			isa = PBXGroup;
+			children = (
+				A8F7761F2D3A3DBC00AA6E93 /* TSEmojisVC */,
+				A8F7761E2D3A3DB400AA6E93 /* TSEmojisChildVC */,
+			);
+			path = TSEmojisVC;
+			sourceTree = "<group>";
+		};
+		A8F775132D38EB3F00AA6E93 /* TSGenmojiVC */ = {
+			isa = PBXGroup;
+			children = (
+				A8F7763A2D3B38E900AA6E93 /* TSGenmojiGennerateVC */,
+				A8F776242D3A6EA100AA6E93 /* TSGenmojiVC */,
+			);
+			path = TSGenmojiVC;
+			sourceTree = "<group>";
+		};
+		A8F775142D38EB5300AA6E93 /* TSWallpaperVC */ = {
+			isa = PBXGroup;
+			children = (
+				A8F7751C2D38ECA600AA6E93 /* TSWallpaperVC.swift */,
+			);
+			path = TSWallpaperVC;
+			sourceTree = "<group>";
+		};
+		A8F775152D38EB5D00AA6E93 /* TSSetingVC */ = {
+			isa = PBXGroup;
+			children = (
+				A8F775482D3935D600AA6E93 /* TSBusinessWebVC */,
+				A8F775412D39344A00AA6E93 /* SetingVC */,
+			);
+			path = TSSetingVC;
+			sourceTree = "<group>";
+		};
+		A8F7751E2D38ED4500AA6E93 /* DataManger */ = {
+			isa = PBXGroup;
+			children = (
+				A8F775242D38ED8300AA6E93 /* Config */,
+			);
+			path = DataManger;
+			sourceTree = "<group>";
+		};
+		A8F775242D38ED8300AA6E93 /* Config */ = {
+			isa = PBXGroup;
+			children = (
+				A8F775232D38ED8300AA6E93 /* TSConfig.swift */,
+			);
+			path = Config;
+			sourceTree = "<group>";
+		};
+		A8F7752D2D38F19D00AA6E93 /* middleware */ = {
+			isa = PBXGroup;
+			children = (
+				A8F7752A2D38F19D00AA6E93 /* NetConfiguration.swift */,
+				A8F7752B2D38F19D00AA6E93 /* NetResponse.swift */,
+				A8F7752C2D38F19D00AA6E93 /* NetWork+HandyJson.swift */,
+			);
+			path = middleware;
+			sourceTree = "<group>";
+		};
+		A8F775332D38FC8E00AA6E93 /* VIewTool */ = {
+			isa = PBXGroup;
+			children = (
+				A8F7763B2D3B429A00AA6E93 /* TSCommonloadingView.swift */,
+				A8F776282D3A709200AA6E93 /* UILabel */,
+				A8F775342D38FC9A00AA6E93 /* TSViewTool.swift */,
+			);
+			path = VIewTool;
+			sourceTree = "<group>";
+		};
+		A8F775392D3918A100AA6E93 /* TSNetWork */ = {
+			isa = PBXGroup;
+			children = (
+				A8F775372D390C3C00AA6E93 /* TSNetworkManager.swift */,
+				A8F7753C2D3918E200AA6E93 /* TSNetWork+Business.swift */,
+				A8F7753A2D3918D700AA6E93 /* TSNetworkManager+Loading.swift */,
+			);
+			path = TSNetWork;
+			sourceTree = "<group>";
+		};
+		A8F775412D39344A00AA6E93 /* SetingVC */ = {
+			isa = PBXGroup;
+			children = (
+				A8F775462D39348500AA6E93 /* View */,
+				A8F775442D39346700AA6E93 /* TSSetingViewModel.swift */,
+				A8F775422D39346100AA6E93 /* TSSetingModel.swift */,
+				A8F7753E2D39340D00AA6E93 /* TSSetingVC.swift */,
+			);
+			path = SetingVC;
+			sourceTree = "<group>";
+		};
+		A8F775462D39348500AA6E93 /* View */ = {
+			isa = PBXGroup;
+			children = (
+				A8F7754A2D39376700AA6E93 /* TSSettingListView.swift */,
+			);
+			path = View;
+			sourceTree = "<group>";
+		};
+		A8F775482D3935D600AA6E93 /* TSBusinessWebVC */ = {
+			isa = PBXGroup;
+			children = (
+				A8F775472D3935D600AA6E93 /* TSBusinessWebVC.swift */,
+			);
+			path = TSBusinessWebVC;
+			sourceTree = "<group>";
+		};
+		A8F7754C2D39E57B00AA6E93 /* Model */ = {
+			isa = PBXGroup;
+			children = (
+				A8F7754D2D39E58B00AA6E93 /* TSGenmojiModel.swift */,
+			);
+			path = Model;
+			sourceTree = "<group>";
+		};
+		A8F7761E2D3A3DB400AA6E93 /* TSEmojisChildVC */ = {
+			isa = PBXGroup;
+			children = (
+				A8F776492D3E006200AA6E93 /* ViewModel */,
+				A8F776202D3A3F0100AA6E93 /* TSEmojisChildVC.swift */,
+			);
+			path = TSEmojisChildVC;
+			sourceTree = "<group>";
+		};
+		A8F7761F2D3A3DBC00AA6E93 /* TSEmojisVC */ = {
+			isa = PBXGroup;
+			children = (
+				A8F7764C2D3E009A00AA6E93 /* ViewModel */,
+				A8F775182D38EC6700AA6E93 /* TSEmojisVC.swift */,
+			);
+			path = TSEmojisVC;
+			sourceTree = "<group>";
+		};
+		A8F776242D3A6EA100AA6E93 /* TSGenmojiVC */ = {
+			isa = PBXGroup;
+			children = (
+				A8F776302D3A770600AA6E93 /* ViewModel */,
+				A8F776252D3A6EAF00AA6E93 /* View */,
+				A8F7751A2D38EC9700AA6E93 /* TSGenmojiVC.swift */,
+				A8F7754C2D39E57B00AA6E93 /* Model */,
+			);
+			path = TSGenmojiVC;
+			sourceTree = "<group>";
+		};
+		A8F776252D3A6EAF00AA6E93 /* View */ = {
+			isa = PBXGroup;
+			children = (
+				A8F776342D3A7C1C00AA6E93 /* TSGenmojiColSectionView.swift */,
+				A8F7762C2D3A748800AA6E93 /* TSGenmojiGennerateCell.swift */,
+				A8F776362D3A805700AA6E93 /* TSGenmojiItemCell.swift */,
+				A8F776262D3A6EBA00AA6E93 /* TSGenmojiTextView.swift */,
+			);
+			path = View;
+			sourceTree = "<group>";
+		};
+		A8F776282D3A709200AA6E93 /* UILabel */ = {
+			isa = PBXGroup;
+			children = (
+			);
+			path = UILabel;
+			sourceTree = "<group>";
+		};
+		A8F776292D3A70AA00AA6E93 /* UILabel */ = {
+			isa = PBXGroup;
+			children = (
+				A8F7762A2D3A70AF00AA6E93 /* PaddedLabel.swift */,
+			);
+			path = UILabel;
+			sourceTree = "<group>";
+		};
+		A8F776302D3A770600AA6E93 /* ViewModel */ = {
+			isa = PBXGroup;
+			children = (
+				A8F776312D3A771100AA6E93 /* TSGenmojiCollectionViewModel.swift */,
+				A8F7762E2D3A764E00AA6E93 /* TSGenmojiViewModel.swift */,
+			);
+			path = ViewModel;
+			sourceTree = "<group>";
+		};
+		A8F7763A2D3B38E900AA6E93 /* TSGenmojiGennerateVC */ = {
+			isa = PBXGroup;
+			children = (
+				A8F7763E2D3B68E000AA6E93 /* TSGenmojiGennerateViewModel.swift */,
+				A8F776382D3B38D600AA6E93 /* TSGenmojiGennerateVC.swift */,
+			);
+			path = TSGenmojiGennerateVC;
+			sourceTree = "<group>";
+		};
+		A8F776402D3B75EA00AA6E93 /* General */ = {
+			isa = PBXGroup;
+			children = (
+				A8F776412D3B75EF00AA6E93 /* TSBottomAlertVC.swift */,
+				A8F776432D3DE89900AA6E93 /* TSSmallIconBrowseVC */,
+			);
+			path = General;
+			sourceTree = "<group>";
+		};
+		A8F776432D3DE89900AA6E93 /* TSSmallIconBrowseVC */ = {
+			isa = PBXGroup;
+			children = (
+				A8F776462D3DE9BD00AA6E93 /* View */,
+				A8F776442D3DE8A600AA6E93 /* TSSmallIconBrowseVC.swift */,
+			);
+			path = TSSmallIconBrowseVC;
+			sourceTree = "<group>";
+		};
+		A8F776462D3DE9BD00AA6E93 /* View */ = {
+			isa = PBXGroup;
+			children = (
+				A8F776472D3DE9C200AA6E93 /* TSSmallIconBrowseCell.swift */,
+			);
+			path = View;
+			sourceTree = "<group>";
+		};
+		A8F776492D3E006200AA6E93 /* ViewModel */ = {
+			isa = PBXGroup;
+			children = (
+				A8F7764A2D3E007100AA6E93 /* TSEmojisChildColViewModel.swift */,
+			);
+			path = ViewModel;
+			sourceTree = "<group>";
+		};
+		A8F7764C2D3E009A00AA6E93 /* ViewModel */ = {
+			isa = PBXGroup;
+			children = (
+				A8F7764D2D3E00A000AA6E93 /* TSEmojisColViewModel.swift */,
+			);
+			path = ViewModel;
+			sourceTree = "<group>";
+		};
 /* End PBXGroup section */
 
 /* Begin PBXNativeTarget section */
@@ -65,20 +651,17 @@
 			isa = PBXNativeTarget;
 			buildConfigurationList = A8F7747C2D38E8B200AA6E93 /* Build configuration list for PBXNativeTarget "AIEmoji" */;
 			buildPhases = (
+				8D2F920BECF35527D1C24A4F /* [CP] Check Pods Manifest.lock */,
 				A8F774652D38E8B000AA6E93 /* Sources */,
 				A8F774662D38E8B000AA6E93 /* Frameworks */,
 				A8F774672D38E8B000AA6E93 /* Resources */,
+				A6FFE8F95E002D0E705F3EE6 /* [CP] Embed Pods Frameworks */,
 			);
 			buildRules = (
 			);
 			dependencies = (
 			);
-			fileSystemSynchronizedGroups = (
-				A8F7746B2D38E8B000AA6E93 /* AIEmoji */,
-			);
 			name = AIEmoji;
-			packageProductDependencies = (
-			);
 			productName = AIEmoji;
 			productReference = A8F774692D38E8B000AA6E93 /* AIEmoji.app */;
 			productType = "com.apple.product-type.application";
@@ -107,6 +690,9 @@
 			);
 			mainGroup = A8F774602D38E8B000AA6E93;
 			minimizedProjectReferenceProxies = 1;
+			packageReferences = (
+				A8F775512D3A038800AA6E93 /* XCLocalSwiftPackageReference "../SwiftUIX-master" */,
+			);
 			preferredProjectObjectVersion = 77;
 			productRefGroup = A8F7746A2D38E8B000AA6E93 /* Products */;
 			projectDirPath = "";
@@ -122,37 +708,176 @@
 			isa = PBXResourcesBuildPhase;
 			buildActionMask = 2147483647;
 			files = (
+				A8F7748E2D38E8B700AA6E93 /* Assets.xcassets in Resources */,
+				A8F774902D38E8B700AA6E93 /* LaunchScreen.storyboard in Resources */,
 			);
 			runOnlyForDeploymentPostprocessing = 0;
 		};
 /* End PBXResourcesBuildPhase section */
 
+/* Begin PBXShellScriptBuildPhase section */
+		8D2F920BECF35527D1C24A4F /* [CP] Check Pods Manifest.lock */ = {
+			isa = PBXShellScriptBuildPhase;
+			buildActionMask = 2147483647;
+			files = (
+			);
+			inputFileListPaths = (
+			);
+			inputPaths = (
+				"${PODS_PODFILE_DIR_PATH}/Podfile.lock",
+				"${PODS_ROOT}/Manifest.lock",
+			);
+			name = "[CP] Check Pods Manifest.lock";
+			outputFileListPaths = (
+			);
+			outputPaths = (
+				"$(DERIVED_FILE_DIR)/Pods-AIEmoji-checkManifestLockResult.txt",
+			);
+			runOnlyForDeploymentPostprocessing = 0;
+			shellPath = /bin/sh;
+			shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n    # print error to STDERR\n    echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n    exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n";
+			showEnvVarsInLog = 0;
+		};
+		A6FFE8F95E002D0E705F3EE6 /* [CP] Embed Pods Frameworks */ = {
+			isa = PBXShellScriptBuildPhase;
+			buildActionMask = 2147483647;
+			files = (
+			);
+			inputFileListPaths = (
+				"${PODS_ROOT}/Target Support Files/Pods-AIEmoji/Pods-AIEmoji-frameworks-${CONFIGURATION}-input-files.xcfilelist",
+			);
+			name = "[CP] Embed Pods Frameworks";
+			outputFileListPaths = (
+				"${PODS_ROOT}/Target Support Files/Pods-AIEmoji/Pods-AIEmoji-frameworks-${CONFIGURATION}-output-files.xcfilelist",
+			);
+			runOnlyForDeploymentPostprocessing = 0;
+			shellPath = /bin/sh;
+			shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-AIEmoji/Pods-AIEmoji-frameworks.sh\"\n";
+			showEnvVarsInLog = 0;
+		};
+/* End PBXShellScriptBuildPhase section */
+
 /* Begin PBXSourcesBuildPhase section */
 		A8F774652D38E8B000AA6E93 /* Sources */ = {
 			isa = PBXSourcesBuildPhase;
 			buildActionMask = 2147483647;
 			files = (
+				A8F775252D38ED8300AA6E93 /* TSConfig.swift in Sources */,
+				A8F774D92D38EA8C00AA6E93 /* UICollectionView+More.swift in Sources */,
+				A8F774DA2D38EA8C00AA6E93 /* UIFont+Ex.swift in Sources */,
+				A8F774DB2D38EA8C00AA6E93 /* AVAsset+Ex.swift in Sources */,
+				A8F7764E2D3E00A800AA6E93 /* TSEmojisColViewModel.swift in Sources */,
+				A8F776422D3B75FC00AA6E93 /* TSBottomAlertVC.swift in Sources */,
+				A8F774DC2D38EA8C00AA6E93 /* NSString+Ex.swift in Sources */,
+				A8F775192D38EC6800AA6E93 /* TSEmojisVC.swift in Sources */,
+				A8F7753B2D3918DE00AA6E93 /* TSNetworkManager+Loading.swift in Sources */,
+				A8F774DE2D38EA8C00AA6E93 /* UIDevice+Extension.swift in Sources */,
+				A8F775492D3935D600AA6E93 /* TSBusinessWebVC.swift in Sources */,
+				A8F776392D3B38E600AA6E93 /* TSGenmojiGennerateVC.swift in Sources */,
+				A8F774E02D38EA8C00AA6E93 /* TSCommonTool.swift in Sources */,
+				A8F774E12D38EA8C00AA6E93 /* TSFileManagerTool.swift in Sources */,
+				A8F774E22D38EA8C00AA6E93 /* UICollectionView+Ex.swift in Sources */,
+				A8F774E32D38EA8C00AA6E93 /* TSBasicItemModel.swift in Sources */,
+				A8F7762F2D3A765400AA6E93 /* TSGenmojiViewModel.swift in Sources */,
+				A8F7751B2D38EC9800AA6E93 /* TSGenmojiVC.swift in Sources */,
+				A8F774E42D38EA8C00AA6E93 /* Component.swift in Sources */,
+				A8F774E52D38EA8C00AA6E93 /* Color+Ex.swift in Sources */,
+				A8F7754E2D39E59100AA6E93 /* TSGenmojiModel.swift in Sources */,
+				A8F776452D3DE8A800AA6E93 /* TSSmallIconBrowseVC.swift in Sources */,
+				A8F774E62D38EA8C00AA6E93 /* UIScreen.swift in Sources */,
+				A8F775432D39346400AA6E93 /* TSSetingModel.swift in Sources */,
+				A8F774E82D38EA8C00AA6E93 /* CollectionViewComponent.swift in Sources */,
+				A8F774E92D38EA8C00AA6E93 /* UILabel+Ex.swift in Sources */,
+				A8F774EB2D38EA8C00AA6E93 /* TSBaseNavigationC.swift in Sources */,
+				A8F774EC2D38EA8C00AA6E93 /* TSToastTool.swift in Sources */,
+				A8F775502D39ECED00AA6E93 /* PhotoManager.swift in Sources */,
+				A8F7763F2D3B68E100AA6E93 /* TSGenmojiGennerateViewModel.swift in Sources */,
+				A8F775352D38FC9A00AA6E93 /* TSViewTool.swift in Sources */,
+				A8F774ED2D38EA8C00AA6E93 /* Font+Ex.swift in Sources */,
+				A8F774EE2D38EA8C00AA6E93 /* UIViewController+Ex.swift in Sources */,
+				A8F774EF2D38EA8C00AA6E93 /* UIImage+Ex.swift in Sources */,
+				A8F774F02D38EA8C00AA6E93 /* TSBaseCollectionCell.swift in Sources */,
+				A8F774F12D38EA8C00AA6E93 /* CGFloat+Ex.swift in Sources */,
+				A8F774F22D38EA8C00AA6E93 /* TSBaseView.swift in Sources */,
+				A8F774F42D38EA8C00AA6E93 /* TSBaseNavigationBarView.swift in Sources */,
+				A8F774F52D38EA8C00AA6E93 /* Array+Ex.swift in Sources */,
+				A8F775172D38EB7400AA6E93 /* TSTabBarController.swift in Sources */,
+				A8F774F62D38EA8C00AA6E93 /* UIImageView+Ex.swift in Sources */,
+				A8F776272D3A6EC200AA6E93 /* TSGenmojiTextView.swift in Sources */,
+				A8F774F82D38EA8C00AA6E93 /* TSSimpleTableView.swift in Sources */,
+				A8F776352D3A7C2B00AA6E93 /* TSGenmojiColSectionView.swift in Sources */,
+				A8F774F92D38EA8C00AA6E93 /* UIColor+Ex.swift in Sources */,
+				A8F774FA2D38EA8C00AA6E93 /* TSBaseModel.swift in Sources */,
+				A8F7752E2D38F19D00AA6E93 /* NetResponse.swift in Sources */,
+				A8F7752F2D38F19D00AA6E93 /* NetWork+HandyJson.swift in Sources */,
+				A8F775452D39347100AA6E93 /* TSSetingViewModel.swift in Sources */,
+				A8F775302D38F19D00AA6E93 /* NetConfiguration.swift in Sources */,
+				A8F774FB2D38EA8C00AA6E93 /* TSNetwork.swift in Sources */,
+				A8F776212D3A3F0200AA6E93 /* TSEmojisChildVC.swift in Sources */,
+				A8F774FE2D38EA8C00AA6E93 /* Int+Ex.swift in Sources */,
+				A8F774FF2D38EA8C00AA6E93 /* UserDefault+Ex.swift in Sources */,
+				A8F775002D38EA8C00AA6E93 /* WindowHelper.swift in Sources */,
+				A8F7764B2D3E008500AA6E93 /* TSEmojisChildColViewModel.swift in Sources */,
+				A8F775012D38EA8C00AA6E93 /* UIButton+Ex.swift in Sources */,
+				A8F775022D38EA8C00AA6E93 /* Dictionary+Ex.swift in Sources */,
+				A8F776482D3DE9F600AA6E93 /* TSSmallIconBrowseCell.swift in Sources */,
+				A8F7753D2D3918F800AA6E93 /* TSNetWork+Business.swift in Sources */,
+				A8F775282D38F08C00AA6E93 /* IBaseResponse.swift in Sources */,
+				A8F775292D38F08C00AA6E93 /* INetConfiguration.swift in Sources */,
+				A8F7751D2D38ECA700AA6E93 /* TSWallpaperVC.swift in Sources */,
+				A8F775032D38EA8C00AA6E93 /* GlobalImports.swift in Sources */,
+				A8F775062D38EA8C00AA6E93 /* Date+Ex.swift in Sources */,
+				A8F775072D38EA8C00AA6E93 /* View+Ex.swift in Sources */,
+				A8F775082D38EA8C00AA6E93 /* UITableView+Ex.swift in Sources */,
+				A8F7763C2D3B429B00AA6E93 /* TSCommonloadingView.swift in Sources */,
+				A8F775092D38EA8C00AA6E93 /* CommonSectionComponent.swift in Sources */,
+				A8F776322D3A771400AA6E93 /* TSGenmojiCollectionViewModel.swift in Sources */,
+				A8F776372D3A806E00AA6E93 /* TSGenmojiItemCell.swift in Sources */,
+				A8F7750A2D38EA8C00AA6E93 /* TSNetworkTool.swift in Sources */,
+				A8F7762D2D3A74A100AA6E93 /* TSGenmojiGennerateCell.swift in Sources */,
+				A8F775322D38FA5E00AA6E93 /* UITextView+Ex.swift in Sources */,
+				A8F7753F2D39340E00AA6E93 /* TSSetingVC.swift in Sources */,
+				A8F7762B2D3A70B200AA6E93 /* PaddedLabel.swift in Sources */,
+				A8F775382D390C3C00AA6E93 /* TSNetworkManager.swift in Sources */,
+				A8F7750B2D38EA8C00AA6E93 /* TSBaseTabViewCell.swift in Sources */,
+				A8F7750D2D38EA8C00AA6E93 /* TSBaseVC.swift in Sources */,
+				A8F7754B2D39376800AA6E93 /* TSSettingListView.swift in Sources */,
+				A8F7748B2D38E8B700AA6E93 /* AppDelegate.swift in Sources */,
 			);
 			runOnlyForDeploymentPostprocessing = 0;
 		};
 /* End PBXSourcesBuildPhase section */
 
+/* Begin PBXVariantGroup section */
+		A8F774852D38E8B700AA6E93 /* LaunchScreen.storyboard */ = {
+			isa = PBXVariantGroup;
+			children = (
+				A8F774842D38E8B700AA6E93 /* Base */,
+			);
+			name = LaunchScreen.storyboard;
+			sourceTree = "<group>";
+		};
+/* End PBXVariantGroup section */
+
 /* Begin XCBuildConfiguration section */
 		A8F7747D2D38E8B200AA6E93 /* Debug */ = {
 			isa = XCBuildConfiguration;
+			baseConfigurationReference = CA9B99CBEC45A6004629E790 /* Pods-AIEmoji.debug.xcconfig */;
 			buildSettings = {
 				ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
 				ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor;
 				CODE_SIGN_STYLE = Automatic;
 				CURRENT_PROJECT_VERSION = 1;
 				DEVELOPMENT_TEAM = 65UD255J84;
+				ENABLE_USER_SCRIPT_SANDBOXING = NO;
 				GENERATE_INFOPLIST_FILE = YES;
 				INFOPLIST_FILE = AIEmoji/Info.plist;
+				INFOPLIST_KEY_NSPhotoLibraryUsageDescription = "Allow us to access Photos in order to save emote to your device.";
 				INFOPLIST_KEY_UIApplicationSupportsIndirectInputEvents = YES;
 				INFOPLIST_KEY_UILaunchStoryboardName = LaunchScreen;
-				INFOPLIST_KEY_UIMainStoryboardFile = Main;
 				INFOPLIST_KEY_UISupportedInterfaceOrientations_iPad = "UIInterfaceOrientationPortrait UIInterfaceOrientationPortraitUpsideDown UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight";
 				INFOPLIST_KEY_UISupportedInterfaceOrientations_iPhone = "UIInterfaceOrientationPortrait UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight";
+				IPHONEOS_DEPLOYMENT_TARGET = 14.0;
 				LD_RUNPATH_SEARCH_PATHS = (
 					"$(inherited)",
 					"@executable_path/Frameworks",
@@ -160,27 +885,34 @@
 				MARKETING_VERSION = 1.0;
 				PRODUCT_BUNDLE_IDENTIFIER = com.tsyh.AIEmoji;
 				PRODUCT_NAME = "$(TARGET_NAME)";
+				SUPPORTED_PLATFORMS = "iphoneos iphonesimulator";
+				SUPPORTS_MACCATALYST = NO;
+				SUPPORTS_MAC_DESIGNED_FOR_IPHONE_IPAD = NO;
+				SUPPORTS_XR_DESIGNED_FOR_IPHONE_IPAD = NO;
 				SWIFT_EMIT_LOC_STRINGS = YES;
 				SWIFT_VERSION = 5.0;
-				TARGETED_DEVICE_FAMILY = "1,2";
+				TARGETED_DEVICE_FAMILY = 1;
 			};
 			name = Debug;
 		};
 		A8F7747E2D38E8B200AA6E93 /* Release */ = {
 			isa = XCBuildConfiguration;
+			baseConfigurationReference = 6E77A292B548CD79E381757E /* Pods-AIEmoji.release.xcconfig */;
 			buildSettings = {
 				ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
 				ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor;
 				CODE_SIGN_STYLE = Automatic;
 				CURRENT_PROJECT_VERSION = 1;
 				DEVELOPMENT_TEAM = 65UD255J84;
+				ENABLE_USER_SCRIPT_SANDBOXING = NO;
 				GENERATE_INFOPLIST_FILE = YES;
 				INFOPLIST_FILE = AIEmoji/Info.plist;
+				INFOPLIST_KEY_NSPhotoLibraryUsageDescription = "Allow us to access Photos in order to save emote to your device.";
 				INFOPLIST_KEY_UIApplicationSupportsIndirectInputEvents = YES;
 				INFOPLIST_KEY_UILaunchStoryboardName = LaunchScreen;
-				INFOPLIST_KEY_UIMainStoryboardFile = Main;
 				INFOPLIST_KEY_UISupportedInterfaceOrientations_iPad = "UIInterfaceOrientationPortrait UIInterfaceOrientationPortraitUpsideDown UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight";
 				INFOPLIST_KEY_UISupportedInterfaceOrientations_iPhone = "UIInterfaceOrientationPortrait UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight";
+				IPHONEOS_DEPLOYMENT_TARGET = 14.0;
 				LD_RUNPATH_SEARCH_PATHS = (
 					"$(inherited)",
 					"@executable_path/Frameworks",
@@ -188,9 +920,13 @@
 				MARKETING_VERSION = 1.0;
 				PRODUCT_BUNDLE_IDENTIFIER = com.tsyh.AIEmoji;
 				PRODUCT_NAME = "$(TARGET_NAME)";
+				SUPPORTED_PLATFORMS = "iphoneos iphonesimulator";
+				SUPPORTS_MACCATALYST = NO;
+				SUPPORTS_MAC_DESIGNED_FOR_IPHONE_IPAD = NO;
+				SUPPORTS_XR_DESIGNED_FOR_IPHONE_IPAD = NO;
 				SWIFT_EMIT_LOC_STRINGS = YES;
 				SWIFT_VERSION = 5.0;
-				TARGETED_DEVICE_FAMILY = "1,2";
+				TARGETED_DEVICE_FAMILY = 1;
 			};
 			name = Release;
 		};
@@ -335,6 +1071,20 @@
 			defaultConfigurationName = Release;
 		};
 /* End XCConfigurationList section */
+
+/* Begin XCLocalSwiftPackageReference section */
+		A8F775512D3A038800AA6E93 /* XCLocalSwiftPackageReference "../SwiftUIX-master" */ = {
+			isa = XCLocalSwiftPackageReference;
+			relativePath = "../SwiftUIX-master";
+		};
+/* End XCLocalSwiftPackageReference section */
+
+/* Begin XCSwiftPackageProductDependency section */
+		A8F775522D3A038800AA6E93 /* SwiftUIX */ = {
+			isa = XCSwiftPackageProductDependency;
+			productName = SwiftUIX;
+		};
+/* End XCSwiftPackageProductDependency section */
 	};
 	rootObject = A8F774612D38E8B000AA6E93 /* Project object */;
 }

+ 78 - 0
AIEmoji.xcodeproj/xcshareddata/xcschemes/AIEmoji.xcscheme

@@ -0,0 +1,78 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<Scheme
+   LastUpgradeVersion = "1620"
+   version = "1.7">
+   <BuildAction
+      parallelizeBuildables = "YES"
+      buildImplicitDependencies = "YES"
+      buildArchitectures = "Automatic">
+      <BuildActionEntries>
+         <BuildActionEntry
+            buildForTesting = "YES"
+            buildForRunning = "YES"
+            buildForProfiling = "YES"
+            buildForArchiving = "YES"
+            buildForAnalyzing = "YES">
+            <BuildableReference
+               BuildableIdentifier = "primary"
+               BlueprintIdentifier = "A8F774682D38E8B000AA6E93"
+               BuildableName = "AIEmoji.app"
+               BlueprintName = "AIEmoji"
+               ReferencedContainer = "container:AIEmoji.xcodeproj">
+            </BuildableReference>
+         </BuildActionEntry>
+      </BuildActionEntries>
+   </BuildAction>
+   <TestAction
+      buildConfiguration = "Debug"
+      selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
+      selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
+      shouldUseLaunchSchemeArgsEnv = "YES"
+      shouldAutocreateTestPlan = "YES">
+   </TestAction>
+   <LaunchAction
+      buildConfiguration = "Debug"
+      selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
+      selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
+      launchStyle = "0"
+      useCustomWorkingDirectory = "NO"
+      ignoresPersistentStateOnLaunch = "NO"
+      debugDocumentVersioning = "YES"
+      debugServiceExtension = "internal"
+      allowLocationSimulation = "YES">
+      <BuildableProductRunnable
+         runnableDebuggingMode = "0">
+         <BuildableReference
+            BuildableIdentifier = "primary"
+            BlueprintIdentifier = "A8F774682D38E8B000AA6E93"
+            BuildableName = "AIEmoji.app"
+            BlueprintName = "AIEmoji"
+            ReferencedContainer = "container:AIEmoji.xcodeproj">
+         </BuildableReference>
+      </BuildableProductRunnable>
+   </LaunchAction>
+   <ProfileAction
+      buildConfiguration = "Release"
+      shouldUseLaunchSchemeArgsEnv = "YES"
+      savedToolIdentifier = ""
+      useCustomWorkingDirectory = "NO"
+      debugDocumentVersioning = "YES">
+      <BuildableProductRunnable
+         runnableDebuggingMode = "0">
+         <BuildableReference
+            BuildableIdentifier = "primary"
+            BlueprintIdentifier = "A8F774682D38E8B000AA6E93"
+            BuildableName = "AIEmoji.app"
+            BlueprintName = "AIEmoji"
+            ReferencedContainer = "container:AIEmoji.xcodeproj">
+         </BuildableReference>
+      </BuildableProductRunnable>
+   </ProfileAction>
+   <AnalyzeAction
+      buildConfiguration = "Debug">
+   </AnalyzeAction>
+   <ArchiveAction
+      buildConfiguration = "Release"
+      revealArchiveInOrganizer = "YES">
+   </ArchiveAction>
+</Scheme>

+ 9 - 1
AIEmoji.xcodeproj/xcuserdata/100years.xcuserdatad/xcschemes/xcschememanagement.plist

@@ -7,7 +7,15 @@
 		<key>AIEmoji.xcscheme_^#shared#^_</key>
 		<dict>
 			<key>orderHint</key>
-			<integer>0</integer>
+			<integer>33</integer>
+		</dict>
+	</dict>
+	<key>SuppressBuildableAutocreation</key>
+	<dict>
+		<key>A8F774682D38E8B000AA6E93</key>
+		<dict>
+			<key>primary</key>
+			<true/>
 		</dict>
 	</dict>
 </dict>

+ 10 - 0
AIEmoji.xcworkspace/contents.xcworkspacedata

@@ -0,0 +1,10 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<Workspace
+   version = "1.0">
+   <FileRef
+      location = "group:AIEmoji.xcodeproj">
+   </FileRef>
+   <FileRef
+      location = "group:Pods/Pods.xcodeproj">
+   </FileRef>
+</Workspace>

+ 17 - 15
AIEmoji/AppDelegate.swift

@@ -10,27 +10,29 @@ import UIKit
 @main
 class AppDelegate: UIResponder, UIApplicationDelegate {
 
-
+    var window: UIWindow?
 
     func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
-        // Override point for customization after application launch.
+        window = UIWindow(frame: UIScreen.main.bounds)
+        window?.backgroundColor = UIColor.white
+        window?.makeKeyAndVisible()
+        
+        goToTab()
+        
         return true
     }
 
-    // MARK: UISceneSession Lifecycle
-
-    func application(_ application: UIApplication, configurationForConnecting connectingSceneSession: UISceneSession, options: UIScene.ConnectionOptions) -> UISceneConfiguration {
-        // Called when a new scene session is being created.
-        // Use this method to select a configuration to create the new scene with.
-        return UISceneConfiguration(name: "Default Configuration", sessionRole: connectingSceneSession.role)
+    
+    func goToTab(){
+        window?.rootViewController = TSTabBarController()
     }
-
-    func application(_ application: UIApplication, didDiscardSceneSessions sceneSessions: Set<UISceneSession>) {
-        // Called when the user discards a scene session.
-        // If any sessions were discarded while the application was not running, this will be called shortly after application:didFinishLaunchingWithOptions.
-        // Use this method to release any resources that were specific to the discarded scenes, as they will not return.
+    
+    func addNetListener(){
+        TSNetworkShard.monitorNetworkPermission { success in
+            if success {
+                //PurchaseManager.default.requestProducts()
+            }
+        }
     }
-
-
 }
 

+ 6 - 0
AIEmoji/Assets.xcassets/Common/Contents.json

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

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

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

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


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


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

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

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


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


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

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

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


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


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

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

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


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


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

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

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


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


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

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

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


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


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

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

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


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


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

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

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


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


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

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

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


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


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

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

BIN
AIEmoji/Assets.xcassets/Common/success_icon.imageset/icon_已下载@2x.png


BIN
AIEmoji/Assets.xcassets/Common/success_icon.imageset/icon_已下载@3x.png


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

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

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


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


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

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

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


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


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

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

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


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


+ 6 - 0
AIEmoji/Assets.xcassets/Emojis/Contents.json

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

+ 22 - 0
AIEmoji/Assets.xcassets/Emojis/nav_title_emojis.imageset/Contents.json

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

BIN
AIEmoji/Assets.xcassets/Emojis/nav_title_emojis.imageset/nav_title_genmoji@2x.png


BIN
AIEmoji/Assets.xcassets/Emojis/nav_title_emojis.imageset/nav_title_genmoji@3x.png


+ 6 - 0
AIEmoji/Assets.xcassets/Genmoji/Contents.json

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

+ 22 - 0
AIEmoji/Assets.xcassets/Genmoji/genmoji_robot.imageset/Contents.json

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

BIN
AIEmoji/Assets.xcassets/Genmoji/genmoji_robot.imageset/genmoji_robot@2x.png


BIN
AIEmoji/Assets.xcassets/Genmoji/genmoji_robot.imageset/genmoji_robot@3x.png


+ 22 - 0
AIEmoji/Assets.xcassets/Genmoji/nav_title_genmoji.imageset/Contents.json

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

BIN
AIEmoji/Assets.xcassets/Genmoji/nav_title_genmoji.imageset/nav_title_emojis@2x.png


BIN
AIEmoji/Assets.xcassets/Genmoji/nav_title_genmoji.imageset/nav_title_emojis@3x.png


+ 6 - 0
AIEmoji/Assets.xcassets/Tabbar/Contents.json

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

+ 22 - 0
AIEmoji/Assets.xcassets/Tabbar/tabbar_select_edit.imageset/Contents.json

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

BIN
AIEmoji/Assets.xcassets/Tabbar/tabbar_select_edit.imageset/tabbar_select_edit@2x.png


BIN
AIEmoji/Assets.xcassets/Tabbar/tabbar_select_edit.imageset/tabbar_select_edit@3x.png


+ 22 - 0
AIEmoji/Assets.xcassets/Tabbar/tabbar_select_home.imageset/Contents.json

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

BIN
AIEmoji/Assets.xcassets/Tabbar/tabbar_select_home.imageset/tabbar_select_home@2x.png


BIN
AIEmoji/Assets.xcassets/Tabbar/tabbar_select_home.imageset/tabbar_select_home@3x.png


+ 22 - 0
AIEmoji/Assets.xcassets/Tabbar/tabbar_select_mark.imageset/Contents.json

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

BIN
AIEmoji/Assets.xcassets/Tabbar/tabbar_select_mark.imageset/tabbar_select_mark@2x.png


BIN
AIEmoji/Assets.xcassets/Tabbar/tabbar_select_mark.imageset/tabbar_select_mark@3x.png


+ 22 - 0
AIEmoji/Assets.xcassets/Tabbar/tabbar_select_mine.imageset/Contents.json

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

BIN
AIEmoji/Assets.xcassets/Tabbar/tabbar_select_mine.imageset/tabbar_select_mine@2x.png


BIN
AIEmoji/Assets.xcassets/Tabbar/tabbar_select_mine.imageset/tabbar_select_mine@3x.png


+ 22 - 0
AIEmoji/Assets.xcassets/Tabbar/tabbar_select_random.imageset/Contents.json

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

BIN
AIEmoji/Assets.xcassets/Tabbar/tabbar_select_random.imageset/tabbar_select_random@2x.png


BIN
AIEmoji/Assets.xcassets/Tabbar/tabbar_select_random.imageset/tabbar_select_random@3x.png


+ 22 - 0
AIEmoji/Assets.xcassets/Tabbar/tabbar_unSelect_edit.imageset/Contents.json

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

BIN
AIEmoji/Assets.xcassets/Tabbar/tabbar_unSelect_edit.imageset/tabbar_unSelect_edit@2x.png


BIN
AIEmoji/Assets.xcassets/Tabbar/tabbar_unSelect_edit.imageset/tabbar_unSelect_edit@3x.png


+ 22 - 0
AIEmoji/Assets.xcassets/Tabbar/tabbar_unSelect_home.imageset/Contents.json

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

BIN
AIEmoji/Assets.xcassets/Tabbar/tabbar_unSelect_home.imageset/tabbar_unSelect_home@2x.png


BIN
AIEmoji/Assets.xcassets/Tabbar/tabbar_unSelect_home.imageset/tabbar_unSelect_home@3x.png


+ 22 - 0
AIEmoji/Assets.xcassets/Tabbar/tabbar_unSelect_mine.imageset/Contents.json

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

BIN
AIEmoji/Assets.xcassets/Tabbar/tabbar_unSelect_mine.imageset/tabbar_unSelect_mine@2x.png


BIN
AIEmoji/Assets.xcassets/Tabbar/tabbar_unSelect_mine.imageset/tabbar_unSelect_mine@3x.png


+ 22 - 0
AIEmoji/Assets.xcassets/Tabbar/tabbar_unSelect_random.imageset/Contents.json

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

BIN
AIEmoji/Assets.xcassets/Tabbar/tabbar_unSelect_random.imageset/tabbar_unSelect_random@2x.png


BIN
AIEmoji/Assets.xcassets/Tabbar/tabbar_unSelect_random.imageset/tabbar_unSelect_random@3x.png


+ 0 - 24
AIEmoji/Base.lproj/Main.storyboard

@@ -1,24 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<document type="com.apple.InterfaceBuilder3.CocoaTouch.Storyboard.XIB" version="3.0" toolsVersion="13122.16" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" useTraitCollections="YES" useSafeAreas="YES" colorMatched="YES" initialViewController="BYZ-38-t0r">
-    <dependencies>
-        <plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="13104.12"/>
-        <capability name="Safe area layout guides" minToolsVersion="9.0"/>
-        <capability name="documents saved in the Xcode 8 format" minToolsVersion="8.0"/>
-    </dependencies>
-    <scenes>
-        <!--View Controller-->
-        <scene sceneID="tne-QT-ifu">
-            <objects>
-                <viewController id="BYZ-38-t0r" customClass="ViewController" customModuleProvider="target" sceneMemberID="viewController">
-                    <view key="view" contentMode="scaleToFill" id="8bC-Xf-vdC">
-                        <rect key="frame" x="0.0" y="0.0" width="375" height="667"/>
-                        <autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
-                        <color key="backgroundColor" xcode11CocoaTouchSystemColor="systemBackgroundColor" cocoaTouchSystemColor="whiteColor"/>
-                        <viewLayoutGuide key="safeArea" id="6Tk-OE-BBY"/>
-                    </view>
-                </viewController>
-                <placeholder placeholderIdentifier="IBFirstResponder" id="dkx-z0-nzr" sceneMemberID="firstResponder"/>
-            </objects>
-        </scene>
-    </scenes>
-</document>

+ 117 - 0
AIEmoji/Business/General/TSBottomAlertVC.swift

@@ -0,0 +1,117 @@
+//
+//  TSBottomAlertVC.swift
+//  AIEmoji
+//
+//  Created by 100Years on 2025/1/17.
+//
+
+class TSBottomAlertVC: TSBaseVC {
+    
+    lazy var bottomView: UIView = {
+        let bottomView = UIView(frame: CGRectMake(0, k_ScreenHeight-448, k_ScreenWidth, 448))
+        bottomView.backgroundColor = "#222222".color
+        bottomView.cornersRound(radius: 20, corner: [.topLeft,.topRight])
+        return bottomView
+    }()
+    
+
+    lazy var xBtn: UIButton = {
+        let xBtn = UIButton.createButton(image: UIImage(named: "x")) { [weak self]  in
+            guard let self = self else { return }
+            clickXBtn()
+        }
+        return xBtn
+    }()
+    
+    lazy var submitBtn: UIButton = {
+        let tryAgainBtn = kCreateNormalSubmitBtn(title: "Try Again".localized) { [weak self]  in
+            guard let self = self else { return }
+            clickSubmitBtn()
+        }
+        return tryAgainBtn
+    }()
+    
+    
+    lazy var cancelBtn: UIButton = {
+        let tryAgainBtn = kCreateNormalCancelBtn(title: "Copy".localized) { [weak self]  in
+            guard let self = self else { return }
+            clickCancelBtn()
+        }
+        return tryAgainBtn
+    }()
+    
+    lazy var confirmBtn: UIButton = {
+        let tryAgainBtn = kCreateNormalConfirmBtn(title: "Save".localized) { [weak self]  in
+            guard let self = self else { return }
+            clickConfirmBtn()
+        }
+        return tryAgainBtn
+    }()
+    
+    override func createView() {
+        view.backgroundColor = .clear
+        setNavBarViewHidden(true)
+        contentView.addSubview(bottomView)
+        
+        bottomView.addSubview(xBtn)
+        xBtn.snp.makeConstraints { make in
+            make.top.equalTo(8)
+            make.trailing.equalTo(-8)
+            make.width.equalTo(24)
+            make.height.equalTo(24)
+        }
+        
+        //重试
+        bottomView.addSubview(submitBtn)
+        submitBtn.snp.makeConstraints { make in
+            make.bottom.equalTo(-34)
+            make.centerX.equalToSuperview()
+            make.width.equalTo(329)
+            make.height.equalTo(60)
+        }
+        
+        
+        //中心点
+        let centerView = UIView()
+        bottomView.addSubview(centerView)
+        centerView.snp.makeConstraints { make in
+            make.center.equalToSuperview()
+        }
+        bottomView.addSubview(cancelBtn)
+        cancelBtn.snp.makeConstraints { make in
+            make.bottom.equalTo(-34)
+            make.trailing.equalTo(centerView.snp.leading).offset(-8)
+            make.width.equalTo(163)
+            make.height.equalTo(60)
+        }
+        
+        bottomView.addSubview(confirmBtn)
+        confirmBtn.snp.makeConstraints { make in
+            make.bottom.equalTo(-34)
+            make.leading.equalTo(centerView.snp.trailing).offset(8)
+            make.width.equalTo(163)
+            make.height.equalTo(60)
+        }
+    }
+    
+    func closePage() {
+        self.dismiss(animated: true, completion: nil)
+    }
+
+    
+    @objc func clickSubmitBtn(){
+        
+    }
+    
+    @objc func clickCancelBtn(){
+        
+    }
+    
+    @objc func clickConfirmBtn(){
+        
+    }
+    
+    @objc func clickXBtn(){
+        closePage()
+    }
+}

+ 182 - 0
AIEmoji/Business/General/TSSmallIconBrowseVC/TSSmallIconBrowseVC.swift

@@ -0,0 +1,182 @@
+//
+//  TSSmallIconBrowseVC.swift
+//  AIEmoji
+//
+//  Created by 100Years on 2025/1/19.
+//
+
+private let cellId = "TSSmallIconBrowseCell"
+class TSSmallIconBrowseVC: TSBottomAlertVC {
+
+    
+    var dataModelArray = [TSGenmojiModel]()
+    var currentImage:UIImage?
+    var currentIndex:Int = 0 {
+        didSet{
+            reloadUI()
+        }
+    }
+    
+    lazy var collectionView: UICollectionView = {
+        let collectionView = UICollectionView.createCommon(delegate: self, cellReuseIds: [cellId])
+        collectionView.isPagingEnabled = true
+        collectionView.isHidden = true
+        if let flowLayout = collectionView.collectionViewLayout as? UICollectionViewFlowLayout {
+            flowLayout.minimumInteritemSpacing = 0
+            flowLayout.minimumLineSpacing = 0
+            flowLayout.itemSize = CGSize(width: k_ScreenWidth, height: 200)
+            flowLayout.scrollDirection = .horizontal
+        }
+        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.setContentOffset(CGPoint(x: CGFloat(self.currentIndex-1) * self.collectionView.frame.size.width, y: 0), animated: false)
+            
+        }
+        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.setContentOffset(CGPoint(x: CGFloat(self.currentIndex+1) * self.collectionView.frame.size.width, y: 0), animated: false)
+        }
+        return rightBtn
+    }()
+        
+    override func createView() {
+        super.createView()
+        submitBtn.isHidden = true
+    
+        bottomView.addSubview(collectionView)
+        collectionView.snp.makeConstraints { make in
+            make.leading.trailing.equalTo(0)
+            make.top.equalTo(80)
+            make.height.equalTo(200)
+        }
+        
+        bottomView.addSubview(leftBtn)
+        leftBtn.snp.makeConstraints { make in
+            make.leading.equalTo(17)
+            make.top.equalTo(160)
+            make.width.height.equalTo(40)
+        }
+        
+        bottomView.addSubview(rightBtn)
+        rightBtn.snp.makeConstraints { make in
+            make.trailing.equalTo(-18)
+            make.top.equalTo(160)
+            make.width.height.equalTo(40)
+        }
+        
+        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)
+        }
+    }
+    
+    
+    @objc override func clickCancelBtn(){
+        if let image = currentImage{
+            UIDevice.copyImage(image: image)
+            kSavePhotoSuccesswShared.show(atView: self.view,text: "Copy Successfully".localized,showViewBtn:false)
+//            closePage()
+        }
+    }
+    
+    @objc override func clickConfirmBtn(){
+        if let image = currentImage{
+            PhotoManagerShared.saveImageToAlbum(image) { success, error in
+                if success {
+                    kSavePhotoSuccesswShared.show(atView: self.view)
+//                    self.closePage()
+                }else{
+                    debugPrint(error)
+                }
+            }
+        }
+    }
+}
+
+
+extension TSSmallIconBrowseVC {
+    
+    func reloadUI() {
+        
+        //判断前后是否还有,以此来确定左右翻页按钮
+        var isHiddenLeft = false
+        var isHiddenRight = false
+        if currentIndex == 0 {
+            isHiddenLeft = true
+        }else if currentIndex >= dataModelArray.count {
+            isHiddenRight = true
+        }else if dataModelArray.count == 1{
+            isHiddenLeft = true
+            isHiddenRight = true
+        }
+        
+        leftBtn.isHidden = isHiddenLeft
+        rightBtn.isHidden = isHiddenRight
+    }
+}
+
+//MARK: UICollectionViewDataSource
+extension TSSmallIconBrowseVC: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! TSSmallIconBrowseCell
+        
+//        debugPrint("collectionView cellForItemAt=\(indexPath)")
+        
+        if let model = dataModelArray.safeObj(At: indexPath.item){
+            cell.netWorkImageView.setAsyncImage(urlString: model.response.resultUrl){[weak self] image in
+                guard let self = self else { return }
+                currentImage = image
+            }
+        }
+
+        return cell
+    }
+    
+    
+//    func collectionView(_ collectionView: UICollectionView, didEndDisplaying cell: UICollectionViewCell, forItemAt indexPath: IndexPath) {
+//        
+//        debugPrint("collectionView didEndDisplaying=\(indexPath)")
+//        
+//        if let cell = cell as? TSSmallIconBrowseCell {
+//            cell.stopPlayLive()
+//        }
+//    }
+//    
+//    func collectionView(_ collectionView: UICollectionView, willDisplay cell: UICollectionViewCell, forItemAt indexPath: IndexPath){
+//        
+//        debugPrint("collectionView willDisplay=\(indexPath)")
+//        
+//        if let cell = cell as? TSSmallIconBrowseCell {
+//            cell.stratPlayLive()
+//        }
+//    }
+}

+ 24 - 0
AIEmoji/Business/General/TSSmallIconBrowseVC/View/TSSmallIconBrowseCell.swift

@@ -0,0 +1,24 @@
+//
+//  TSSmallIconBrowseCell.swift
+//  AIEmoji
+//
+//  Created by 100Years on 2025/1/19.
+//
+
+class TSSmallIconBrowseCell : TSBaseCollectionCell{
+
+    lazy var netWorkImageView : UIImageView = {
+        let netWorkImageView = UIImageView.createImageView(imageName: "",corner: 24.0)
+        return netWorkImageView
+    }()
+
+    override func creatUI() {
+        bgContentView.addSubview(netWorkImageView)
+        netWorkImageView.snp.makeConstraints { make in
+            make.center.equalToSuperview()
+            make.width.equalTo(200)
+            make.height.equalTo(200)
+        }
+        
+    }
+}

+ 139 - 0
AIEmoji/Business/TSEmojisVC/TSEmojisChildVC/TSEmojisChildVC.swift

@@ -0,0 +1,139 @@
+//
+//  TSEmojisChildVC.swift
+//  AIEmoji
+//
+//  Created by 100Years on 2025/1/16.
+//
+
+import JXSegmentedView
+import JXPagingView
+import MJRefresh
+
+class TSEmojisChildVC: UIViewController {
+    
+    
+    var listViewDidScrollCallback: ((UIScrollView) -> ())?
+    let collectionView: UICollectionView
+    override init(nibName nibNameOrNil: String?, bundle nibBundleOrNil: Bundle?) {
+        let itemMargin: CGFloat = 10
+        let itemWidth = floor((UIScreen.main.bounds.size.width - itemMargin*4)/3)
+        let layout = UICollectionViewFlowLayout()
+        layout.itemSize = CGSize(width: itemWidth, height: itemWidth)
+        layout.sectionInset = UIEdgeInsets.init(top: itemMargin, left: itemMargin, bottom: itemMargin, right: itemMargin)
+        layout.scrollDirection = .vertical
+        collectionView = UICollectionView(frame: CGRect.zero, collectionViewLayout: layout)
+        super.init(nibName: nibNameOrNil, bundle: nibBundleOrNil)
+
+    }
+
+    required init?(coder: NSCoder) {
+        fatalError("init(coder:) has not been implemented")
+    }
+
+    override func viewDidLoad() {
+        super.viewDidLoad()
+
+        collectionView.alwaysBounceHorizontal = false
+        collectionView.backgroundColor = .white
+        collectionView.dataSource = self
+        collectionView.delegate = self
+        collectionView.register(ListCollectionViewCell.self, forCellWithReuseIdentifier: "cell")
+        //列表的contentInsetAdjustmentBehavior失效,需要自己设置底部inset
+        collectionView.contentInset = UIEdgeInsets(top: 0, left: 0, bottom: 0, right: 0)
+        view.addSubview(collectionView)
+        
+        collectionView.mj_header = MJRefreshNormalHeader(refreshingTarget: self, refreshingAction: #selector(headerRefresh))
+        collectionView.mj_footer = MJRefreshAutoNormalFooter(refreshingTarget: self, refreshingAction: #selector(loadMore))
+        collectionView.contentInsetAdjustmentBehavior = .never
+        
+   
+    }
+    
+    override func viewDidLayoutSubviews() {
+        super.viewDidLayoutSubviews()
+
+        collectionView.frame = view.bounds
+    }
+    
+    @objc func headerRefresh() {
+        DispatchQueue.main.asyncAfter(deadline: DispatchTime.now() + DispatchTimeInterval.seconds(2)) {
+            self.collectionView.mj_header?.endRefreshing()
+     
+            self.collectionView.reloadData()
+        }
+    }
+
+    @objc func loadMore() {
+        DispatchQueue.main.asyncAfter(deadline: DispatchTime.now() + DispatchTimeInterval.seconds(2)) {
+  
+            self.collectionView.reloadData()
+            self.collectionView.mj_footer?.endRefreshing()
+        }
+    }
+}
+
+extension TSEmojisChildVC: UICollectionViewDataSource, UICollectionViewDelegate {
+    public func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
+        return 20
+    }
+
+    public func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
+        let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "cell", for: indexPath) as! ListCollectionViewCell
+        cell.contentView.backgroundColor = .lightGray
+        cell.titleLabel.text = String(format: "%d", indexPath.item)
+        return cell
+    }
+}
+
+class ListCollectionViewCell: UICollectionViewCell {
+    lazy var titleLabel: UILabel = UILabel()
+
+    override init(frame: CGRect) {
+        super.init(frame: frame)
+
+        titleLabel.textAlignment = .center
+        addSubview(titleLabel)
+    }
+
+    required init?(coder aDecoder: NSCoder) {
+        fatalError("init(coder:) has not been implemented")
+    }
+
+    override func layoutSubviews() {
+        super.layoutSubviews()
+
+        titleLabel.frame = self.contentView.bounds
+    }
+}
+
+extension TSEmojisChildVC: JXPagingViewListViewDelegate {
+    
+    func listScrollView() -> UIScrollView { collectionView }
+    
+    func scrollViewDidScroll(_ scrollView: UIScrollView) {
+        listViewDidScrollCallback?(scrollView)
+    }
+    
+    
+    func listViewDidScrollCallback(callback: @escaping (UIScrollView) -> ()) {
+        listViewDidScrollCallback = callback
+    }
+
+    func listView() -> UIView { view }
+    
+    func listWillAppear() {
+        print("\(title ?? ""):\(#function)")
+    }
+
+    func listDidAppear() {
+        print("\(title ?? ""):\(#function)")
+    }
+
+    func listWillDisappear() {
+        print("\(title ?? ""):\(#function)")
+    }
+
+    func listDidDisappear() {
+        print("\(title ?? ""):\(#function)")
+    }
+}

+ 14 - 0
AIEmoji/Business/TSEmojisVC/TSEmojisChildVC/ViewModel/TSEmojisChildColViewModel.swift

@@ -0,0 +1,14 @@
+//
+//  TSEmojisChildColViewModel.swift
+//  AIEmoji
+//
+//  Created by 100Years on 2025/1/19.
+//
+
+class TSEmojisChildColViewModel {
+    
+    
+    
+    
+    
+}

+ 147 - 0
AIEmoji/Business/TSEmojisVC/TSEmojisVC/TSEmojisVC.swift

@@ -0,0 +1,147 @@
+//
+//  TSEmojisVC.swift
+//  AIEmoji
+//
+//  Created by 100Years on 2025/1/15.
+//
+
+import JXSegmentedView
+import JXPagingView
+class TSEmojisVC: TSBaseVC {
+    
+    let viewModel = TSEmojisColViewModel()
+    
+    lazy var pagingView: JXPagingView = {
+        //lazy var pagingView: JXPagingView = JXPagingListRefreshView(delegate: self) //整个刷新
+//        let pagingView = JXPagingListRefreshView(delegate: self) //list 刷新
+        let pagingView = JXPagingView(delegate: self) //list 刷新
+        pagingView.mainTableView.backgroundColor = .clear
+        return pagingView
+    }()
+
+    lazy var segmentedDataSource: JXSegmentedTitleDataSource = {
+        let titles = ["Solid Color".localized, "Gradient Color".localized, "Shape".localized]
+        let dataSource = JXSegmentedTitleDataSource()
+        dataSource.isTitleColorGradientEnabled = true
+        dataSource.titles = viewModel.emojisTypes
+        dataSource.titleNormalColor = .white
+        dataSource.titleSelectedColor = .mainBg
+        dataSource.titleNormalFont = .font(size: 16.0)
+        return dataSource
+    }()
+    
+    //配置指示器
+    lazy var indicator: JXSegmentedIndicatorBackgroundView = {
+        let indicator = JXSegmentedIndicatorBackgroundView()
+        indicator.isIndicatorConvertToItemFrameEnabled = true
+        indicator.indicatorHeight = 30
+        indicator.indicatorColor = .white
+        return indicator
+    }()
+    
+    //头 view
+    lazy var segmentedView: JXSegmentedView = {
+        let segmentedView = JXSegmentedView(frame: CGRect(x: 0, y: 0, width: UIScreen.main.bounds.size.width, height: CGFloat(headerInSectionHeight)))
+        segmentedView.delegate = self
+        segmentedView.indicators = [indicator]
+        segmentedView.dataSource = segmentedDataSource
+        segmentedView.backgroundColor = .clear
+        
+        segmentedView.listContainer = pagingView.listContainerView as? any JXSegmentedViewListContainer
+        return segmentedView
+    }()
+
+    var tableHeaderViewHeight: Int = 200
+    var headerInSectionHeight: Int = 50
+    
+    lazy var headerView: UIView = {
+        let view = UIView(frame: CGRect(x: 0, y: 0, width: UIScreen.main.bounds.size.width, height: CGFloat(tableHeaderViewHeight)))
+        view.backgroundColor = .gray
+        return view
+    }()
+    
+    lazy var navBarView: TSBaseNavContentBarView = {
+        let navBarView = TSBaseNavContentBarView()
+        
+        let titleImageView = UIImageView.createImageView(imageName: "nav_title_emojis",contentMode: .scaleToFill)
+        navBarView.barView.addSubview(titleImageView)
+        titleImageView.snp.makeConstraints { make in
+            make.centerY.equalToSuperview()
+            make.left.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)
+        }
+        
+        return navBarView
+    }()
+    
+    override func createView() {
+
+        navBarContentView.addSubview(navBarView)
+        navBarView.snp.makeConstraints { make in
+            make.edges.equalToSuperview()
+        }
+        
+        contentView.addSubview(segmentedView)
+      
+        pagingView.frame = self.view.bounds
+        contentView.addSubview(pagingView)
+
+        //扣边返回处理,下面的代码要加上
+        pagingView.listContainerView.scrollView.panGestureRecognizer.require(toFail: self.navigationController!.interactivePopGestureRecognizer!)
+        pagingView.mainTableView.panGestureRecognizer.require(toFail: self.navigationController!.interactivePopGestureRecognizer!)
+        
+        
+        
+//        kDelayOnMainThread(2) {
+//            self.tableHeaderViewHeight = 0
+//            self.pagingView.reloadData()
+//        }
+    }
+}
+
+
+
+extension TSEmojisVC: JXPagingViewDelegate {
+
+    func tableHeaderViewHeight(in pagingView: JXPagingView) -> Int {
+        return tableHeaderViewHeight
+    }
+
+    func tableHeaderView(in pagingView: JXPagingView) -> UIView {
+        return headerView
+    }
+
+    func heightForPinSectionHeader(in pagingView: JXPagingView) -> Int {
+        return headerInSectionHeight
+    }
+
+    func viewForPinSectionHeader(in pagingView: JXPagingView) -> UIView {
+        return segmentedView
+    }
+
+    func numberOfLists(in pagingView: JXPagingView) -> Int {
+        return viewModel.emojisTypes.count
+    }
+
+    func pagingView(_ pagingView: JXPagingView, initListAtIndex index: Int) -> JXPagingViewListViewDelegate {
+        return TSEmojisChildVC()
+    }
+}
+
+extension TSEmojisVC: JXSegmentedViewDelegate {
+    func segmentedView(_ segmentedView: JXSegmentedView, didSelectedItemAt index: Int) {
+        self.navigationController?.interactivePopGestureRecognizer?.isEnabled = (index == 0)
+    }
+}

+ 22 - 0
AIEmoji/Business/TSEmojisVC/TSEmojisVC/ViewModel/TSEmojisColViewModel.swift

@@ -0,0 +1,22 @@
+//
+//  TSEmojisColViewModel.swift
+//  AIEmoji
+//
+//  Created by 100Years on 2025/1/19.
+//
+
+
+
+class TSEmojisColViewModel {
+
+    lazy var emojisTypes: [String] = {
+        let titles = ["Universe🌍","Food🍔","Beauty👸","Drink🥤","Dog🐕"]
+        return titles
+    }()
+    
+    
+    
+    
+    
+    
+}

+ 157 - 0
AIEmoji/Business/TSGenmojiVC/TSGenmojiGennerateVC/TSGenmojiGennerateVC.swift

@@ -0,0 +1,157 @@
+//
+//  TSGenmojiGennerateVC.swift
+//  AIEmoji
+//
+//  Created by 100Years on 2025/1/17.
+//
+
+class TSGenmojiGennerateVC: TSBottomAlertVC {
+    
+    var imageModel:TSGenmojiModel?
+    var complete:((TSGenmojiModel)->Void)
+    var aiText:String
+    init(aiText: String,complete:@escaping ((TSGenmojiModel)->Void)) {
+        self.aiText = aiText
+        self.complete = complete
+        super.init()
+    }
+    
+    var viewModel:TSGenmojiGennerateViewModel = TSGenmojiGennerateViewModel()
+    @MainActor required init?(coder: NSCoder) {
+        fatalError("init(coder:) has not been implemented")
+    }
+    
+    lazy var netWorkImageView : UIImageView = {
+        let netWorkImageView = UIImageView.createImageView(imageName: "",corner: 24.0)
+        return netWorkImageView
+    }()
+    
+    
+    lazy var generateInView : TSCommonloadingView = {
+        let generateInView = TSCommonloadingView()
+        return generateInView
+    }()
+    
+    override func createView() {
+        super.createView()
+        
+        bottomView.addSubview(generateInView)
+        generateInView.snp.makeConstraints { make in
+            make.top.equalTo(140)
+            make.centerX.equalToSuperview()
+        }
+        
+        bottomView.addSubview(netWorkImageView)
+        netWorkImageView.snp.makeConstraints { make in
+            make.top.equalTo(80)
+            make.centerX.equalToSuperview()
+            make.width.equalTo(200)
+            make.height.equalTo(200)
+        }
+        
+    }
+    
+    override func closePage() {
+        self.dismiss(animated: true, completion: nil)
+    }
+    
+    
+    
+    @objc override func clickSubmitBtn(){
+        viewModel.creatImageEmoji(text:aiText)
+    }
+    
+    @objc override func clickCancelBtn(){
+        if let image = getSuccessImage() {
+            UIDevice.copyImage(image: image)
+            if let model = imageModel {
+                complete(model)
+            }
+            closePage()
+        }
+    }
+    
+    @objc override func clickConfirmBtn(){
+        if let image = getSuccessImage() {
+            PhotoManagerShared.saveImageToAlbum(image) { success, error in
+                if success {
+                    kSavePhotoSuccesswShared.show(atView: self.view)
+                    if let model = self.imageModel {
+                        self.complete(model)
+                    }
+                    self.closePage()
+                }else{
+                    debugPrint(error)
+                }
+            }
+        }
+    }
+    
+    
+    override func dealThings() {
+        viewModel.creatImageEmoji(text: self.aiText)
+        viewModel.$stateDatauPblished.receive(on: DispatchQueue.main).sink {[weak self]  (state,model) in
+            guard let self = self else { return }
+            self.upDateView(state: state, model: model)
+        }.store(in: &cancellable)
+    }
+}
+extension TSGenmojiGennerateVC {
+    
+    
+    func getSuccessImage()->UIImage?{
+        if let image = netWorkImageView.image {
+            return image.pngImage
+        }
+        return nil
+    }
+    
+}
+extension TSGenmojiGennerateVC {
+    func upDateView(state:TSProgressState,model:TSGenmojiModel?){
+        switch state {
+            case .failed(let _):
+                showError()
+            case .success:
+                if let model = model {
+                    showSuccess(model: model)
+                }else{
+                    showError()
+                }
+            default:
+                showLoading()
+        }
+    }
+    
+    func showLoading(){
+        generateInView.isHidden = false
+        generateInView.showLoading(text: "generate in...".localized)
+        generateInView.isRotating = true
+        submitBtn.isHidden = true
+        cancelBtn.isHidden = true
+        confirmBtn.isHidden = true
+        xBtn.isHidden = true
+    }
+    
+    func showError(){
+        generateInView.isHidden = false
+        generateInView.showError(text: "Generation failed".localized)
+        generateInView.isRotating = false
+        submitBtn.isHidden = false
+        cancelBtn.isHidden = true
+        confirmBtn.isHidden = true
+        xBtn.isHidden = false
+    }
+    
+    func showSuccess(model:TSGenmojiModel){
+        generateInView.isHidden = true
+        generateInView.isRotating = false
+        submitBtn.isHidden = true
+        cancelBtn.isHidden = false
+        confirmBtn.isHidden = false
+        xBtn.isHidden = false
+        imageModel = model
+        //请求成功,则加载和保存图片
+        self.netWorkImageView.setAsyncImage(urlString: model.response.resultUrl)
+    }
+}

+ 62 - 0
AIEmoji/Business/TSGenmojiVC/TSGenmojiGennerateVC/TSGenmojiGennerateViewModel.swift

@@ -0,0 +1,62 @@
+//
+//  Untitled.swift
+//  AIEmoji
+//
+//  Created by 100Years on 2025/1/17.
+//
+
+import Combine
+
+enum TSProgressState {
+    case none
+    case start
+    case pending
+    case progress(CGFloat)
+    case success(Any?)
+    case failed(String)
+}
+
+class TSGenmojiGennerateViewModel {
+   
+    @Published var stateDatauPblished:(TSProgressState,TSGenmojiModel?) = (TSProgressState.none,nil)
+    var aiText:String = ""
+    
+    func creatImageEmoji(text:String) {
+        aiText = text
+        stateDatauPblished = (.start,nil)
+        TSNetworkShared.post(urlType: .imageEmoji,parameters: ["prompt":text]) { data,error in
+            if let dataDict = data as? [String:Any] ,
+               dataDict.safeInt(forKey: "code") == 200,
+               let actionId = dataDict["actionId"] as? Int{
+                self.getActionInfo(action_id:actionId)
+            }else{
+                self.stateDatauPblished = (.failed(error?.localizedDescription ?? ""),nil)
+            }
+        }
+    }
+    
+    func getActionInfo(action_id:Int){
+        TSNetworkShared.get(urlType: .actionInfo,parameters: ["action_id":action_id]) { data,error in
+            if let result = kNetWorkResultSuccess(data: data) {
+                if let genmojiModel = TSGenmojiModel(JSON: result) {
+                    switch genmojiModel.actionStatus {
+                    case .success:
+                        TSToastShared.hideLoading()
+                        self.stateDatauPblished = (.success(nil),genmojiModel)
+                    case .failed:
+                        self.stateDatauPblished = (.failed(kNetWorkMessage(data: data) ?? ""),nil)
+                    default:
+                        kDelayOnMainThread(4.0) {
+                            self.getActionInfo(action_id: action_id)
+                        }
+                    }
+                }
+            }else{
+                self.stateDatauPblished = (.failed(error?.localizedDescription ?? ""),nil)
+            }
+        }
+    }
+    
+}
+
+

+ 59 - 0
AIEmoji/Business/TSGenmojiVC/TSGenmojiVC/Model/TSGenmojiModel.swift

@@ -0,0 +1,59 @@
+//
+//  TSGenmojiModel.swift
+//  AIEmoji
+//
+//  Created by 100Years on 2025/1/16.
+//
+
+import ObjectMapper
+class TSGenmojiModel: TSBaseModel {
+    
+    enum ActionStatus:String ,Equatable {
+        case success = "success"//成功
+        case pending = "pending"//等待
+        case running = "running"//运行
+        case failed = "failed"//失败
+        
+        static func from(_ string: String) -> ActionStatus {
+            return ActionStatus(rawValue: string) ?? .failed
+        }
+    }
+    
+    var id:Int = 0
+    var actionType:String = ""
+    var comments:String = ""
+    var request:String = ""
+    var response:TSGenmojiResponseModel = TSGenmojiResponseModel()
+    var createdTimestamp:Int = 0
+    var status:String = ""
+    var costTime:Int = 0
+    var percent:Int = 0
+    var actionStatus:ActionStatus = .failed
+    
+    
+    override func mapping(map: ObjectMapper.Map) {
+        id           <- map["id"]
+        actionType   <- map["actionType"]
+        comments     <- map["comments"]
+        request      <- map["request"]
+        response           <- (map["response"],JsonStringTransform<TSGenmojiResponseModel>())
+        createdTimestamp   <- map["createdTimestamp"]
+        status     <- map["status"]
+        costTime      <- map["costTime"]
+        percent     <- map["percent"]
+        actionStatus      <- map["actionStatus"]
+        actionStatus = ActionStatus.from(status)
+    }
+}
+
+class TSGenmojiResponseModel : TSBaseModel {
+    var resultUrl:String = ""
+    override func mapping(map: ObjectMapper.Map) {
+        resultUrl           <- map["resultUrl"]
+    }
+}
+
+
+
+
+

+ 118 - 0
AIEmoji/Business/TSGenmojiVC/TSGenmojiVC/TSGenmojiVC.swift

@@ -0,0 +1,118 @@
+//
+//  TSGenmojiVC.swift
+//  AIEmoji
+//
+//  Created by 100Years on 2025/1/15.
+//
+import Alamofire
+class TSGenmojiVC: TSBaseVC {
+
+    var viewModel:TSGenmojiViewModel = TSGenmojiViewModel()
+    
+    lazy var navBarView: TSBaseNavContentBarView = {
+        let navBarView = TSBaseNavContentBarView()
+        
+        let titleImageView = UIImageView.createImageView(imageName: "nav_title_genmoji",contentMode: .scaleToFill)
+        navBarView.barView.addSubview(titleImageView)
+        titleImageView.snp.makeConstraints { make in
+            make.centerY.equalToSuperview()
+            make.left.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)
+        }
+        
+        return navBarView
+    }()
+    
+    
+    lazy var collectionComponent: CollectionViewComponent = {
+        let layout = UICollectionViewFlowLayout()
+        let cp = CollectionViewComponent(frame: CGRect.zero, layout: layout, attributes: [ :])
+        cp.collectionView.contentInset = UIEdgeInsets(top: 0, left: 0, bottom: k_Height_TabBar, right: 0)
+        cp.itemActionHandler = { [weak self] cellCp, indexPath in
+            guard let self = self else { return }
+            if let text = cellCp as? String ,indexPath == IndexPath(item: 0, section: 0) {
+                generateImage(text: text)
+            }
+        }
+        
+        cp.sectionActionHandler = { [weak self] cellCp, indexPath in
+            guard let self = self else { return }
+            
+            if let cmd = cellCp as? String {
+                if cmd == "delete" {
+                    
+                    
+                }
+            }
+        }
+        cp.itemDidSelectedHandler = { [weak self] (object, indexPath) in
+            guard let self = self else { return }
+            
+            if let sections = viewModel.colDataArray.safeObj(At: indexPath.section) as? TSGenmojiCoLSectionModel{
+                var dataModelArray:[TSGenmojiModel] = []
+                for itemModel in sections.items {
+                    dataModelArray.append(itemModel.dataModel)
+                }
+                
+                let browseVC = TSSmallIconBrowseVC()
+                browseVC.dataModelArray = dataModelArray
+                browseVC.currentIndex = indexPath.item
+                kPresentModalVC(target: self, modelVC: browseVC,transitionStyle: .crossDissolve)
+            }
+
+
+        }
+
+        return cp
+    }()
+
+    override func createView() {
+        edgesForExtendedLayout = []
+        navBarContentView.addSubview(navBarView)
+        navBarView.snp.makeConstraints { make in
+            make.edges.equalToSuperview()
+        }
+        
+        contentView.addSubview(collectionComponent.collectionView)
+        collectionComponent.collectionView.snp.makeConstraints { make in
+            make.edges.equalToSuperview()
+        }
+        reloadView()
+    }
+
+    func reloadView(){
+        collectionComponent.clear()
+        collectionComponent.reloadView(with:viewModel.colDataArray)
+    }
+}
+
+
+extension TSGenmojiVC {
+    func generateImage(text:String) {
+        let gennerateVC = TSGenmojiGennerateVC(aiText: text) {[weak self] model in
+            guard let self = self else { return }
+            viewModel.saveModel(model:model)
+            collectionComponent.reloadView(with:viewModel.colDataArray)
+        }
+        
+        kPresentModalVC(target: self, modelVC: gennerateVC,transitionStyle: .crossDissolve)
+    }
+    
+    
+    func browseImage(){
+        
+        
+    }
+}

+ 46 - 0
AIEmoji/Business/TSGenmojiVC/TSGenmojiVC/View/TSGenmojiColSectionView.swift

@@ -0,0 +1,46 @@
+//
+//  TSGenmojiColSectionView.swift
+//  AIEmoji
+//
+//  Created by 100Years on 2025/1/17.
+//
+
+class TSGenmojiColSectionView: TSBaseCollectionnReusableView {
+    
+    static let reuseIdentifier = "TSHomeCollectionReusableView"
+    lazy var leftLab: UILabel = {
+        return UILabel.createLabel(font: .font(size: 16,weight: .medium),textColor: .fromHex("FFFFFF"))
+    }()
+    
+    
+    lazy var delBtn: UIButton = {
+        let delBtn = UIButton.createButton(image: UIImage(named: "delete")){ [weak self]  in
+            guard let self = self else { return }
+            actionHandler(any: "delete")
+        }
+        return delBtn
+    }()
+    
+    override func creatUI() {
+        bgContentView.addSubview(leftLab)
+        leftLab.snp.makeConstraints { make in
+            make.leading.equalTo(16)
+            make.centerY.equalToSuperview()
+        }
+        
+        bgContentView.addSubview(delBtn)
+        delBtn.snp.makeConstraints { make in
+            make.trailing.equalTo(-6)
+            make.width.height.equalTo(40)
+            make.centerY.equalToSuperview()
+        }
+    }
+    
+    override func renderView(with object: Any?, component: CollectionViewComponent, attributes: [String : Any]?) {
+        if let componentReuseViewModel = object as? TSGenmojiColComponentReuseViewModel {
+            leftLab.text = componentReuseViewModel.sectionModel.name
+        }
+    }
+    
+}
+

+ 71 - 0
AIEmoji/Business/TSGenmojiVC/TSGenmojiVC/View/TSGenmojiGennerateCell.swift

@@ -0,0 +1,71 @@
+//
+//  TSGenmojiGennerateCell.swift
+//  AIEmoji
+//
+//  Created by 100Years on 2025/1/17.
+//
+
+class TSGenmojiGennerateCell : TSBaseCollectionCell{
+    lazy var robotImageView: UIImageView = {
+        let robotImageView = UIImageView.createImageView(imageName: "genmoji_robot")
+        return robotImageView
+    }()
+    
+    lazy var customTextView: TSCustomTextView = {
+        let customTextView = TSCustomTextView(
+            placeholder: "Enter your text here...",
+            text: "",
+            font: .font(size: 12),
+            textColor: .white,
+            backgroundColor: "#333333".color,
+            textInsets: UIEdgeInsets(top: 21, left: 16, bottom: 21, right: 16)
+        )
+        customTextView.delegate = self
+        customTextView.layer.cornerRadius = 12
+        return customTextView
+    }()
+    
+    
+    lazy var submitBtn: UIButton = {
+        let submitBtn = kCreateNormalSubmitBtn(title: "Generate".localized) { [weak self]  in
+            guard let self = self else { return }
+            actionHandler(any: customTextView.text)
+        }
+        submitBtn.cornerRadius = 24.0
+        submitBtn.isEnabled = true
+        return submitBtn
+    }()
+    
+    
+    override func creatUI() {
+        
+        contentView.addSubview(robotImageView)
+        robotImageView.snp.makeConstraints { make in
+            make.top.equalTo(0)
+            make.leading.equalTo(0)
+            make.width.height.equalTo(82)
+        }
+        
+        contentView.addSubview(customTextView)
+        customTextView.snp.makeConstraints { make in
+            make.top.equalTo(57)
+            make.leading.equalTo(17)
+            make.trailing.equalTo(-15)
+            make.height.equalTo(182.0*kDesignScale)
+        }
+        
+        contentView.addSubview(submitBtn)
+        submitBtn.snp.makeConstraints { make in
+            make.top.equalTo(customTextView.snp.bottom).offset(16)
+            make.leading.equalTo(16)
+            make.trailing.equalTo(-16)
+            make.height.equalTo(48)
+        }
+    }
+}
+
+extension TSGenmojiGennerateCell: UITextViewDelegate{
+    func textViewDidChange(_ textView: UITextView) {
+        submitBtn.isEnabled = textView.text.count > 0
+    }
+}

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

@@ -0,0 +1,35 @@
+//
+//  TSGenmojiItemCell.swift
+//  AIEmoji
+//
+//  Created by 100Years on 2025/1/17.
+//
+
+class TSGenmojiItemCell: TSBaseCollectionCell {
+    
+    
+    lazy var showImageView: UIImageView = {
+        let showImageView = UIImageView.createImageView(imageName:"")
+        showImageView.backgroundColor = .gray
+        showImageView.layer.cornerRadius = 18
+        return showImageView
+    }()
+    
+    override func creatUI() {
+        contentView.addSubview(showImageView)
+        showImageView.snp.makeConstraints { make in
+            make.top.equalTo(0)
+            make.leading.equalTo(0)
+            make.trailing.bottom.equalTo(0)
+        }
+    }
+    
+    
+    override func renderView(with object: Any?, component: CollectionViewComponent, attributes: [String : Any]?) {
+        super.renderView(with: object, component: component, attributes: attributes)
+        
+        if let itemModel = object as? TSGenmojiCoLItemModel{
+            showImageView.setAsyncImage(urlString: itemModel.dataModel.response.resultUrl)
+        }
+    }
+}

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