100Years 3 days ago
parent
commit
5888171ca9

+ 2 - 2
AIEmoji.xcodeproj/project.pbxproj

@@ -2250,7 +2250,7 @@
 				ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor;
 				CLANG_ENABLE_MODULES = YES;
 				CODE_SIGN_STYLE = Automatic;
-				CURRENT_PROJECT_VERSION = 3;
+				CURRENT_PROJECT_VERSION = 4;
 				DEVELOPMENT_TEAM = 65UD255J84;
 				ENABLE_USER_SCRIPT_SANDBOXING = NO;
 				GENERATE_INFOPLIST_FILE = YES;
@@ -2289,7 +2289,7 @@
 				ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor;
 				CLANG_ENABLE_MODULES = YES;
 				CODE_SIGN_STYLE = Automatic;
-				CURRENT_PROJECT_VERSION = 3;
+				CURRENT_PROJECT_VERSION = 4;
 				DEVELOPMENT_TEAM = 65UD255J84;
 				ENABLE_USER_SCRIPT_SANDBOXING = NO;
 				GENERATE_INFOPLIST_FILE = YES;

BIN
AIEmoji/Assets.xcassets/AIList/ailist_pretty.imageset/ailist_pretty@2x.png


BIN
AIEmoji/Assets.xcassets/AIList/ailist_pretty.imageset/ailist_pretty@3x.png


+ 8 - 2
AIEmoji/Business/TSAILIstVC/TSAIAgeImageHintVC/TSAIListHintBaseVC.swift

@@ -36,6 +36,11 @@ class TSAIListHintBaseVC: TSBaseVC {
             self.badInfoText = badInfoText
         }
         
+        static func getDefaultConfig(imageMaxBitSize:Int) -> Config {
+            var config = defaultConfig
+            config.imageMaxBitSize = imageMaxBitSize
+            return config
+        }
         
         static var defaultConfig:Config {
             return Config(imageMaxBitSize: kUploadImageMaxBit10Size,
@@ -209,9 +214,10 @@ class TSAIListHintBaseVC: TSBaseVC {
                 TSToastShared.showToast(text: errorString)
             }else{
                 kDelayMainShort {
-                    self.dismiss()
+                    self.dismiss(animated: true) {
+                        self.clickUpImageHandle?(image)
+                    }
                 }
-                clickUpImageHandle?(image)
             }
         }
     }

+ 1 - 1
AIEmoji/Business/TSAILIstVC/TSAILIstVC/TSAILIstCell.swift

@@ -31,7 +31,7 @@ class TSAILIstCell: TSBaseCollectionCell {
 //    }()
     
     lazy var titleLab: UILabel = {
-        let titleLab = UILabel.createLabel(font: .font(size: 16,weight: .medium),textColor: .fromHex("FFFFFF"))
+        let titleLab = UILabel.createLabel(font: .font(size: 16,weight: .medium),textColor: .fromHex("FFFFFF"),numberOfLines: 0)
         return titleLab
     }()
     

+ 5 - 8
AIEmoji/Business/TSAILIstVC/TSAILIstVC/TSAILIstVC.swift

@@ -32,13 +32,10 @@ class TSAILIstVC: TSBaseVC {
                 rightViewStyle: 0,
                 tapBlock: { [weak self] model, _, _ in
                    guard let self = self else { return }
- 
-                    var config = TSAIListHintBaseVC.Config.defaultConfig
-                    config.imageMaxBitSize = kUploadImageMaxBit5Size
                     enterSelectPhotos(
                         userDefaultsKey: "isFirstAIPrettyPhoto",
                         maxBitSize: kUploadImageMaxBit5Size,
-                         config:config
+                         config:.getDefaultConfig(imageMaxBitSize: kUploadImageMaxBit5Size)
                     ) { image in
                         let baseVc = TSAIUploadPhotoBaseVC(titleString: model.leftTitle ?? "",upLoadImage: image,imageMaxBitSize: kUploadImageMaxBit5Size, generatorStyle: .pretty)
                         kPushVC(target: self, modelVC: baseVc)
@@ -48,7 +45,7 @@ class TSAILIstVC: TSBaseVC {
         sectionModel.addSubItemModel(
             createItemModel(
                 leftImageName:"ailist_eyeOpen",
-                leftTitle: "Open eyes".localized,
+                leftTitle: "Open Eyes".localized,
                 leftSubTitle: "".localized,
                 rightViewStyle: 0,
                 tapBlock: { [weak self] model, _, _ in
@@ -73,10 +70,10 @@ class TSAILIstVC: TSBaseVC {
                    guard let self = self else { return }
                     enterSelectPhotos(
                         userDefaultsKey: "isFirstAIChangeRestOldPhoto",
-                        maxBitSize: kUploadImageMaxBit10Size,
-                        config:.defaultConfig
+                        maxBitSize: kUploadImageMaxBit5Size,
+                        config: .getDefaultConfig(imageMaxBitSize: kUploadImageMaxBit5Size)
                     ) { image in
-                        let baseVc = TSAIUploadPhotoBaseVC(titleString: model.leftTitle ?? "",upLoadImage: image,imageMaxBitSize: kUploadImageMaxBit10Size, generatorStyle: .oldPhoto)
+                        let baseVc = TSAIUploadPhotoBaseVC(titleString: model.leftTitle ?? "",upLoadImage: image,imageMaxBitSize: kUploadImageMaxBit5Size, generatorStyle: .oldPhoto)
                         kPushVC(target: self, modelVC: baseVc)
                     }
         }))

+ 43 - 33
AIEmoji/Business/TSAILIstVC/TSAIPhotoGeneratorBaseVC/TSAIListPhotoGeneratorBaseVC.swift

@@ -10,27 +10,19 @@ class TSAIListPhotoGeneratorBaseVC: TSAIPhotoGeneratorBaseVC {
     var imageModel:TSActionInfoModel?
     var complete:((TSActionInfoModel)->Void)
     
-//    var prompt:String
-//    var promptSort:String
-
-//    var style:String
     var imageUrl:String?
     var upLoadImage:UIImage
     var generatorStyle:TSGeneratorImageStyle
     
     var progressState = TSProgressState.none
-//    init(prompt:String,promptSort:String,imageUrl:String,upLoadImage:UIImage,style:String,generatorStyle:TSGeneratorImageStyle,complete:@escaping ((TSActionInfoModel)->Void)) {
-//        self.prompt = prompt
-//        self.promptSort = promptSort
-//        self.imageUrl = imageUrl
-//        self.upLoadImage = upLoadImage
-//        self.style = style
-//        self.generatorStyle = generatorStyle
-//        self.complete = complete
-//        
-//        super.init()
-//    }
     
+    var isSavePhotoMark:Bool = false
+    var isNeedSavePhoto:Bool {
+        if isSavePhotoMark == false,let _ = imageModel {
+            return true
+        }
+        return false
+    }
     
     init(upLoadImage:UIImage,generatorStyle:TSGeneratorImageStyle,complete:@escaping ((TSActionInfoModel)->Void)) {
         self.upLoadImage = upLoadImage
@@ -41,7 +33,6 @@ class TSAIListPhotoGeneratorBaseVC: TSAIPhotoGeneratorBaseVC {
     }
     
     lazy var viewModel: TSAIListPhotoGeneratorBaseVM = {
-//        let viewModel:TSAIListPhotoGeneratorBaseVM = TSAIListPhotoGeneratorBaseVM(prompt: prompt,upLoadImage:upLoadImage,style: style, generatorStyle: generatorStyle)
         let viewModel:TSAIListPhotoGeneratorBaseVM = TSAIListPhotoGeneratorBaseVM(upLoadImage: upLoadImage, generatorStyle: generatorStyle)
         return viewModel
     }()
@@ -49,14 +40,12 @@ class TSAIListPhotoGeneratorBaseVC: TSAIPhotoGeneratorBaseVC {
     @MainActor required init?(coder: NSCoder) {
         fatalError("init(coder:) has not been implemented")
     }
-    
 
     lazy var generateInView : TSGeneratorloadingView = {
         let generateInView = TSGeneratorloadingView()
         return generateInView
     }()
     
-    
     lazy var switchOriginalPictureBtn: UIButton = {
         let switchOriginalPictureBtn = UIButton.createButton(image:UIImage(named: "switch_original_picture"))
         switchOriginalPictureBtn.addTarget(self, action: #selector(switchOriginalPictureTouchDown), for: .touchDown)
@@ -65,7 +54,6 @@ class TSAIListPhotoGeneratorBaseVC: TSAIPhotoGeneratorBaseVC {
         return switchOriginalPictureBtn
     }()
     
-
     override func createView() {
 
         contentView.addSubview(generateInView)
@@ -75,7 +63,6 @@ class TSAIListPhotoGeneratorBaseVC: TSAIPhotoGeneratorBaseVC {
         
         super.createView()
         
-
         contentView.addSubview(switchOriginalPictureBtn)
         switchOriginalPictureBtn.snp.makeConstraints { make in
             make.bottom.equalTo(-k_Height_safeAreaInsetsBottom() - 76)
@@ -84,12 +71,40 @@ class TSAIListPhotoGeneratorBaseVC: TSAIPhotoGeneratorBaseVC {
             make.height.equalTo(40)
         }
         
+        bigSaveBtn.setTitleImageSpace(spacing: 0)
     }
     
     override func closePage() {
+    
         if progressState.isResult {
-            viewModel.cancelAllRequest()
-            self.dismiss(animated: true, completion: nil)
+            if isNeedSavePhoto{
+                TSCustomAlertController.show(in: self, config: TSCustomAlertController.AlertConfig(
+                    message: "You haven't saved the photo yet. Are you sure to quit?".localized,
+                    messageColor: .white,
+                    messageFont: .systemFont(ofSize: 16),
+                    
+                    cancelTitle: "Quit".localized,
+                    cancelColor: .white,
+                    
+                    confirmTitle: "Save".localized,
+                    confirmColor: .themeColor,
+                    
+                    cancelAction: { [weak self]  in
+                        guard let self = self else { return }
+                        print("用户点击了Leave")
+                        viewModel.cancelAllRequest()
+                        self.dismiss(animated: true, completion: nil)
+                    },
+                    confirmAction: { [weak self]  in
+                        guard let self = self else { return }
+                        print("用户点击了Stay")
+                        clickSaveBtn()
+                    }
+                ))
+            }else{
+                viewModel.cancelAllRequest()
+                self.dismiss(animated: true, completion: nil)
+            }
         }else{
             TSCustomAlertController.show(in: self, config: TSCustomAlertController.AlertConfig(
                 message: "As you leave, your generation will be interrupted and no result.".localized,
@@ -131,8 +146,10 @@ class TSAIListPhotoGeneratorBaseVC: TSAIPhotoGeneratorBaseVC {
     //保存功能
     @objc override func clickSaveBtn(){
         if let image = getSuccessImage() {
-            PhotoManagerShared.saveImageToAlbum(image) { success, error in
+            PhotoManagerShared.saveImageToAlbum(image) { [weak self] success, error in
+                guard let self = self else { return }
                 if success {
+                    isSavePhotoMark = true
                     kSavePhotoSuccesswShared.show(atView:self.view)
                 }else{
                     debugPrint(error)
@@ -153,7 +170,6 @@ class TSAIListPhotoGeneratorBaseVC: TSAIPhotoGeneratorBaseVC {
 
 extension TSAIListPhotoGeneratorBaseVC {
     
-    
     func getSuccessImage()->UIImage?{
         if let image = netWorkImageView.image {
             return image.pngImage
@@ -231,12 +247,8 @@ extension TSAIListPhotoGeneratorBaseVC {
         bottomView.isHidden = false
         netWorkImageView.isHidden = false
         switchOriginalPictureBtn.isHidden = false
-        
-        self.netWorkImageView.setAsyncImage(urlString: model.response.resultUrl,placeholder:kPlaceholderImage,backgroundColor:netWorkImageView.backgroundColor!){ [weak self] image in
-            guard let self = self else { return }
-            
-            netWorkImageView.adaptiveScale()
-        }
+        isSavePhotoMark = false
+        self.netWorkImageView.setAsyncImage(urlString: model.response.resultUrl,placeholder:kPlaceholderImage,backgroundColor:netWorkImageView.backgroundColor!)
         
         kPurchaseDefault.useOnceForFree(type: .picToPic)
         if let model = imageModel {
@@ -250,8 +262,6 @@ extension TSAIListPhotoGeneratorBaseVC {
     
     @objc func switchOriginalPictureTouchUp() {
         guard let imageModel = imageModel else { return }
-        self.netWorkImageView.setAsyncImage(urlString: imageModel.response.resultUrl,placeholder:kPlaceholderImage,backgroundColor:netWorkImageView.backgroundColor!){ [weak self] image in
-            guard let self = self else { return }
-        }
+        self.netWorkImageView.setAsyncImage(urlString: imageModel.response.resultUrl,placeholder:kPlaceholderImage,backgroundColor:netWorkImageView.backgroundColor!)
     }
 }

+ 13 - 2
AIEmoji/Business/TSAILIstVC/TSAIPhotoGeneratorBaseVC/TSAIPhotoGeneratorBaseVM/TSAIListPhotoGeneratorBaseVM.swift

@@ -126,7 +126,7 @@ class TSAIListPhotoGeneratorBaseVM {
                                 guard let self = self else { return }
                         
                                 let progressInt = Int(progress*10.0)
-                                let progressString = "Generating".localized + " \(90 + progressInt)%"
+                                let progressString = generatingText + " \(90 + progressInt)%"
                                 stateDatauPblished = (.progressString(progressString),nil)
                                 dePrint("生成后图片下载进度: \(progress)")
                             } completion: {[weak self] image in
@@ -215,7 +215,18 @@ class TSAIListPhotoGeneratorBaseVM {
         }
         
         generatingProgress = progressInt
-        return "Generating".localized + " \(progressInt)%"
+        return generatingText + " \(progressInt)%"
+    }
+    
+    
+    var generatingText:String{
+        if generatorStyle == .oldPhoto {
+            return "Restoring".localized
+        }else
+        if generatorStyle == .pretty {
+            return "Changing".localized
+        }
+        return "Generating".localized
     }
 }
 

+ 16 - 7
AIEmoji/Business/TSAILIstVC/TSAIUploadPhotoBaseVC/TSAIUploadPhotoBaseVC.swift

@@ -7,11 +7,11 @@
 
 import PhotosUI
 enum TSGeneratorImageStyle {
-    case ageOld
-    case ageChild
-    case oldPhoto
-    case eyeOpen
-    case pretty
+    case ageOld      //变老
+    case ageChild   //变年轻
+    case oldPhoto   //旧照片修复
+    case eyeOpen    //开眼
+    case pretty     //变美
 }
 
 class TSAIUploadPhotoBaseVC: TSBaseVC {
@@ -44,7 +44,7 @@ class TSAIUploadPhotoBaseVC: TSBaseVC {
 
     
     lazy var submitBtn: UIButton = {
-        let submitBtn = kCreateNormalSubmitBtn(title: "Generate".localized) { [weak self]  in
+        let submitBtn = kCreateNormalSubmitBtn(title: generatingText) { [weak self]  in
             guard let self = self else { return }
             generateImage()
         }
@@ -226,7 +226,16 @@ extension TSAIUploadPhotoBaseVC {
         }
         return bgView
     }
-
+    
+    var generatingText:String{
+        if generatorStyle == .oldPhoto {
+            return "Restore".localized
+        }else
+        if generatorStyle == .pretty {
+            return "Change".localized
+        }
+        return "Generate".localized
+    }
 }
 
 extension TSAIUploadPhotoBaseVC {

+ 1 - 4
AIEmoji/Business/VIewTool/TSViewTool.swift

@@ -34,10 +34,7 @@ func kCreateNormalSubmitBtn(title:String, action: (() -> Void)? = nil) -> UIButt
     var buttonDisBgImage = UIImage(named: "submit_btn_dis_bg")!
     buttonDisBgImage = buttonDisBgImage.resizableImage(withCapInsets: UIEdgeInsets(top:24, left: 24, bottom: 24, right: 24), resizingMode: .stretch)
     btn.setBackgroundImage(buttonDisBgImage, for: .disabled)
-    
-    btn.contentEdgeInsets = UIEdgeInsets(top: 0, left: 8, bottom: 0, right: 0)
-    btn.imageEdgeInsets = UIEdgeInsets(top: 0, left: -8, bottom: 0, right: 0)
-    
+    btn.setTitleImageSpace(spacing: 8)
     return btn
 }
 

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

@@ -143,9 +143,9 @@ public class PurchaseManager: NSObject {
     }
 
     @objc public var isVip: Bool {
-//        #if DEBUG
-//            return true
-//        #endif
+        #if DEBUG
+            return true
+        #endif
         guard let expiresDate = expiredDate else {
             return false
         }

+ 18 - 16
AIEmoji/Common/View/TSPhotoPickerManager/TSPhotoPickerManager.swift

@@ -121,22 +121,24 @@ extension TSPhotoPickerManager{
         let maxmbSize = Int(Double(maxBitSize) / (1024 * 1024))
         pickSinglePhoto { [weak self] image,phAsset in
             guard let self = self else { return }
-            if let image = image,let phAsset = phAsset {
-                // 方法2:异步获取详细大小(不阻塞主线程)
-                TSPhotoSizeHelper.getImageFileSizeAsync(asset: phAsset) {[weak self] size in
-                    guard let self = self else { return }
-                    
-                    let mbSize = Double(size) / (1024 * 1024)
-                    print("精确大小: \(mbSize) MB,size = \(size)")
-                    if size > maxBitSize {
-                        self.completionSizeHandler?(nil,String(format: "Photo must be smaller than %dMB.".localized, maxmbSize))
-                    }else{
-                        self.completionSizeHandler?(image,nil)
-                        self.completionSizeHandler = nil
-                        imagePicker.dismiss(animated: true)
-                    }
-                }
-            }else if let image = image {
+//            if let image = image,let phAsset = phAsset {
+//                // 方法2:异步获取详细大小(不阻塞主线程)
+//                TSPhotoSizeHelper.getImageFileSizeAsync(asset: phAsset) {[weak self] size in
+//                    guard let self = self else { return }
+//                    
+//                    let mbSize = Double(size) / (1024 * 1024)
+//                    print("精确大小: \(mbSize) MB,size = \(size)")
+//                    if size > maxBitSize {
+//                        self.completionSizeHandler?(nil,String(format: "Photo must be smaller than %dMB.".localized, maxmbSize))
+//                    }else{
+//                        self.completionSizeHandler?(image,nil)
+//                        self.completionSizeHandler = nil
+//                        imagePicker.dismiss(animated: true)
+//                    }
+//                }
+//            }else
+            
+            if let image = image {
                 if image.isLargerThan(byteSize: maxBitSize) {
                     self.completionSizeHandler?(nil,String(format: "Photo must be smaller than %dMB.".localized, maxmbSize))
                 }else{

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

@@ -224,3 +224,13 @@
 "Week" = "Woche";
 "Open eyes" = "Augen auf";
 "Photo must be smaller than %dMB." = "Foto muss unter %dMB sein";
+
+"Open Eyes" = "Augen Auf";
+"Restore" = "Wiederherstellen";
+"Restoring" = "Wiederherstellen";
+"Make photo live" = "Machen Sie Fotos live";
+
+"Open Eyes" = "睜開眼睛";
+"Restore" = "恢復";
+"Restoring" = "復原中";
+"Make photo live" = "讓照片生動起來";

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

@@ -221,3 +221,8 @@
 "Week" = "Week";
 "Open eyes" = "Open eyes";
 "Photo must be smaller than %dMB." = "Photo must be smaller than %dMB.";
+
+"Open Eyes" = "Open Eyes";
+"Restore" = "Restore";
+"Restoring" = "Restoring";
+"Make photo live" = "Make photo live";

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

@@ -220,3 +220,8 @@
 "Week" = "Semana";
 "Open eyes" = "ojos abiertos";
 "Photo must be smaller than %dMB." = "La foto debe ser menor a %dMB";
+
+"Open Eyes" = "Ojos Abiertos";
+"Restore" = "Restaurar";
+"Restoring" = "Restaurando";
+"Make photo live" = "Hacer foto en vivo";

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

@@ -220,3 +220,8 @@
 "Week" = "週";
 "Open eyes" = "目を開けて";
 "Photo must be smaller than %dMB." = "%dMB以下の写真が必要";
+
+"Open Eyes" = "開いた目";
+"Restore" = "復元する";
+"Restoring" = "復元中";
+"Make photo live" = "写真をライブにする";

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

@@ -220,3 +220,8 @@
 "Week" = "주";
 "Open eyes" = "눈을 뜨다";
 "Photo must be smaller than %dMB." = "%dMB 미만 사진만 가능";
+
+"Open Eyes" = "오픈 아이즈";
+"Restore" = "복원하다";
+"Restoring" = "복원 중";
+"Make photo live" = "사진을 라이브로 만들기";

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

@@ -220,3 +220,8 @@
 "Week" = "Semana";
 "Open eyes" = "Olhos abertos";
 "Photo must be smaller than %dMB." = "A foto deve ter menos de %dMB";
+
+"Open Eyes" = "Olhos Abertos";
+"Restore" = "Restaurar";
+"Restoring" = "Restaurando";
+"Make photo live" = "Transmitir foto ao vivo";

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

@@ -220,3 +220,8 @@
 "Week" = "Semana";
 "Open eyes" = "Olhos abertos";
 "Photo must be smaller than %dMB." = "A foto deve ter menos de %dMB";
+
+"Open Eyes" = "Olhos Abertos";
+"Restore" = "Restaurar";
+"Restoring" = "Restaurando";
+"Make photo live" = "Transmitir foto ao vivo";

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

@@ -220,3 +220,8 @@
 "Week" = "周";
 "Open eyes" = "睁开眼睛";
 "Photo must be smaller than %dMB." = "照片必须小于 %dMB";
+
+"Open Eyes" = "睁开眼睛";
+"Restore" = "恢复";
+"Restoring" = "恢复中";
+"Make photo live" = "让照片生动起来";