浏览代码

修改一批 bug

100Years 1 月之前
父节点
当前提交
db3d204645
共有 35 个文件被更改,包括 387 次插入108 次删除
  1. 2 2
      AIRingtone.xcodeproj/project.pbxproj
  2. 22 0
      AIRingtone/Assets.xcassets/Tutorials/tutorial_photo_0.imageset/Contents.json
  3. 二进制
      AIRingtone/Assets.xcassets/Tutorials/tutorial_photo_0.imageset/tutorial_photo_0@2x.png
  4. 二进制
      AIRingtone/Assets.xcassets/Tutorials/tutorial_photo_0.imageset/tutorial_photo_0@3x.png
  5. 22 0
      AIRingtone/Assets.xcassets/Tutorials/tutorial_photo_1.imageset/Contents.json
  6. 二进制
      AIRingtone/Assets.xcassets/Tutorials/tutorial_photo_1.imageset/tutorial_photo_1@2x.png
  7. 二进制
      AIRingtone/Assets.xcassets/Tutorials/tutorial_photo_1.imageset/tutorial_photo_1@3x.png
  8. 22 0
      AIRingtone/Assets.xcassets/Tutorials/tutorial_poster_0.imageset/Contents.json
  9. 二进制
      AIRingtone/Assets.xcassets/Tutorials/tutorial_poster_0.imageset/tutorial_poster_0@2x.png
  10. 二进制
      AIRingtone/Assets.xcassets/Tutorials/tutorial_poster_0.imageset/tutorial_poster_0@3x.png
  11. 22 0
      AIRingtone/Assets.xcassets/Tutorials/tutorial_poster_1.imageset/Contents.json
  12. 二进制
      AIRingtone/Assets.xcassets/Tutorials/tutorial_poster_1.imageset/tutorial_poster_1@2x.png
  13. 二进制
      AIRingtone/Assets.xcassets/Tutorials/tutorial_poster_1.imageset/tutorial_poster_1@3x.png
  14. 22 0
      AIRingtone/Assets.xcassets/VIP/setting_unvip_bj.imageset/Contents.json
  15. 二进制
      AIRingtone/Assets.xcassets/VIP/setting_unvip_bj.imageset/setting_vip_bj@2x.png
  16. 二进制
      AIRingtone/Assets.xcassets/VIP/setting_unvip_bj.imageset/setting_vip_bj@3x.png
  17. 二进制
      AIRingtone/Assets.xcassets/VIP/setting_vip_bj.imageset/setting_vip_bj@2x.png
  18. 二进制
      AIRingtone/Assets.xcassets/VIP/setting_vip_bj.imageset/setting_vip_bj@3x.png
  19. 二进制
      AIRingtone/Assets.xcassets/VIP/vip_big_icon.imageset/vip_big_icon@2x.png
  20. 二进制
      AIRingtone/Assets.xcassets/VIP/vip_big_icon.imageset/vip_big_icon@3x.png
  21. 1 1
      AIRingtone/Business/TSAIPhotoVC/TSGeneralPicBrowseVC/TSGeneralPicBrowseVC.swift
  22. 1 1
      AIRingtone/Business/TSAIPhotoVC/TSGeneralPicVC/TSGeneralPicVC.swift
  23. 29 7
      AIRingtone/Business/TSAIPhotoVC/TSTextGeneralPicVC/TSTextGeneralPicVC.swift
  24. 3 4
      AIRingtone/Business/TSAIPhotoVC/TSTextGeneralPicVC/View/TSCreatBtnView.swift
  25. 9 0
      AIRingtone/Business/TSAIPhotoVC/TSTextGeneralPicVC/View/TSTGPPhotoStyleView.swift
  26. 1 0
      AIRingtone/Business/TSAIRintoneVC/TSGeneralRintoneVC/TSGeneralRintoneVC.swift
  27. 47 47
      AIRingtone/Business/TSAIRintoneVC/TSGeneralRintoneVC/TSGeneralRintoneVM.swift
  28. 7 3
      AIRingtone/Business/TSAIRintoneVC/TSTextGeneralRintoneVC/TSTextGeneralRintoneVC.swift
  29. 2 2
      AIRingtone/Business/TSPurchaseMembershipVC/TSPurchaseVC.swift
  30. 5 7
      AIRingtone/Business/TSSetingVC/SetingVC/View/SettingPurchaseTopView.swift
  31. 1 1
      AIRingtone/Business/TSThemeVC/TSThemeBrowseVC/TSThemeBrowseVC.swift
  32. 4 5
      AIRingtone/Business/TSThemeVC/TSThemeSetVC/TSThemeSetVC.swift
  33. 156 28
      AIRingtone/Business/TSTutorialsVC/TSTutorialPopupVC.swift
  34. 1 0
      AIRingtone/Business/VIewTool/TSViewTool.swift
  35. 8 0
      AIRingtone/Common/Purchase/TSPurchaseManager.swift

+ 2 - 2
AIRingtone.xcodeproj/project.pbxproj

@@ -1099,7 +1099,7 @@
 				ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor;
 				ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor;
 				CLANG_ENABLE_MODULES = YES;
 				CLANG_ENABLE_MODULES = YES;
 				CODE_SIGN_STYLE = Automatic;
 				CODE_SIGN_STYLE = Automatic;
-				CURRENT_PROJECT_VERSION = 1;
+				CURRENT_PROJECT_VERSION = 2;
 				DEVELOPMENT_TEAM = 65UD255J84;
 				DEVELOPMENT_TEAM = 65UD255J84;
 				GENERATE_INFOPLIST_FILE = YES;
 				GENERATE_INFOPLIST_FILE = YES;
 				INFOPLIST_FILE = AIRingtone/Info.plist;
 				INFOPLIST_FILE = AIRingtone/Info.plist;
@@ -1141,7 +1141,7 @@
 				ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor;
 				ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor;
 				CLANG_ENABLE_MODULES = YES;
 				CLANG_ENABLE_MODULES = YES;
 				CODE_SIGN_STYLE = Automatic;
 				CODE_SIGN_STYLE = Automatic;
-				CURRENT_PROJECT_VERSION = 1;
+				CURRENT_PROJECT_VERSION = 2;
 				DEVELOPMENT_TEAM = 65UD255J84;
 				DEVELOPMENT_TEAM = 65UD255J84;
 				GENERATE_INFOPLIST_FILE = YES;
 				GENERATE_INFOPLIST_FILE = YES;
 				INFOPLIST_FILE = AIRingtone/Info.plist;
 				INFOPLIST_FILE = AIRingtone/Info.plist;

+ 22 - 0
AIRingtone/Assets.xcassets/Tutorials/tutorial_photo_0.imageset/Contents.json

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

二进制
AIRingtone/Assets.xcassets/Tutorials/tutorial_photo_0.imageset/tutorial_photo_0@2x.png


二进制
AIRingtone/Assets.xcassets/Tutorials/tutorial_photo_0.imageset/tutorial_photo_0@3x.png


+ 22 - 0
AIRingtone/Assets.xcassets/Tutorials/tutorial_photo_1.imageset/Contents.json

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

二进制
AIRingtone/Assets.xcassets/Tutorials/tutorial_photo_1.imageset/tutorial_photo_1@2x.png


二进制
AIRingtone/Assets.xcassets/Tutorials/tutorial_photo_1.imageset/tutorial_photo_1@3x.png


+ 22 - 0
AIRingtone/Assets.xcassets/Tutorials/tutorial_poster_0.imageset/Contents.json

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

二进制
AIRingtone/Assets.xcassets/Tutorials/tutorial_poster_0.imageset/tutorial_poster_0@2x.png


二进制
AIRingtone/Assets.xcassets/Tutorials/tutorial_poster_0.imageset/tutorial_poster_0@3x.png


+ 22 - 0
AIRingtone/Assets.xcassets/Tutorials/tutorial_poster_1.imageset/Contents.json

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

二进制
AIRingtone/Assets.xcassets/Tutorials/tutorial_poster_1.imageset/tutorial_poster_1@2x.png


二进制
AIRingtone/Assets.xcassets/Tutorials/tutorial_poster_1.imageset/tutorial_poster_1@3x.png


+ 22 - 0
AIRingtone/Assets.xcassets/VIP/setting_unvip_bj.imageset/Contents.json

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

二进制
AIRingtone/Assets.xcassets/VIP/setting_unvip_bj.imageset/setting_vip_bj@2x.png


二进制
AIRingtone/Assets.xcassets/VIP/setting_unvip_bj.imageset/setting_vip_bj@3x.png


二进制
AIRingtone/Assets.xcassets/VIP/setting_vip_bj.imageset/setting_vip_bj@2x.png


二进制
AIRingtone/Assets.xcassets/VIP/setting_vip_bj.imageset/setting_vip_bj@3x.png


二进制
AIRingtone/Assets.xcassets/VIP/vip_big_icon.imageset/vip_big_icon@2x.png


二进制
AIRingtone/Assets.xcassets/VIP/vip_big_icon.imageset/vip_big_icon@3x.png


+ 1 - 1
AIRingtone/Business/TSAIPhotoVC/TSGeneralPicBrowseVC/TSGeneralPicBrowseVC.swift

@@ -163,7 +163,7 @@ class TSGeneralPicBrowseVC: TSBottomAlertVC {
             }else if style == .photo {
             }else if style == .photo {
                 contactsTool.setContactsAvatar(avatarImage: image) { data, error in
                 contactsTool.setContactsAvatar(avatarImage: image) { data, error in
                     if error == nil {
                     if error == nil {
-                        kSavePhotoSuccesswShared.show(atView: self.view)
+                        kSavePhotoSuccesswShared.show(atView: self.view,showViewBtn: false)
                     }
                     }
                 }
                 }
             }
             }

+ 1 - 1
AIRingtone/Business/TSAIPhotoVC/TSGeneralPicVC/TSGeneralPicVC.swift

@@ -107,7 +107,7 @@ class TSGeneralPicVC: TSBottomAlertVC {
             }else if gennerateType == .photo {
             }else if gennerateType == .photo {
                 contactsTool.setContactsAvatar(avatarImage: image) { data, error in
                 contactsTool.setContactsAvatar(avatarImage: image) { data, error in
                     if error == nil {
                     if error == nil {
-                        kSavePhotoSuccesswShared.show(atView: self.view)
+                        kSavePhotoSuccesswShared.show(atView: self.view,showViewBtn: false)
                     }
                     }
                 }
                 }
             }
             }

+ 29 - 7
AIRingtone/Business/TSAIPhotoVC/TSTextGeneralPicVC/TSTextGeneralPicVC.swift

@@ -43,7 +43,9 @@ class TSTextGeneralPicVC: TSBaseVC {
         photoStyleView.selectedValueBlock = { [weak self] index in
         photoStyleView.selectedValueBlock = { [weak self] index in
             guard let self = self else { return }
             guard let self = self else { return }
             viewModel.gennerateType = TSGennerateType(rawValue: index) ?? .poster
             viewModel.gennerateType = TSGennerateType(rawValue: index) ?? .poster
+            updateVipView()
         }
         }
+        photoStyleView.moreInfoBtn.addTarget(self, action: #selector(clickMoreInfoBtn), for: .touchUpInside)
         return photoStyleView
         return photoStyleView
     }()
     }()
     
     
@@ -110,20 +112,23 @@ class TSTextGeneralPicVC: TSBaseVC {
         historyTitleView.snp.makeConstraints { make in
         historyTitleView.snp.makeConstraints { make in
             make.height.equalTo(historyTitleView.viewH)
             make.height.equalTo(historyTitleView.viewH)
         }
         }
-        
     }
     }
     
     
     override func dealThings() {
     override func dealThings() {
-        self.creatBtnView.setVip(vip: kPurchaseDefault.isVip)
+        self.updateVipView()
         NotificationCenter.default.addObserver(self, selector: #selector(vipInfoChanged), name: .kPurchaseDidChanged, object: nil)
         NotificationCenter.default.addObserver(self, selector: #selector(vipInfoChanged), name: .kPurchaseDidChanged, object: nil)
     }
     }
     
     
     @objc func vipInfoChanged() {
     @objc func vipInfoChanged() {
         kExecuteOnMainThread {
         kExecuteOnMainThread {
-            self.creatBtnView.setVip(vip: kPurchaseDefault.isVip)
+            self.updateVipView()
         }
         }
     }
     }
     
     
+    func updateVipView() {
+        self.creatBtnView.setVip(vip: kPurchaseDefault.generateVipShow(type: self.vipFreeNumType))
+    }
+    
     @objc func clickView() {
     @objc func clickView() {
         view.endEditing(true)
         view.endEditing(true)
     }
     }
@@ -132,18 +137,35 @@ class TSTextGeneralPicVC: TSBaseVC {
     @objc func clickCollectionView() {
     @objc func clickCollectionView() {
         view.endEditing(true)
         view.endEditing(true)
     }
     }
+    @objc func clickMoreInfoBtn() {
+        kPresentModalVC(target: self, modelVC: TSTutorialPopupVC(selectedIndex: tutorialPopupSelectedIndex),transitionStyle: .crossDissolve)
+    }
+
 }
 }
 
 
 extension TSTextGeneralPicVC {
 extension TSTextGeneralPicVC {
-    func generateImage() {
-        
+    
+    var vipFreeNumType:VipFreeNumType {
         var vipFreeNumType:VipFreeNumType = .posetr
         var vipFreeNumType:VipFreeNumType = .posetr
         if viewModel.gennerateType == .poster {
         if viewModel.gennerateType == .poster {
             vipFreeNumType = VipFreeNumType.posetr
             vipFreeNumType = VipFreeNumType.posetr
         }else if viewModel.gennerateType == .photo {
         }else if viewModel.gennerateType == .photo {
             vipFreeNumType = VipFreeNumType.photo
             vipFreeNumType = VipFreeNumType.photo
         }
         }
-        
+        return vipFreeNumType
+    }
+    
+    var tutorialPopupSelectedIndex:Int {
+        var selectedIndex = 0
+        if viewModel.gennerateType == .photo {
+            selectedIndex = 1
+        }
+        return selectedIndex
+    }
+}
+extension TSTextGeneralPicVC {
+    func generateImage() {
+
         //判断 vip
         //判断 vip
         if kJudgeVip(externalBool: kPurchaseDefault.freeNumAvailable(type: vipFreeNumType) == false, vc: self) {[weak self] in
         if kJudgeVip(externalBool: kPurchaseDefault.freeNumAvailable(type: vipFreeNumType) == false, vc: self) {[weak self] in
             guard let self = self else { return }
             guard let self = self else { return }
@@ -154,7 +176,7 @@ extension TSTextGeneralPicVC {
             guard let self = self else { return }
             guard let self = self else { return }
             model.request.promptSort = viewModel.promptText
             model.request.promptSort = viewModel.promptText
             viewModel.saveModel(model:model)
             viewModel.saveModel(model:model)
-        
+            self.updateVipView()
             NotificationCenter.default.post(name: .kReloadUIData, object: nil, userInfo: ["TSGennerateType": viewModel.gennerateType])
             NotificationCenter.default.post(name: .kReloadUIData, object: nil, userInfo: ["TSGennerateType": viewModel.gennerateType])
         }
         }
         
         

+ 3 - 4
AIRingtone/Business/TSAIPhotoVC/TSTextGeneralPicVC/View/TSCreatBtnView.swift

@@ -29,14 +29,13 @@ class TSCreatBtnView: TSBaseView {
             clickBlock()
             clickBlock()
         }
         }
         btn.frame = CGRectMake(0, 0, k_ScreenWidth - 32, 48)
         btn.frame = CGRectMake(0, 0, k_ScreenWidth - 32, 48)
-//        btn.contentEdgeInsets = UIEdgeInsets(top: 4, left: 7, bottom: 4, right: 7)
+        btn.contentEdgeInsets = UIEdgeInsets(top: 0, left: 8, bottom: 0, right: 0)
         btn.imageEdgeInsets = UIEdgeInsets(top: 0, left: -8, bottom: 0, right: 0)
         btn.imageEdgeInsets = UIEdgeInsets(top: 0, left: -8, bottom: 0, right: 0)
         btn.addGradientBg(colors: ["#E961F6".uiColor.cgColor,"#7E57F4".uiColor.cgColor])
         btn.addGradientBg(colors: ["#E961F6".uiColor.cgColor,"#7E57F4".uiColor.cgColor])
         return btn
         return btn
     }()
     }()
      
      
     override func creatUI() {
     override func creatUI() {
-        
         contentView.addSubview(creatBtn)
         contentView.addSubview(creatBtn)
         creatBtn.snp.makeConstraints { make in
         creatBtn.snp.makeConstraints { make in
             make.center.equalToSuperview()
             make.center.equalToSuperview()
@@ -54,9 +53,9 @@ class TSCreatBtnView: TSBaseView {
     
     
     func setVip(vip:Bool) {
     func setVip(vip:Bool) {
         if vip {
         if vip {
-            creatBtn.setImage(nil, for: .normal)
-        }else{
             creatBtn.setImage(UIImage(named: "vip_icon_white"), for: .normal)
             creatBtn.setImage(UIImage(named: "vip_icon_white"), for: .normal)
+        }else{
+            creatBtn.setImage(nil, for: .normal)
         }
         }
     }
     }
 }
 }

+ 9 - 0
AIRingtone/Business/TSAIPhotoVC/TSTextGeneralPicVC/View/TSTGPPhotoStyleView.swift

@@ -32,10 +32,19 @@ class TSTGPPhotoStyleView: TSTGPTitleView {
         return segmentedView
         return segmentedView
     }()
     }()
     
     
+    let moreInfoBtn = kCreateMoreInfoBtn()
+    
     override func creatUI() {
     override func creatUI() {
         super.creatUI()
         super.creatUI()
         titleLab.text = "Select type".localized
         titleLab.text = "Select type".localized
         
         
+        contentView.addSubview(moreInfoBtn)
+        moreInfoBtn.snp.makeConstraints { make in
+            make.leading.equalTo(titleLab.snp.trailing).offset(8)
+            make.width.height.equalTo(16)
+            make.centerY.equalTo(titleLab)
+        }
+        
         contentView.addSubview(segmentedView)
         contentView.addSubview(segmentedView)
         segmentedView.snp.makeConstraints { make in
         segmentedView.snp.makeConstraints { make in
             make.width.equalTo(144)
             make.width.equalTo(144)

+ 1 - 0
AIRingtone/Business/TSAIRintoneVC/TSGeneralRintoneVC/TSGeneralRintoneVC.swift

@@ -88,6 +88,7 @@ class TSGeneralRintoneVC: TSBottomAlertVC {
     }
     }
     
     
     override func clickAgainBtn() {
     override func clickAgainBtn() {
+        audioPlayer.stop()
         //判断 vip
         //判断 vip
         if kJudgeVip(externalBool: kPurchaseDefault.freeNumAvailable(type: .ringtones) == false, vc: self) {[weak self] in
         if kJudgeVip(externalBool: kPurchaseDefault.freeNumAvailable(type: .ringtones) == false, vc: self) {[weak self] in
             guard let self = self else { return }
             guard let self = self else { return }

+ 47 - 47
AIRingtone/Business/TSAIRintoneVC/TSGeneralRintoneVC/TSGeneralRintoneVM.swift

@@ -30,61 +30,61 @@ class TSGeneralRintoneVM {
     var aiText:String = ""
     var aiText:String = ""
     var generatingProgress = 0
     var generatingProgress = 0
     
     
-    func creatRintone(text:String) {
-
-        stateDatauPblished = (.start,nil)
-        stateDatauPblished = (.progressString(generating(progress: 0.0)),nil)
-
-        kDelayOnMainThread(0.2) {
-            self.stateDatauPblished = (.progressString(self.generating(progress: 0.2)),nil)
-        }
-        
-        kDelayOnMainThread(0.4) {
-            self.stateDatauPblished = (.progressString(self.generating(progress: 0.4)),nil)
-        }
-        
-        kDelayOnMainThread(0.6) {
-            self.stateDatauPblished = (.progressString(self.generating(progress: 0.6)),nil)
-        }
-        
-        kDelayOnMainThread(0.8) {
-            self.stateDatauPblished = (.progressString(self.generating(progress: 0.8)),nil)
-        }
-        
-        kDelayOnMainThread(1.0) {
-            if Bool.random() {
-                let infoModel = TSActionInfoModel(JSON: actionInfoDict)
-                self.stateDatauPblished = (.success(nil),infoModel)
-            }else{
-                self.stateDatauPblished = (.failed("error?.localizedDescription"),nil)
-            }
-        }
-    }
-    
- 
 //    func creatRintone(text:String) {
 //    func creatRintone(text:String) {
-//        generatingProgress = 0
-//        aiText = text
-//        let postDict:[String : Any] = [
-//            "prompt":text,
-//            "duration":10
-//        ]
+//
 //        stateDatauPblished = (.start,nil)
 //        stateDatauPblished = (.start,nil)
 //        stateDatauPblished = (.progressString(generating(progress: 0.0)),nil)
 //        stateDatauPblished = (.progressString(generating(progress: 0.0)),nil)
-//        creatRequest = TSNetworkShared.post(urlType: .musicCreate,parameters: postDict) { [weak self] data,error in
-//            guard let self = self else { return }
-//            if let dataDict = data as? [String:Any] ,
-//               dataDict.safeInt(forKey: "code") == 200,
-//               let actionId = dataDict["actionId"] as? Int{
-//                if stopNetwork == false {
-//                    self.getActionInfo(action_id:actionId)
-//                }
+//
+//        kDelayOnMainThread(0.2) {
+//            self.stateDatauPblished = (.progressString(self.generating(progress: 0.2)),nil)
+//        }
+//        
+//        kDelayOnMainThread(0.4) {
+//            self.stateDatauPblished = (.progressString(self.generating(progress: 0.4)),nil)
+//        }
+//        
+//        kDelayOnMainThread(0.6) {
+//            self.stateDatauPblished = (.progressString(self.generating(progress: 0.6)),nil)
+//        }
+//        
+//        kDelayOnMainThread(0.8) {
+//            self.stateDatauPblished = (.progressString(self.generating(progress: 0.8)),nil)
+//        }
+//        
+//        kDelayOnMainThread(1.0) {
+//            if Bool.random() {
+//                let infoModel = TSActionInfoModel(JSON: actionInfoDict)
+//                self.stateDatauPblished = (.success(nil),infoModel)
 //            }else{
 //            }else{
-//                self.stateDatauPblished = (.failed(error?.localizedDescription ?? ""),nil)
+//                self.stateDatauPblished = (.failed("error?.localizedDescription"),nil)
 //            }
 //            }
 //        }
 //        }
 //    }
 //    }
     
     
+ 
+    func creatRintone(text:String) {
+        generatingProgress = 0
+        aiText = text
+        let postDict:[String : Any] = [
+            "prompt":text,
+            "duration":30
+        ]
+        stateDatauPblished = (.start,nil)
+        stateDatauPblished = (.progressString(generating(progress: 0.0)),nil)
+        creatRequest = TSNetworkShared.post(urlType: .musicCreate,parameters: postDict) { [weak self] data,error in
+            guard let self = self else { return }
+            if let dataDict = data as? [String:Any] ,
+               dataDict.safeInt(forKey: "code") == 200,
+               let actionId = dataDict["actionId"] as? Int{
+                if stopNetwork == false {
+                    self.getActionInfo(action_id:actionId)
+                }
+            }else{
+                self.stateDatauPblished = (.failed(error?.localizedDescription ?? ""),nil)
+            }
+        }
+    }
+    
     func getActionInfo(action_id:Int){
     func getActionInfo(action_id:Int){
         queryRequest = TSNetworkShared.get(urlType: .actionInfo,parameters: ["action_id":action_id]) { [weak self] data,error in
         queryRequest = TSNetworkShared.get(urlType: .actionInfo,parameters: ["action_id":action_id]) { [weak self] data,error in
             guard let self = self else { return }
             guard let self = self else { return }

+ 7 - 3
AIRingtone/Business/TSAIRintoneVC/TSTextGeneralRintoneVC/TSTextGeneralRintoneVC.swift

@@ -13,7 +13,7 @@ class TSTextGeneralRintoneVC: TSBaseVC {
             if cusStackView.viewH > 0{
             if cusStackView.viewH > 0{
                 return cusStackView.viewH
                 return cusStackView.viewH
             }
             }
-            return 474.0
+            return 464.0
         }
         }
     }
     }
     
     
@@ -99,13 +99,13 @@ class TSTextGeneralRintoneVC: TSBaseVC {
     }
     }
     
     
     override func dealThings() {
     override func dealThings() {
-        self.creatBtnView.setVip(vip: kPurchaseDefault.isVip)
+        self.updateVipView()
         NotificationCenter.default.addObserver(self, selector: #selector(vipInfoChanged), name: .kPurchaseDidChanged, object: nil)
         NotificationCenter.default.addObserver(self, selector: #selector(vipInfoChanged), name: .kPurchaseDidChanged, object: nil)
     }
     }
     
     
     @objc func vipInfoChanged() {
     @objc func vipInfoChanged() {
         kExecuteOnMainThread {
         kExecuteOnMainThread {
-            self.creatBtnView.setVip(vip: kPurchaseDefault.isVip)
+            self.updateVipView()
         }
         }
     }
     }
     
     
@@ -113,6 +113,9 @@ class TSTextGeneralRintoneVC: TSBaseVC {
         view.endEditing(true)
         view.endEditing(true)
     }
     }
 
 
+    func updateVipView() {
+        self.creatBtnView.setVip(vip: kPurchaseDefault.generateVipShow(type: .ringtones))
+    }
     
     
     @objc func clickCollectionView() {
     @objc func clickCollectionView() {
         view.endEditing(true)
         view.endEditing(true)
@@ -132,6 +135,7 @@ extension TSTextGeneralRintoneVC {
             guard let self = self else { return }
             guard let self = self else { return }
             model.request.promptSort = viewModel.promptText
             model.request.promptSort = viewModel.promptText
             viewModel.saveModel(model:model)
             viewModel.saveModel(model:model)
+            updateVipView()
             reloadUIBlock?()
             reloadUIBlock?()
         }
         }
         
         

+ 2 - 2
AIRingtone/Business/TSPurchaseMembershipVC/TSPurchaseVC.swift

@@ -219,10 +219,10 @@ struct PurchaseView :View {
     
     
     var body: some View {
     var body: some View {
         ScrollView {
         ScrollView {
-            Spacer().frame(height: 44)
+//            Spacer().frame(height: 44)
             
             
             VStack {
             VStack {
-                Image("vip_big_icon").resizable().frame(width: 131, height: 114)
+                Image("vip_big_icon").resizable().frame(width: 163, height: 164)
                 Spacer().frame(height: 13)
                 Spacer().frame(height: 13)
                 
                 
                 Text("AI Ringtone Pro")
                 Text("AI Ringtone Pro")

+ 5 - 7
AIRingtone/Business/TSSetingVC/SetingVC/View/SettingPurchaseTopView.swift

@@ -10,13 +10,11 @@ struct SettingPurchaseTopView: View {
     @Binding var isViper: Bool
     @Binding var isViper: Bool
     var body: some View {
     var body: some View {
         ZStack {
         ZStack {
-            
-            Image(.settingVipBj).resizable().frame(width: 343*kDesignScale, height: 109*kDesignScale)
-            
             if isViper {
             if isViper {
+                Image(.settingVipBj).resizable().frame(width: 343*kDesignScale, height: 109*kDesignScale)
                 HStack {
                 HStack {
                     Spacer().frame(width:20)
                     Spacer().frame(width:20)
-                    VStack(alignment: .leading,spacing: 12) {
+                    VStack(alignment: .leading,spacing: 16) {
                         HStack {
                         HStack {
                             Text("AI Ringtone Pro")
                             Text("AI Ringtone Pro")
                                 .font(.font(name: .PoppinsBlackItalic,size: 20))
                                 .font(.font(name: .PoppinsBlackItalic,size: 20))
@@ -41,13 +39,13 @@ struct SettingPurchaseTopView: View {
                     
                     
                     Spacer()
                     Spacer()
                     
                     
-                    Image(.vipBigIcon).resizable().frame(width: 88, height: 78)
+//                    Image(.vipBigIcon).resizable().frame(width: 88, height: 78)
                 }
                 }
             }else {
             }else {
-                
+                Image(.settingUnvipBj).resizable().frame(width: 343*kDesignScale, height: 109*kDesignScale)
                 HStack {
                 HStack {
                     Spacer().frame(width:20)
                     Spacer().frame(width:20)
-                    VStack(alignment: .leading,spacing: 12) {
+                    VStack(alignment: .leading,spacing: 16) {
                         HStack {
                         HStack {
                             Text("Get Pro")
                             Text("Get Pro")
                                 .font(.font(name: .PoppinsBlackItalic,size: 20))
                                 .font(.font(name: .PoppinsBlackItalic,size: 20))

+ 1 - 1
AIRingtone/Business/TSThemeVC/TSThemeBrowseVC/TSThemeBrowseVC.swift

@@ -168,7 +168,7 @@ class TSThemeBrowseVC: TSBaseVC {
     
     
     var getNeedVip:Bool{
     var getNeedVip:Bool{
         if let currentModel = self.currentModel {
         if let currentModel = self.currentModel {
-            if currentModel.vip,kPurchaseDefault.isVip == false {
+            if currentModel.vip {
                 return true
                 return true
             }
             }
         }
         }

+ 4 - 5
AIRingtone/Business/TSThemeVC/TSThemeSetVC/TSThemeSetVC.swift

@@ -12,8 +12,7 @@ class TSThemeSetVC: TSBaseVC {
     var duration:Float
     var duration:Float
     
     
     var getNeedVip:Bool{
     var getNeedVip:Bool{
-//        return true
-        if model.vip,kPurchaseDefault.isVip == false {
+        if model.vip{
             return true
             return true
         }
         }
         return false
         return false
@@ -53,7 +52,7 @@ class TSThemeSetVC: TSBaseVC {
     lazy var photoView: TSThemeSetPhotorView = {
     lazy var photoView: TSThemeSetPhotorView = {
         let photoView = TSThemeSetPhotorView()
         let photoView = TSThemeSetPhotorView()
         photoView.setBtn.addTarget(self, action: #selector(clickPhoto), for: .touchUpInside)
         photoView.setBtn.addTarget(self, action: #selector(clickPhoto), for: .touchUpInside)
-        posterView.moreInfoBtn.addTarget(self, action: #selector(clickSetMoreInfoPhoto), for: .touchUpInside)
+        photoView.moreInfoBtn.addTarget(self, action: #selector(clickSetMoreInfoPhoto), for: .touchUpInside)
         return photoView
         return photoView
     }()
     }()
     
     
@@ -205,11 +204,11 @@ extension TSThemeSetVC {
     }
     }
     
     
     @objc func clickSetMoreInfoPoster(){
     @objc func clickSetMoreInfoPoster(){
-        kPresentModalVC(target: self, modelVC: TSTutorialPopupVC(),transitionStyle: .crossDissolve)
+        kPresentModalVC(target: self, modelVC: TSTutorialPopupVC(selectedIndex: 0),transitionStyle: .crossDissolve)
     }
     }
     
     
     @objc func clickSetMoreInfoPhoto(){
     @objc func clickSetMoreInfoPhoto(){
-        kPresentModalVC(target: self, modelVC: TSTutorialPopupVC(),transitionStyle: .crossDissolve)
+        kPresentModalVC(target: self, modelVC: TSTutorialPopupVC(selectedIndex: 1),transitionStyle: .crossDissolve)
     }
     }
 
 
 }
 }

+ 156 - 28
AIRingtone/Business/TSTutorialsVC/TSTutorialPopupVC.swift

@@ -10,6 +10,17 @@ import JXPagingView
 
 
 class TSTutorialPopupVC: TSBaseVC {
 class TSTutorialPopupVC: TSBaseVC {
     
     
+    var selectedIndex:Int
+    
+    init(selectedIndex: Int) {
+        self.selectedIndex = selectedIndex
+        super.init()
+    }
+    
+    @MainActor required init?(coder: NSCoder) {
+        fatalError("init(coder:) has not been implemented")
+    }
+    
     var tableHeaderViewHeight: CGFloat = 0.0
     var tableHeaderViewHeight: CGFloat = 0.0
     var headerInSectionHeight: Int = 44
     var headerInSectionHeight: Int = 44
     let titles:[String] = ["Contact Poster".localized,"Contact Photo".localized]
     let titles:[String] = ["Contact Poster".localized,"Contact Photo".localized]
@@ -17,7 +28,7 @@ class TSTutorialPopupVC: TSBaseVC {
     let popupContentViewH:CGFloat = k_ScreenHeight - 268.0
     let popupContentViewH:CGFloat = k_ScreenHeight - 268.0
     
     
     lazy var popupContentView: UIView = {
     lazy var popupContentView: UIView = {
-        let popupContentView = UIView()
+        let popupContentView = UIView(frame: CGRectMake(0, 0, popupContentViewW, popupContentViewH))
         popupContentView.backgroundColor = .cardColor
         popupContentView.backgroundColor = .cardColor
         popupContentView.cornerRadius = 20.0
         popupContentView.cornerRadius = 20.0
         return popupContentView
         return popupContentView
@@ -41,7 +52,6 @@ class TSTutorialPopupVC: TSBaseVC {
     lazy var indicator: JXSegmentedIndicatorBackgroundView = {
     lazy var indicator: JXSegmentedIndicatorBackgroundView = {
         let indicator = JXSegmentedIndicatorBackgroundView()
         let indicator = JXSegmentedIndicatorBackgroundView()
         indicator.isIndicatorConvertToItemFrameEnabled = true
         indicator.isIndicatorConvertToItemFrameEnabled = true
-        indicator.isIndicatorConvertToItemFrameEnabled = true
         indicator.indicatorHeight = 2
         indicator.indicatorHeight = 2
         indicator.indicatorPosition = .bottom
         indicator.indicatorPosition = .bottom
         
         
@@ -52,7 +62,6 @@ class TSTutorialPopupVC: TSBaseVC {
         gradientView.autoresizingMask = [.flexibleWidth, .flexibleHeight]
         gradientView.autoresizingMask = [.flexibleWidth, .flexibleHeight]
         gradientView.cornerRadius = 1
         gradientView.cornerRadius = 1
         indicator.addSubview(gradientView)
         indicator.addSubview(gradientView)
-        indicator.addSubview(gradientView)
         
         
         return indicator
         return indicator
     }()
     }()
@@ -65,41 +74,60 @@ class TSTutorialPopupVC: TSBaseVC {
         segmentedView.backgroundColor = .clear
         segmentedView.backgroundColor = .clear
         segmentedView.contentEdgeInsetLeft = 26
         segmentedView.contentEdgeInsetLeft = 26
         segmentedView.listContainer = pagingView.listContainerView
         segmentedView.listContainer = pagingView.listContainerView
+        
+        
+        let lineView = UIView()
+        lineView.backgroundColor = .white.withAlphaComponent(0.2)
+        segmentedView.addSubview(lineView)
+        lineView.snp.makeConstraints { make in
+            make.bottom.equalToSuperview()
+            make.leading.trailing.equalTo(0)
+            make.height.equalTo(1)
+        }
+        
         return segmentedView
         return segmentedView
     }()
     }()
     
     
     lazy var pagingView: JXPagingView = {
     lazy var pagingView: JXPagingView = {
         let pagingView = JXPagingView(delegate: self)
         let pagingView = JXPagingView(delegate: self)
         pagingView.mainTableView.backgroundColor = .clear
         pagingView.mainTableView.backgroundColor = .clear
-        pagingView.frame = CGRect(x: 0, y: 0, width:popupContentViewW, height:popupContentViewH)
+        pagingView.frame = CGRect(x: 0, y: 25, width:popupContentViewW, height:popupContentViewH-72-25)
         pagingView.listContainerView.listCellBackgroundColor = .clear
         pagingView.listContainerView.listCellBackgroundColor = .clear
         //扣边返回处理,下面的代码要加上
         //扣边返回处理,下面的代码要加上
         pagingView.listContainerView.scrollView.panGestureRecognizer.require(toFail: self.navigationController!.interactivePopGestureRecognizer!)
         pagingView.listContainerView.scrollView.panGestureRecognizer.require(toFail: self.navigationController!.interactivePopGestureRecognizer!)
         pagingView.mainTableView.panGestureRecognizer.require(toFail: self.navigationController!.interactivePopGestureRecognizer!)
         pagingView.mainTableView.panGestureRecognizer.require(toFail: self.navigationController!.interactivePopGestureRecognizer!)
-        pagingView.pinSectionHeaderVerticalOffset = Int(TSTGPTitleView.viewH)
         return pagingView
         return pagingView
     }()
     }()
     
     
+    lazy var confirmBtn: UIButton = {
+        let confirmBtn = UIButton.createButton(title: "OK".localized, backgroundColor: "#111111".uiColor,font:.font(size: 18),titleColor: .themeColor,corner: 24){ [weak self]  in
+            guard let self = self else { return }
+            dismiss()
+        }
+        return confirmBtn
+    }()
+    
     override func createView() {
     override func createView() {
     
     
         setNavBarViewHidden(true)
         setNavBarViewHidden(true)
         view.backgroundColor = .black.withAlphaComponent(0.7)
         view.backgroundColor = .black.withAlphaComponent(0.7)
         
         
-        
-        view.addGestureRecognizer(UITapGestureRecognizer(target: self, action: #selector(clickView)))
-        
         contentView.addSubview(popupContentView)
         contentView.addSubview(popupContentView)
-        popupContentView.snp.makeConstraints { make in
-            make.center.equalToSuperview()
-            make.width.equalTo(popupContentViewW)
-            make.height.equalTo(popupContentViewH)
-        }
+        popupContentView.center = view.center
         createSegmentedView()
         createSegmentedView()
+        
+        popupContentView.addSubview(confirmBtn)
+        confirmBtn.snp.makeConstraints { make in
+            make.bottom.equalTo(-24)
+            make.centerX.equalToSuperview()
+            make.width.equalTo(250)
+            make.height.equalTo(48)
+        }
+        
+        
+        segmentedView.defaultSelectedIndex = selectedIndex
     }
     }
-    
-    @objc func clickView() {
-        self.dismiss()
-    }
+
 }
 }
 
 
 extension TSTutorialPopupVC {
 extension TSTutorialPopupVC {
@@ -132,7 +160,7 @@ extension TSTutorialPopupVC: JXPagingViewDelegate {
     }
     }
 
 
     func pagingView(_ pagingView: JXPagingView, initListAtIndex index: Int) -> JXPagingViewListViewDelegate {
     func pagingView(_ pagingView: JXPagingView, initListAtIndex index: Int) -> JXPagingViewListViewDelegate {
-        return TSTutorialPopupView()
+        return TSTutorialPopupView(selectedIndex: index)
     }
     }
 }
 }
 
 
@@ -146,31 +174,67 @@ extension TSTutorialPopupVC: JXPagingViewDelegate {
         return stackView
         return stackView
     }()
     }()
     
     
+    var selectedIndex:Int
+    init(selectedIndex: Int) {
+        self.selectedIndex = selectedIndex
+        super.init(frame: .zero)
+    }
+    
+    @MainActor required init?(coder: NSCoder) {
+        fatalError("init(coder:) has not been implemented")
+    }
+    
+    let popupContentView = TSTutorialPopupContentView()
+
     public override func creatUI() {
     public override func creatUI() {
-        self.backgroundColor = .random
-        
         contentView.addSubview(stackView)
         contentView.addSubview(stackView)
         stackView.snp.makeConstraints { make in
         stackView.snp.makeConstraints { make in
             make.edges.equalToSuperview()
             make.edges.equalToSuperview()
         }
         }
+        
+        stackView.addSubviewToStack(popupContentView)
+        popupContentView.snp.makeConstraints { make in
+            make.height.equalTo(404*kDesignScale)
+        }
+    }
+    
+    public override func dealThings() {
+        var imageNamed0 = ""
+        var imageNamed1 = ""
+        var info = ""
+        
+        if selectedIndex == 0 {
+            imageNamed0 = "tutorial_poster_0"
+            imageNamed1 = "tutorial_poster_1"
+            info = """
+            A new iOS 17 feature that creates a full-screen customizable visual identity for incoming calls. It combines photos, text (name), colors, and fonts, acting like a personalized "wallpaper" for your contact card.
+        """.localized
+        }else{
+            imageNamed0 = "tutorial_photo_0"
+            imageNamed1 = "tutorial_photo_1"
+            info = """
+            A small circular thumbnail image linked to a contact, displayed in apps like Contacts, Messages, or call logs
+        """.localized
+        }
+        
+        popupContentView.imageView0.image = UIImage(named: imageNamed0)
+        popupContentView.imageView1.image = UIImage(named: imageNamed1)
+        popupContentView.infoLabel.text = info
     }
     }
-
 }
 }
 
 
 extension TSTutorialPopupView: JXPagingViewListViewDelegate,UIScrollViewDelegate {
 extension TSTutorialPopupView: JXPagingViewListViewDelegate,UIScrollViewDelegate {
     
     
-//    public func scrollViewDidScroll(_ scrollView: UIScrollView) {
-//        self.listViewDidScrollCallback?(scrollView)
-//    }
+    public func scrollViewDidScroll(_ scrollView: UIScrollView) {
+        self.listViewDidScrollCallback?(scrollView)
+    }
     
     
     public func listScrollView() -> UIScrollView {
     public func listScrollView() -> UIScrollView {
-        return UIScrollView()
-//        return stackView.scrollView
+        return stackView.scrollView
     }
     }
     
     
     public func listViewDidScrollCallback(callback: @escaping (UIScrollView) -> ()) {
     public func listViewDidScrollCallback(callback: @escaping (UIScrollView) -> ()) {
-//        self.listViewDidScrollCallback = callback
-        callback(UIScrollView())
+        listViewDidScrollCallback = callback
     }
     }
     
     
     public func listView() -> UIView {
     public func listView() -> UIView {
@@ -178,3 +242,67 @@ extension TSTutorialPopupView: JXPagingViewListViewDelegate,UIScrollViewDelegate
     }
     }
     
     
 }
 }
+
+
+class TSTutorialPopupContentView: TSBaseView {
+
+    lazy var imageView0: UIImageView = {
+        let imageView = UIImageView()
+        imageView.contentMode = .scaleAspectFill
+        imageView.cornerRadius = 16
+        return imageView
+    }()
+    
+    lazy var imageView1: UIImageView = {
+        let imageView = UIImageView()
+        imageView.contentMode = .scaleAspectFill
+        imageView.cornerRadius = 16
+        return imageView
+    }()
+    
+    lazy var infoLabel: UILabel = {
+        let infoLabel = UILabel.createLabel(font: .font(size: 14),textColor: .white.withAlphaComponent(0.8),textAlignment: .center,numberOfLines: 0)
+        return infoLabel
+    }()
+    
+    
+    
+    override func creatUI() {
+        
+        let centerLineView = UIView()
+        centerLineView.backgroundColor = .clear
+        
+        contentView.addSubview(centerLineView)
+        contentView.addSubview(imageView0)
+        contentView.addSubview(imageView1)
+        contentView.addSubview(infoLabel)
+        
+        centerLineView.snp.makeConstraints { make in
+            make.center.equalToSuperview()
+            make.width.equalTo(1)
+            make.height.equalTo(1)
+        }
+        
+        imageView0.snp.makeConstraints { make in
+            make.top.equalTo(20)
+            make.trailing.equalTo(centerLineView.snp.leading).offset(-10)
+            make.width.equalTo(98*kDesignScale)
+            make.height.equalTo(218*kDesignScale)
+        }
+        
+        imageView1.snp.makeConstraints { make in
+            make.top.equalTo(20)
+            make.leading.equalTo(centerLineView.snp.trailing).offset(10)
+            make.width.equalTo(98*kDesignScale)
+            make.height.equalTo(218*kDesignScale)
+        }
+        
+        infoLabel.snp.makeConstraints { make in
+            make.top.equalTo(imageView0.snp.bottom).offset(20)
+            make.leading.bottom.equalTo(20)
+            make.trailing.equalTo(-20)
+        }
+        
+    }
+    
+}

+ 1 - 0
AIRingtone/Business/VIewTool/TSViewTool.swift

@@ -28,6 +28,7 @@ func kCreateNormalSubmitBtn(title:String, action: (() -> Void)? = nil) -> UIButt
     
     
     let btn = TSNormalSubmitBtn()
     let btn = TSNormalSubmitBtn()
     btn.setUpButton(title:title,font: UIFont.font(size: 16,weight: .regular),titleColor:.white,corner: 24,action: action)
     btn.setUpButton(title:title,font: UIFont.font(size: 16,weight: .regular),titleColor:.white,corner: 24,action: action)
+    btn.contentEdgeInsets = UIEdgeInsets(top: 0, left: 8, bottom: 0, right: 0)
     btn.imageEdgeInsets = UIEdgeInsets(top:0, left: -8, bottom: 0, right: 16)
     btn.imageEdgeInsets = UIEdgeInsets(top:0, left: -8, bottom: 0, right: 16)
     btn.frame = CGRectMake(0, 0, 200, 48)
     btn.frame = CGRectMake(0, 0, 200, 48)
     btn.addGradientBg(colors: ["#E961F6".uiColor.cgColor,"#7E57F4".uiColor.cgColor])
     btn.addGradientBg(colors: ["#E961F6".uiColor.cgColor,"#7E57F4".uiColor.cgColor])

+ 8 - 0
AIRingtone/Common/Purchase/TSPurchaseManager.swift

@@ -598,6 +598,14 @@ extension PurchaseManager {
         }
         }
         return false
         return false
     }
     }
+    
+    /// 是否展示生成类的会员图标
+    func generateVipShow(type:VipFreeNumType) -> Bool{
+        if freeNum(type: type) > 0 {
+            return false
+        }
+        return true
+    }
 }
 }