Kaynağa Gözat

3.6.23(5)提审

100Years 1 gün önce
ebeveyn
işleme
05065c7311
32 değiştirilmiş dosya ile 241 ekleme ve 124 silme
  1. 2 2
      AIEmoji.xcodeproj/project.pbxproj
  2. 4 0
      AIEmoji/AppDelegate.swift
  3. 0 1
      AIEmoji/Business/TSAILIstVC/TSAIAgeImageHintVC/TSAIListHintBaseVC.swift
  4. 0 52
      AIEmoji/Business/TSAILIstVC/TSAIUploadPhotoBaseVC/TSAIUploadPhotoBaseVC.swift
  5. 2 7
      AIEmoji/Business/TSGenmojiVC/TSGenmojiVC/Model/TSActionInfoModel.swift
  6. 6 0
      AIEmoji/Business/TSGenmojiVC/TSGenmojiVC/Model/TSDBActionInfoModel.swift
  7. 2 1
      AIEmoji/Business/TSPurchaseMembershipVC/TSPurchasePromotionalVC/TSPurchasePromotionalVC+Animation.swift
  8. 34 0
      AIEmoji/Business/TSTabBarController/TSTabBarController.swift
  9. 10 10
      AIEmoji/Business2/DisCover/Data/TSDiscoverViewModel+Data.swift
  10. 3 1
      AIEmoji/Business2/DisCover/Data/TSDiscoverViewModel.swift
  11. 14 2
      AIEmoji/Business2/DisCover/Data/TSFuncStyle.swift
  12. 2 1
      AIEmoji/Business2/DisCover/TSDiscoverVC/Cell/TSDiscoverFullCardCell.swift
  13. 92 19
      AIEmoji/Business2/DisCover/TSDiscoverVC/Cell/TSDiscoverHeaderView.swift
  14. 10 9
      AIEmoji/Business2/DisCover/TSDiscoverVC/TSDiscoverVC.swift
  15. 7 2
      AIEmoji/Business2/DisCover/TSGenerateHistoryVC/TSGenerateHistoryVC.swift
  16. 1 3
      AIEmoji/Business2/DisCover/TSGenerateHistoryVC/View/TSGenerateHistoryCell.swift
  17. 3 3
      AIEmoji/Business2/DisCover/TSPTPUploadImageVC/TSGennertatorStyleVC/TSGennertatorStyleVC.swift
  18. 10 5
      AIEmoji/Business2/DisCover/TSPTPUploadImageVC/TSPTPUploadImageVC+View.swift
  19. 2 1
      AIEmoji/Business2/DisCover/TSPTPUploadImageVC/View/TSUploadImageView.swift
  20. 1 1
      AIEmoji/Business2/DisCover/TSPTPUploadImageVC/View/TSUploadVideoView.swift
  21. 1 1
      AIEmoji/Common/Purchase/TSPurchaseManager.swift
  22. 2 1
      AIEmoji/Common/TSRealmManager/TSRealmManager.swift
  23. 10 2
      AIEmoji/Common/Tool/OperationQueue/V2/TSGenerateBasePhotoOperation.swift
  24. 3 0
      AIEmoji/de.lproj/Localizable.strings
  25. 1 0
      AIEmoji/en.lproj/Localizable.strings
  26. 3 0
      AIEmoji/es.lproj/Localizable.strings
  27. 3 0
      AIEmoji/ja.lproj/Localizable.strings
  28. 2 0
      AIEmoji/ko.lproj/Localizable.strings
  29. 3 0
      AIEmoji/pt-BR.lproj/Localizable.strings
  30. 3 0
      AIEmoji/pt-PT.lproj/Localizable.strings
  31. 2 0
      AIEmoji/zh-Hans.lproj/Localizable.strings
  32. 3 0
      AIEmoji/zh-Hant.lproj/Localizable.strings

+ 2 - 2
AIEmoji.xcodeproj/project.pbxproj

@@ -2988,7 +2988,7 @@
 				ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor;
 				CLANG_ENABLE_MODULES = YES;
 				CODE_SIGN_STYLE = Automatic;
-				CURRENT_PROJECT_VERSION = 2;
+				CURRENT_PROJECT_VERSION = 5;
 				DEVELOPMENT_TEAM = 65UD255J84;
 				ENABLE_USER_SCRIPT_SANDBOXING = NO;
 				GENERATE_INFOPLIST_FILE = YES;
@@ -3027,7 +3027,7 @@
 				ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor;
 				CLANG_ENABLE_MODULES = YES;
 				CODE_SIGN_STYLE = Automatic;
-				CURRENT_PROJECT_VERSION = 2;
+				CURRENT_PROJECT_VERSION = 5;
 				DEVELOPMENT_TEAM = 65UD255J84;
 				ENABLE_USER_SCRIPT_SANDBOXING = NO;
 				GENERATE_INFOPLIST_FILE = YES;

+ 4 - 0
AIEmoji/AppDelegate.swift

@@ -9,11 +9,15 @@ import UIKit
 var kAppNewVerison = ""
 @main
 class AppDelegate: UIResponder, UIApplicationDelegate {
+    
+    static var shared:AppDelegate?
     static var tabbar:TSTabBarController?
+    
     var window: UIWindow?
     var backgroundTaskIdentifier: UIBackgroundTaskIdentifier = .invalid
 
     func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
+        AppDelegate.shared = self
         window = UIWindow(frame: UIScreen.main.bounds)
         window?.backgroundColor = UIColor.black
         window?.makeKeyAndVisible()

+ 0 - 1
AIEmoji/Business/TSAILIstVC/TSAIAgeImageHintVC/TSAIListHintBaseVC.swift

@@ -310,7 +310,6 @@ class TSAIListHintBaseVC: TSBaseVC {
         get {
             return UserDefaults.standard.string(forKey: userDefaultsKey) == nil
         }
-        
         set {
             UserDefaults.standard.set(newValue ? nil : "1", forKey: userDefaultsKey)
             UserDefaults.standard.synchronize()

+ 0 - 52
AIEmoji/Business/TSAILIstVC/TSAIUploadPhotoBaseVC/TSAIUploadPhotoBaseVC.swift

@@ -387,56 +387,4 @@ extension TSAIUploadPhotoBaseVC {
             break;
         }
     }
-
 }
-
-
-//extension TSAIUploadPhotoBaseVC{
-//    
-//    func enterSelectPhotos(userDefaultsKey:String,maxBitSize:Int,config:TSAIListHintBaseVC.Config,complete: @escaping (UIImage)->Void){
-//        if userDefaultsKey.count == 0 {
-//            self.pickSinglePhoto(maxBitSize:maxBitSize,complete:complete)
-//        }else{
-//            TSAIListHintBaseVC.userDefaultsKey = userDefaultsKey
-//            if TSAIListHintBaseVC.isShowUploadImageHint{
-//                TSAIListHintBaseVC.isShowUploadImageHint = false
-//                self.presentModalHintVC(config:config,complete:complete)
-//            }else {
-//                self.pickSinglePhoto(maxBitSize:maxBitSize,complete:complete)
-//            }
-//        }
-//    }
-//    
-//    
-//    func presentModalHintVC(config:TSAIListHintBaseVC.Config,complete:@escaping (UIImage)->Void){
-//        hintBaseVC = TSAIListHintBaseVC(config: config) { [weak self] image in
-//            guard let self = self else { return }
-//            if let image = image {
-//                complete(image)
-//            }else{
-//                dePrint("图片异常")
-//            }
-//            kDelayMainShort {
-//                self.hintBaseVC.dismissPageVC()
-//            }
-//        }
-//        kPresentModalVC(target: self, modelVC: hintBaseVC,transitionStyle: .crossDissolve)
-//    }
-//    
-//    func pickSinglePhoto(maxBitSize:Int,complete: @escaping (UIImage)->Void)  {
-//        photoPickerManager.pickCustomSinglePhoto() { [weak self] image, errorString in
-//            guard let self = self else { return }
-//            if let errorString = errorString {
-//                TSToastShared.showToast(text: errorString)
-//            }else if let image = image {
-//                complete(image)
-//            }else{
-//                dePrint("图片异常")
-//            }
-//            kDelayMainShort {
-//                self.photoPickerManager.dismissPageVC()
-//            }
-//            
-//        }
-//    }
-//}

+ 2 - 7
AIEmoji/Business/TSGenmojiVC/TSGenmojiVC/Model/TSActionInfoModel.swift

@@ -114,6 +114,7 @@ class TSActionRequestModel : TSBaseModel {
     var model:String = ""   //决定生图的模型
     var generatorStyle:TSFuncStyle = .ptp
     
+    var template:String = ""
     override func mapping(map: ObjectMapper.Map) {
         prompt              <- map["prompt"]
         inputText           <- map["inputText"]
@@ -127,16 +128,10 @@ class TSActionRequestModel : TSBaseModel {
         advance             <- map["advance"]
         model               <- map["model"]
         generatorStyle      <- map["generatorStyle"]
+        template            <- map["template"]
     }
     
     
-    
-    
-    
-    
-    
-    
-    
     var style:String = ""
     var advance:Bool = false//决定生图的模型
 }

+ 6 - 0
AIEmoji/Business/TSGenmojiVC/TSGenmojiVC/Model/TSDBActionInfoModel.swift

@@ -156,6 +156,8 @@ class TSDBActionRequestModel : Object {
     @Persisted var model:String = ""  //模型
     @Persisted var generatorStyle:Int = 15
     
+    @Persisted var template:String = ""
+    
     static func createDBModel(requestModel:TSActionRequestModel) -> TSDBActionRequestModel{
         let dbModel = TSDBActionRequestModel()
         dbModel.saveData(requestModel: requestModel)
@@ -179,6 +181,9 @@ class TSDBActionRequestModel : Object {
         let list = List<String>()
         list.append(objectsIn: requestModel.imageUrls)
         self.imageUrls = list
+        
+        
+        self.template = requestModel.template
     }
     
     
@@ -198,6 +203,7 @@ class TSDBActionRequestModel : Object {
         model.model = self.model
         model.generatorStyle = TSFuncStyle(rawValue: self.generatorStyle) ?? .ptp
         
+        model.template = self.template
         return model
     }
 

+ 2 - 1
AIEmoji/Business/TSPurchaseMembershipVC/TSPurchasePromotionalVC/TSPurchasePromotionalVC+Animation.swift

@@ -59,8 +59,9 @@ extension TSPurchasePromotionalVC {
 
         kMainShort(){
             self.animationLab.setNeedsLayout()
+            self.animationLab.alpha = 1
             self.animationLab.applyGradient(colors: ["#FA794F".uiColor,"#F8C32A".uiColor,"#FEFBF4".uiColor])
-            
+            self.animationLab.alpha = 0.0
             kMainAfter(0.5) {
                 self.apngImageView.startAnimating()
                 UIView.animate(withDuration: 0.8) {

+ 34 - 0
AIEmoji/Business/TSTabBarController/TSTabBarController.swift

@@ -86,6 +86,8 @@ class TSTabBarController: UITabBarController {
             view.addSubview(tabBar)
             traitOverrides.horizontalSizeClass = .compact
         }
+        
+        setupDoubleTapToScrollTop()
     }
 
     private func tabBarItem(title: String, image: UIImage?, selectedImage: UIImage?, tag: Int) -> UITabBarItem {
@@ -205,3 +207,35 @@ extension TSTabBarController:UITabBarControllerDelegate {
 //        }
     }
 }
+
+
+
+protocol TSTabBarControllerProtocol {
+    func tabBarDoubleTap(_ tabbar: UITabBarController)
+}
+
+extension TSTabBarController {
+    func setupDoubleTapToScrollTop() {
+        let doubleTap = UITapGestureRecognizer(target: self, action: #selector(handleDoubleTap(_:)))
+        doubleTap.numberOfTapsRequired = 2
+        doubleTap.delaysTouchesBegan = false  // 默认是true,会延迟单击响应
+        doubleTap.delaysTouchesEnded = false
+        tabBar.addGestureRecognizer(doubleTap)
+    }
+
+    @objc private func handleDoubleTap(_ gesture: UITapGestureRecognizer) {
+        guard gesture.state == .ended else { return }
+        guard let vc = selectedViewController else { return }
+        
+        if let vc = vc as? TSTabBarControllerProtocol{
+            vc.tabBarDoubleTap(self)
+        }else if let nav = vc as? UINavigationController {
+            if let topVC = nav.topViewController {
+                
+                if let vc = topVC as? TSTabBarControllerProtocol{
+                    vc.tabBarDoubleTap(self)
+                }
+            }
+        }
+    }
+}

+ 10 - 10
AIEmoji/Business2/DisCover/Data/TSDiscoverViewModel+Data.swift

@@ -34,7 +34,7 @@ class TSDiscoverViewModel {
     lazy var videoEffectSection: TSDiscoverSectionModel = {
         let section = TSDiscoverSectionModel()
         section.style = .styleMore
-        section.setTitle(title: "🎞️ " + "Video Effect".localized,colors: ["#E7D1AB","#FFFFFF"])
+        section.setTitle(title:"Video Effect".localized,imageNamed: "🎞️",colors: ["#E7D1AB","#FFFFFF"])
         section.items = [[
             TSDiscoverItemModel(style: .videoV2,
                                 viewModel: TSDiscoverAnimationItemVM(title: "",style: .video, imageNameds: ["Mermaid.mp4"]),
@@ -121,7 +121,7 @@ class TSDiscoverViewModel {
     lazy var popularStylesSection: TSDiscoverSectionModel = {
         let section = TSDiscoverSectionModel()
         section.style = .styleMore
-        section.setTitle(title: "🔥 " + "Popular".localized,colors: ["#EF2C00","#FEFEE7"])
+        section.setTitle(title:"Popular".localized,imageNamed: "🔥",colors: ["#EF2C00","#FEFEE7"])
         section.items = [[
             TSDiscoverItemModel(style: .ptp,
                                 viewModel: TSDiscoverAnimationItemVM(title: "", imageNameds: ["discover_0_ToonMe","discover_1_ToonMe"]),
@@ -187,7 +187,7 @@ class TSDiscoverViewModel {
     lazy var figuresToysSection: TSDiscoverSectionModel = {
         let section = TSDiscoverSectionModel()
         section.style = .styleMore
-        section.setTitle(title: "🧸 " + "Figures&Toys".localized,colors: ["#D7A863","#FFFFFF"])
+        section.setTitle(title:"Figures&Toys".localized,imageNamed: "🧸",colors: ["#D7A863","#FFFFFF"])
         section.items = [[
             TSDiscoverItemModel(style: .ptp,
                                 
@@ -254,7 +254,7 @@ class TSDiscoverViewModel {
     lazy var coolPersonalitySection: TSDiscoverSectionModel = {
         let section = TSDiscoverSectionModel()
         section.style = .styleMore
-        section.setTitle(title: "🔮 " + "Cool Personality".localized,colors: ["#DB6BE6","#FFFFFF"])
+        section.setTitle(title:"Cool Personality".localized,imageNamed: "🔮",colors: ["#DB6BE6","#FFFFFF"])
         section.items = [[
             TSDiscoverItemModel(style: .ptp,
                                 
@@ -285,7 +285,7 @@ class TSDiscoverViewModel {
     lazy var animeCartoonSection: TSDiscoverSectionModel = {
         let section = TSDiscoverSectionModel()
         section.style = .styleMore
-        section.setTitle(title: "🧚🏻‍♀️ " + "Anime&Cartoon".localized,colors: ["#A4EAD4","#FFFFFF"])
+        section.setTitle(title:"Anime&Cartoon".localized,imageNamed: "🧚🏻‍♀️",colors: ["#A4EAD4","#FFFFFF"])
         section.items = [[
             TSDiscoverItemModel(style: .ptp,
                                 viewModel: TSDiscoverAnimationItemVM(title: "", imageNameds: ["discover_0_AnimalCrossing","discover_1_AnimalCrossing"]),
@@ -365,7 +365,7 @@ class TSDiscoverViewModel {
     lazy var trendingSection: TSDiscoverSectionModel = {
         let section = TSDiscoverSectionModel()
         section.style = .styleMore
-        section.setTitle(title: "🚀 " + "Trending".localized,colors: ["#4887BB","#FFFFFF"])
+        section.setTitle(title:"Trending".localized,imageNamed:"🚀",colors: ["#4887BB","#FFFFFF"])
         section.items = [[
             TSDiscoverItemModel(style: .ptp,
                                 viewModel: TSDiscoverAnimationItemVM(title: "", imageNameds: ["discover_0_Fairy","discover_1_Fairy"]),
@@ -397,7 +397,7 @@ class TSDiscoverViewModel {
     lazy var processPhotoSection: TSDiscoverSectionModel = {
         let section = TSDiscoverSectionModel()
         section.style = .styleMore
-        section.setTitle(title: "🎨 " + "Process Photo".localized,colors: ["#DEA94E","#FFFFFF"])
+        section.setTitle(title:"Process Photo".localized,imageNamed:"🚀",colors: ["#DEA94E","#FFFFFF"])
         section.items = [[
             TSDiscoverItemModel(style: .photoLive,
                                 viewModel: TSDiscoverAnimationItemVM(title: "",style: .gif, imageNameds: ["discover_0_AnimatePhoto1"]),
@@ -446,7 +446,7 @@ class TSDiscoverViewModel {
     lazy var artFilterSection: TSDiscoverSectionModel = {
         let section = TSDiscoverSectionModel()
         section.style = .styleMore
-        section.setTitle(title: "🖼️ " + "Art Filter".localized,colors: ["#6CCC2B","#FFFFFF"])
+        section.setTitle(title:"Art Filter".localized,imageNamed:"🖼️",colors: ["#6CCC2B","#FFFFFF"])
         section.items = [[
             TSDiscoverItemModel(style: .ptp,
                                 viewModel: TSDiscoverAnimationItemVM(title: "", imageNameds: ["discover_0_OilPainting","discover_1_OilPainting"]),
@@ -480,7 +480,7 @@ class TSDiscoverViewModel {
     lazy var bePrettySection: TSDiscoverSectionModel = {
         let section = TSDiscoverSectionModel()
         section.style = .styleMore
-        section.setTitle(title: "🥰  " + "Be Pretty".localized,colors: ["#FFA537","#FFFFFF"])
+        section.setTitle(title:"Be Pretty".localized,imageNamed:"🥰",colors: ["#FFA537","#FFFFFF"])
         section.items = [[
             TSDiscoverItemModel(style: .changehair,
                                 viewModel: TSDiscoverAnimationItemVM(title: "", imageNameds: ["discover_0_HairSalon","discover_1_HairSalon","discover_2_HairSalon"]),
@@ -514,7 +514,7 @@ class TSDiscoverViewModel {
     lazy var oldAgeCardSection: TSDiscoverSectionModel = {
         let section = TSDiscoverSectionModel()
         section.style = .fullCard
-        section.setTitle(title: "🪄  " + "More AI Tools".localized,colors: ["#FFFF73","#FFFFFF"])
+        section.setTitle(title:"More AI Tools".localized,imageNamed:"🪄",colors: ["#FFFF73","#FFFFFF"])
         section.items = [
             TSDiscoverItemModel(style: .ageOld,
                                 viewModel: TSDiscoverBaseItemVM(

+ 3 - 1
AIEmoji/Business2/DisCover/Data/TSDiscoverViewModel.swift

@@ -85,12 +85,14 @@ class TSDiscoverAnimationItemVM:TSDiscoverBaseItemVM{
 let kDiscoverSectionH = 56.0
 
 class TSDiscoverSectionModel {
+    var imageNamed:String = ""
     var title:String = ""
     var colors:[String] = []
     var style:TSDiscoverViewStyle = .styleMore
     var items:[Any] = []
-    func setTitle(title:String,colors:[String] = []) {
+    func setTitle(title:String,imageNamed:String = "",colors:[String] = []) {
         self.title = title
+        self.imageNamed = imageNamed
         self.colors = colors
     }
 }

+ 14 - 2
AIEmoji/Business2/DisCover/Data/TSFuncStyle.swift

@@ -49,7 +49,11 @@ enum TSFuncStyle:Int,Equatable,CaseIterable {
         }
     }
     
-    var userDefaultsKey:String{
+//    var userDefaultsKey:String{
+//
+//    }
+
+    func getHintKey(hintType:Int)->String {
         switch self {
         case .ageOld:
             return "isFirstAIListAgeOldHintVC"
@@ -79,12 +83,14 @@ enum TSFuncStyle:Int,Equatable,CaseIterable {
             return "isFirstAIChangeHairColor"
         case .changehair:
             return "isFirstAIChangeHair"
+        case .videoV2:
+            return "isFirstFunc\(self.rawValue))" + "_hintType\(hintType)"
         default:
             return "isFirstFunc\(self.rawValue))"
         }
     }
     
-    var config:TSAIListHintBaseVC.Config{
+    func getConfig(hintType:Int)->TSAIListHintBaseVC.Config {
         switch self {
         case .ageOld:
             return .defaultConfig
@@ -108,11 +114,17 @@ enum TSFuncStyle:Int,Equatable,CaseIterable {
             return .catTohumanConfig
         case .futureBaby:
             return .futureBabyConfig
+        case .videoV2:
+            return TSAIListHintBaseVC.Config.getConfig(hint: hintType)
         default:
             return .defaultConfig
         }
     }
     
+//    var config:TSAIListHintBaseVC.Config{
+//       
+//    }
+    
     var advance:Bool{
         switch self {
         case .catTohuman,.motherDay,.futureBaby:

+ 2 - 1
AIEmoji/Business2/DisCover/TSDiscoverVC/Cell/TSDiscoverFullCardCell.swift

@@ -92,8 +92,9 @@ class TSDiscoverFullCardCell : TSDiscoverBaseCell {
         
         tryNowBtn.snp.makeConstraints { make in
             make.trailing.equalTo(-16.0)
-            make.top.equalTo(textLabel.snp.top)
+//            make.top.equalTo(textLabel.snp.top)
             make.height.equalTo(24)
+            make.bottom.equalTo(-20)
         }
     }
     

+ 92 - 19
AIEmoji/Business2/DisCover/TSDiscoverVC/Cell/TSDiscoverHeaderView.swift

@@ -4,52 +4,125 @@
 //
 //  Created by 100Years on 2025/6/23.
 //
-
+import Shimmer
 class TSDiscoverHeaderView: UICollectionReusableView {
     
+    override init(frame: CGRect) {
+        super.init(frame: frame)
+        creatUI()
+    }
+    
+    required init?(coder: NSCoder) {
+        fatalError("init(coder:) has not been implemented")
+    }
+    
     var clickBlock:((TSDiscoverSectionModel)->Void)?
     var sectionModel:TSDiscoverSectionModel = TSDiscoverSectionModel(){
         didSet{
-            moreView.titleLab.text = sectionModel.title.localized
-            moreView.moreView.isHidden = sectionModel.style != .styleMore
+            imageLab.text = sectionModel.imageNamed
+            titleLab.text = sectionModel.title.localized
+            moreView.isHidden = sectionModel.style != .styleMore
             
             if sectionModel.colors.count == 1 {
-                moreView.titleLab.textColor = sectionModel.colors.first?.toColor()
+                titleLab.textColor = sectionModel.colors.first?.toColor()
             }else if sectionModel.colors.count > 1 {
                 var colors:[UIColor] = []
                 for colorString in self.sectionModel.colors {
                     colors.append(colorString.uiColor)
                 }
+                
                 kMainAsync {
-                    self.moreView.titleLab.applyGradient(colors: colors)
+                    self.titleLab.applyGradient(colors: colors)
                 }
             }
         }
     }
     
-    lazy var moreView: TSTitleMoreView = {
-        let moreView = TSTitleMoreView(isAnimationArrow: true) { [weak self]  in
-            guard let self = self else { return }
-            clickBlock?(sectionModel)
-        }
-        return moreView
+
+    static let viewH:CGFloat = kSectionTitleViewH
+    let viewH:CGFloat = TSTitleView.viewH
+    
+    
+    lazy var imageLab: UILabel = {
+        let imageLab = UILabel.createLabel(font: .font(size: 16,weight: .medium),textColor: .fromHex("FFFFFF"))
+        return imageLab
     }()
     
+    lazy var titleLab: UILabel = {
+        let titleLab = UILabel.createLabel(font: .font(size: 16,weight: .medium),textColor: .fromHex("FFFFFF"))
+        return titleLab
+    }()
     
-    override init(frame: CGRect) {
-        super.init(frame: frame)
-        creatUI()
-    }
+    lazy var imageView:UIImageView = {
+        let imageView = UIImageView.createImageView(image:.whiteRightArrow.withRenderingMode(.alwaysTemplate))
+        imageView.tintColor = .themeColor
+        return imageView
+    }()
     
-    required init?(coder: NSCoder) {
-        fatalError("init(coder:) has not been implemented")
-    }
     
+    lazy var rightLabel: UILabel = {
+        let label = UILabel.createLabel(text: "See all".localized,font: .font(size: 12),textColor: .white.withAlphaComponent(0.8))
+        label.textColor = .themeColor
+        return label
+    }()
     
+    lazy var moreView: UIView = {
+        let moreView = UIView()
+        moreView.addGestureRecognizer(UITapGestureRecognizer(target: self, action: #selector(clickMoreView)))
+        moreView.addSubview(rightLabel)
+        rightLabel.snp.makeConstraints { make in
+            make.leading.top.bottom.equalTo(0)
+        }
+        moreView.addSubview(imageView)
+        imageView.snp.makeConstraints { make in
+            make.trailing.top.bottom.equalTo(0)
+            make.leading.equalTo(rightLabel.snp.trailing)
+        }
+        
+        return moreView
+    }()
+
     func creatUI() {
-        addSubview(moreView)
+        addSubview(imageLab)
+        imageLab.snp.makeConstraints { make in
+            make.leading.equalTo(16)
+            make.centerY.equalToSuperview().offset(kSectionTitleViewCenterYOffset)
+        }
+        
+        addSubview(titleLab)
+        titleLab.snp.makeConstraints { make in
+            make.leading.equalTo(imageLab.snp.trailing).offset(8)
+            make.centerY.equalTo(imageLab)
+        }
+        
+        setNeedsLayout()
+        setNeedsDisplay()
+        
+        let shimmerView = FBShimmeringView()
+        shimmerView.contentView = moreView
+        shimmerView.shimmeringSpeed = 150
+//        shimmerView.shimmeringOpacity = 0.3
+//        shimmerView.shimmeringAnimationOpacity = 1.0
+        addSubview(shimmerView)
+        shimmerView.snp.makeConstraints { make in
+            make.trailing.equalTo(-6)//16
+            make.centerY.equalTo(titleLab)
+        }
+        
         moreView.snp.makeConstraints { make in
             make.edges.equalToSuperview()
         }
+        
+        shimmerView.isShimmering = true // 开启扫光效果
+//        addSubview(moreView)
+//        moreView.snp.makeConstraints { make in
+//            make.edges.equalToSuperview()
+//        }
     }
+    
+    
+    @objc private func clickMoreView() {
+        clickBlock?(sectionModel)
+    }
+    
 }

+ 10 - 9
AIEmoji/Business2/DisCover/TSDiscoverVC/TSDiscoverVC.swift

@@ -38,6 +38,7 @@ class TSDiscoverVC: TSBaseVC {
         let navBarView = TSBaseNavContentBarView()
 
         let label = UILabel.createLabel(text: "Discover".localized,font: .font(size: 22,weight: .semibold),textColor: .white)
+        label.addShadow(shadowColor: UIColor.black.cgColor, shadowOffset: CGSize(width: 2, height: 2), shadowRadius: 2, shadowOpacity: 0.3)
         navBarView.barView.addSubview(label)
         label.snp.makeConstraints { make in
             make.centerY.equalToSuperview()
@@ -326,20 +327,14 @@ extension TSDiscoverVC{
     static var photoPickerManager:TSPhotoPickerManager?
     
     static func enterSelectPhotos(target:UIViewController,style:TSFuncStyle,hintType:Int = 0,complete: @escaping (UIImage)->Void){
-        if style.userDefaultsKey.count == 0 || style == .ptp {
+        let userDefaultsKey = style.getHintKey(hintType: hintType)
+        if userDefaultsKey.count == 0 || style == .ptp {
             self.pickSinglePhoto(target:target,complete:complete)
         }else{
-            var config = style.config
-            var userDefaultsKey = style.userDefaultsKey
-            if style == .videoV2 || style == .photoLive {
-                config = TSAIListHintBaseVC.Config.getConfig(hint: hintType)
-                userDefaultsKey = userDefaultsKey + "_hintType\(hintType)"
-            }
-            
             TSAIListHintBaseVC.userDefaultsKey = userDefaultsKey
             if TSAIListHintBaseVC.isShowUploadImageHint{
                 TSAIListHintBaseVC.isShowUploadImageHint = false
-                self.presentModalHintVC(target:target,config:config,complete:complete)
+                self.presentModalHintVC(target:target,config:style.getConfig(hintType: hintType),complete:complete)
             }else {
                 self.pickSinglePhoto(target:target,complete:complete)
             }
@@ -384,3 +379,9 @@ extension TSDiscoverVC{
         Self.photoPickerManager = photoPickerManager
     }
 }
+
+extension TSDiscoverVC:TSTabBarControllerProtocol {
+    func tabBarDoubleTap(_ tabbar: UITabBarController){
+        collectionView.setContentOffset(CGPoint(x: 0, y: 0), animated: true)
+    }
+}

+ 7 - 2
AIEmoji/Business2/DisCover/TSGenerateHistoryVC/TSGenerateHistoryVC.swift

@@ -38,6 +38,7 @@ class TSGenerateHistoryVC: TSBaseVC {
         let navBarView = TSBaseNavContentBarView()
 
         let label = UILabel.createLabel(text: "Creations".localized,font: .font(size: 22,weight: .semibold),textColor: .white)
+        label.addShadow(shadowColor: UIColor.black.cgColor, shadowOffset: CGSize(width: 2, height: 2), shadowRadius: 2, shadowOpacity: 0.3)
         navBarView.barView.addSubview(label)
         label.snp.makeConstraints { make in
             make.centerY.equalToSuperview()
@@ -306,9 +307,13 @@ extension TSGenerateHistoryVC{
     }
 }
 extension TSGenerateHistoryVC{
-
     static func showPosition(){
         AppDelegate.tabbar?.changeSelectedIndex(index: 1)
     }
-    
+}
+
+extension TSGenerateHistoryVC:TSTabBarControllerProtocol {
+    func tabBarDoubleTap(_ tabbar: UITabBarController){
+        collectionView.setContentOffset(CGPoint(x: 0, y: 0), animated: true)
+    }
 }

+ 1 - 3
AIEmoji/Business2/DisCover/TSGenerateHistoryVC/View/TSGenerateHistoryCell.swift

@@ -163,9 +163,7 @@ class TSGenerateHistoryCell: TSBaseCollectionCell {
         kMainAfter(kVideoDelayedPlay) {
             if self.isCellDisplay {
                 self.setVideoPlayer()
-//                dePrint("UICollectionViewCell 视频播放")
             }else{
-//                dePrint("UICollectionViewCell self.isDisplay 不可见了")
                 self.videoPlayer?.pause()
             }
         }
@@ -174,7 +172,6 @@ class TSGenerateHistoryCell: TSBaseCollectionCell {
     override func didEndDisplaying(indexPath: IndexPath)  {
         super.didEndDisplaying(indexPath: indexPath)
         videoPlayer?.pause()
-//        dePrint("UICollectionViewCell 视频暂停")
     }
     
     func setVideoPlayer(){
@@ -203,6 +200,7 @@ extension TSGenerateHistoryCell {
             model.actionStatus = .success
         }
         showImageView.image = nil
+        self.videoURL = nil
         //dePrint("updataActionInfoModelView model.actionStatus 收到 = \(model.actionStatus)")
         switch model.actionStatus {
         case .pending,.running:

+ 3 - 3
AIEmoji/Business2/DisCover/TSPTPUploadImageVC/TSGennertatorStyleVC/TSGennertatorStyleVC.swift

@@ -177,20 +177,20 @@ extension TSGennertatorStyleVC: UIScrollViewDelegate {
     func scrollViewDidEndDragging(_ scrollView: UIScrollView, willDecelerate decelerate: Bool) {
         if !decelerate {
             print("滚动完全停止(无减速动画)")
+            scrollHandle?(false)
         }
-        scrollHandle?(false)
     }
     
     // 结束减速(滚动完全停止)
     func scrollViewDidEndDecelerating(_ scrollView: UIScrollView) {
         print("滚动完全停止")
-//        scrollHandle?(false)
+        scrollHandle?(false)
     }
     
     // 以下方法组合可以准确判断滚动是否真正结束
     func scrollViewDidEndScrollingAnimation(_ scrollView: UIScrollView) {
         print("编程触发的滚动动画结束")
-//        scrollHandle?(false)
+        scrollHandle?(false)
     }
 }
 

+ 10 - 5
AIEmoji/Business2/DisCover/TSPTPUploadImageVC/TSPTPUploadImageVC+View.swift

@@ -14,6 +14,10 @@ extension TSPTPUploadImageVC {
             guard let self = self else { return }
             pickSinglePhoto()
         }
+        uploadImageView.clickDeleteBlock = { [weak self]  in
+            guard let self = self else { return }
+            viewModel.upLoadImage = nil
+        }
         return uploadImageView
     }
     
@@ -27,10 +31,7 @@ extension TSPTPUploadImageVC {
             viewModel.selectedStyleIndex = indexPath.item
             
             setTitleText(model.imageText.localized)
-            
-            if viewModel.upLoadImage != nil {
-                return
-            }
+
             if viewModel.style == .videoV2 ||  viewModel.style == .photoLive{
                 var array:[TSDiscoverItemModel] = []
                 if let arr = TSDiscoverViewModel.shared.bannerSection.items.first as? [TSDiscoverItemModel] {
@@ -46,7 +47,11 @@ extension TSPTPUploadImageVC {
                    let animationItemVM = discoverItemModel.viewModel as? TSDiscoverAnimationItemVM,
                    let imageNamed = animationItemVM.imageNameds.first{
                     self.uploadView.uploadVideoView.setVideoName(name: imageNamed)
-                    self.uploadView.uploadVideoView.play()
+                    
+                    if viewModel.upLoadImage == nil {
+                        self.uploadView.uploadVideoView.play()
+                    }
+                    
                 }
             }
     

+ 2 - 1
AIEmoji/Business2/DisCover/TSPTPUploadImageVC/View/TSUploadImageView.swift

@@ -8,7 +8,7 @@
 class TSUploadImageView: TSBaseView {
     
     var clickBgViewBlock:(()->Void)?
-    
+    var clickDeleteBlock:(()->Void)?
     var upLoadImage:UIImage? = nil {
         didSet{
             if let image = upLoadImage {
@@ -105,6 +105,7 @@ class TSUploadImageView: TSBaseView {
         let deleteBtn = UIButton.createButton(backgroundImage: UIImage(named: "delete_redRound")) { [weak self]  in
             guard let self = self else { return }
             upLoadImage = nil
+            clickDeleteBlock?()
         }
         deleteBtn.isHidden = true
         return deleteBtn

+ 1 - 1
AIEmoji/Business2/DisCover/TSPTPUploadImageVC/View/TSUploadVideoView.swift

@@ -92,7 +92,7 @@ class TSUploadVideoView: TSBaseView {
         self.videoPlayer?.playerLayer?.videoGravity = .resizeAspect
         self.videoPlayer?.player?.isMuted = false
         self.videoPlayer?.addPlayerLayer(to: videoContent, frame: self.videoContent.bounds)
-        self.videoPlayer?.play()
+//        self.videoPlayer?.play()
     }
     
     func play() {

+ 1 - 1
AIEmoji/Common/Purchase/TSPurchaseManager.swift

@@ -281,7 +281,7 @@ public class PurchaseManager: NSObject {
 
     public var vipType: PremiumPeriod {
 #if DEBUG
-        return PremiumPeriod.year
+        return PremiumPeriod.none
 #endif
         guard isVip, let type = vipInformation["type"] as? String else {
             return .none

+ 2 - 1
AIEmoji/Common/TSRealmManager/TSRealmManager.swift

@@ -18,9 +18,10 @@ class TSRealmManager {
          2.1 ->3    //新增ai思考
          3.6.1  ->4   //将UserDefaults 的历史记录迁移到数据库中
          ui大改版 - >5
+         3.6.23 - >7
          **/
    
-        let newSchemaVersion: UInt64 = 6
+        let newSchemaVersion: UInt64 = 7
         // 获取默认配置
         var config = Realm.Configuration.defaultConfiguration
         // 设置新版本号

+ 10 - 2
AIEmoji/Common/Tool/OperationQueue/V2/TSGenerateBasePhotoOperation.swift

@@ -70,9 +70,10 @@ class TSGenerateBasePhotoOperation: TSGenerateBaseOperation , @unchecked Sendabl
         kPurchaseDefault.useOnceForFree(type: currentActionInfoModel.request.generatorStyle.vipFreeNumType)
         saveDataDB()
 
-        //生成成功后,不再提示用户上传规则弹窗
+//        //生成成功后,不再提示用户上传规则弹窗
 //        UserDefaults.standard.set("1", forKey: currentActionInfoModel.request.generatorStyle.userDefaultsKey)
 //        UserDefaults.standard.synchronize()
+        
         showSuccessView()
     }
     
@@ -131,6 +132,7 @@ class TSGenerateBasePhotoOperation: TSGenerateBaseOperation , @unchecked Sendabl
         infoModel.request.inputText = generateStyleModel.inputText
         infoModel.request.generatorStyle = generateStyleModel.generatorStyle
         infoModel.request.model = generateStyleModel.model
+        infoModel.request.template = generateStyleModel.prompt
         return infoModel
     }
     
@@ -350,7 +352,13 @@ extension TSGenerateBasePhotoOperation {
         case .videoV2:
             guard request.imageUrls.count > 0 else { return nil}
             urlType = .videoV2
-            postDict = ["template":request.prompt,
+            
+            var template = request.template
+            if template.isEmpty {
+                template = request.prompt
+            }
+            
+            postDict = ["template":template,
                         "bgm": true,
                         "imageUrls":request.imageUrls
                         ]

+ 3 - 0
AIEmoji/de.lproj/Localizable.strings

@@ -526,3 +526,6 @@
 "Close-up photo from shoulders upward" = "Nahaufnahme von den Schultern aufwärts";
 "No visible clothing" = "Keine sichtbare Kleidung";
 "Covered or unclear face, full-body photo" = "Verdecktes oder unscharfes Gesicht, Ganzkörperfoto";
+
+
+"Video Effect" = "Video-Effekt";

+ 1 - 0
AIEmoji/en.lproj/Localizable.strings

@@ -526,3 +526,4 @@
 "Covered or unclear face, full-body photo" = "Covered or unclear face, full-body photo";
 
 
+"Video Effect" = "Video Effect";

+ 3 - 0
AIEmoji/es.lproj/Localizable.strings

@@ -524,3 +524,6 @@
 "Close-up photo from shoulders upward" = "Fotografía de primer plano desde los hombros hacia arriba.";
 "No visible clothing" = "No se ve ropa";
 "Covered or unclear face, full-body photo" = "Foto de cuerpo entero con cara cubierta o poco clara";
+
+
+"Video Effect" = "Efecto de video";

+ 3 - 0
AIEmoji/ja.lproj/Localizable.strings

@@ -523,3 +523,6 @@
 "Close-up photo from shoulders upward" = "肩から上のクローズアップ写真";
 "No visible clothing" = "衣服が見えないこと";
 "Covered or unclear face, full-body photo" = "顔が隠れているか不明瞭な全身写真";
+
+
+"Video Effect" = "ビデオエフェクト";

+ 2 - 0
AIEmoji/ko.lproj/Localizable.strings

@@ -528,3 +528,5 @@
 "Close-up photo from shoulders upward" = "어깨 위쪽에서 클로즈업 사진";
 "No visible clothing" = "눈에 보이는 옷이 없음";
 "Covered or unclear face, full-body photo" = "얼굴이 가려져 있거나 불분명한 경우, 전신 사진";
+
+"Video Effect" = "비디오 효과";

+ 3 - 0
AIEmoji/pt-BR.lproj/Localizable.strings

@@ -523,3 +523,6 @@
 "Close-up photo from shoulders upward" = "Foto em close-up dos ombros para cima";
 "No visible clothing" = "Nenhuma roupa visível";
 "Covered or unclear face, full-body photo" = "Rosto coberto ou não coberto, foto de corpo inteiro";
+
+
+"Video Effect" = "Efeito de vídeo";

+ 3 - 0
AIEmoji/pt-PT.lproj/Localizable.strings

@@ -522,3 +522,6 @@
 "Close-up photo from shoulders upward" = "Foto em close-up dos ombros para cima";
 "No visible clothing" = "Nenhuma roupa visível";
 "Covered or unclear face, full-body photo" = "Rosto coberto ou não coberto, foto de corpo inteiro";
+
+
+"Video Effect" = "Efeito de vídeo";

+ 2 - 0
AIEmoji/zh-Hans.lproj/Localizable.strings

@@ -525,3 +525,5 @@
 "Close-up photo from shoulders upward" = "肩部以上特写照片";
 "No visible clothing" = "看不到衣服";
 "Covered or unclear face, full-body photo" = "面部被遮挡或不清晰的全身照";
+
+"Video Effect" = "视频特效";

+ 3 - 0
AIEmoji/zh-Hant.lproj/Localizable.strings

@@ -513,3 +513,6 @@
 "Close-up photo from shoulders upward" = "肩部以上特寫照片";
 "No visible clothing" = "看不到衣服";
 "Covered or unclear face, full-body photo" = "面部被遮擋或不清晰的全身照";
+
+
+"Video Effect" = "影片特效";