فهرست منبع

增加图片历史浏览下拉 dismiss
优化相册选择跳转流程

100Years 6 روز پیش
والد
کامیت
155231c087

+ 2 - 2
AIEmoji.xcodeproj/project.pbxproj

@@ -2250,7 +2250,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 = 4;
+				CURRENT_PROJECT_VERSION = 5;
 				DEVELOPMENT_TEAM = 65UD255J84;
 				DEVELOPMENT_TEAM = 65UD255J84;
 				ENABLE_USER_SCRIPT_SANDBOXING = NO;
 				ENABLE_USER_SCRIPT_SANDBOXING = NO;
 				GENERATE_INFOPLIST_FILE = YES;
 				GENERATE_INFOPLIST_FILE = YES;
@@ -2289,7 +2289,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 = 4;
+				CURRENT_PROJECT_VERSION = 5;
 				DEVELOPMENT_TEAM = 65UD255J84;
 				DEVELOPMENT_TEAM = 65UD255J84;
 				ENABLE_USER_SCRIPT_SANDBOXING = NO;
 				ENABLE_USER_SCRIPT_SANDBOXING = NO;
 				GENERATE_INFOPLIST_FILE = YES;
 				GENERATE_INFOPLIST_FILE = YES;

+ 9 - 5
AIEmoji/Business/TSAILIstVC/TSAIAgeImageHintVC/TSAIListHintBaseVC.swift

@@ -213,12 +213,16 @@ class TSAIListHintBaseVC: TSBaseVC {
             if let errorString = errorString {
             if let errorString = errorString {
                 TSToastShared.showToast(text: errorString)
                 TSToastShared.showToast(text: errorString)
             }else{
             }else{
-                kDelayMainShort {
-                    self.dismiss(animated: true) {
-                        self.clickUpImageHandle?(image)
-                    }
-                }
+                self.clickUpImageHandle?(image)
             }
             }
         }
         }
+        
+  
+    }
+    
+    func dismissPageVC(){
+        self.view.isHidden = true
+        self.photoPickerManager.dismissPageVC()
+        self.dismiss()
     }
     }
 }
 }

+ 16 - 6
AIEmoji/Business/TSAILIstVC/TSAILIstVC/TSAILIstVC.swift

@@ -52,10 +52,10 @@ class TSAILIstVC: TSBaseVC {
                    guard let self = self else { return }
                    guard let self = self else { return }
                     enterSelectPhotos(
                     enterSelectPhotos(
                         userDefaultsKey: "isFirstAIEyeOpenPhoto",
                         userDefaultsKey: "isFirstAIEyeOpenPhoto",
-                        maxBitSize: kUploadImageMaxBit10Size,
-                        config:.defaultConfig
+                        maxBitSize: kUploadImageMaxBit5Size,
+                        config: .getDefaultConfig(imageMaxBitSize: kUploadImageMaxBit5Size)
                     ) { image in
                     ) { image in
-                        let baseVc = TSAIUploadPhotoBaseVC(titleString: model.leftTitle ?? "",upLoadImage: image,imageMaxBitSize: kUploadImageMaxBit10Size, generatorStyle: .eyeOpen)
+                        let baseVc = TSAIUploadPhotoBaseVC(titleString: model.leftTitle ?? "",upLoadImage: image,imageMaxBitSize: kUploadImageMaxBit5Size, generatorStyle: .eyeOpen)
                         kPushVC(target: self, modelVC: baseVc)
                         kPushVC(target: self, modelVC: baseVc)
                     }
                     }
         }))
         }))
@@ -185,6 +185,7 @@ class TSAILIstVC: TSBaseVC {
 
 
     }()
     }()
     
     
+    var hintBaseVC:TSAIListHintBaseVC = TSAIListHintBaseVC(config: .defaultConfig)
     //###################################### 导航栏 view ######################################
     //###################################### 导航栏 view ######################################
 
 
     lazy var vipBtn: UIButton = {
     lazy var vipBtn: UIButton = {
@@ -338,18 +339,23 @@ extension TSAILIstVC{
     
     
     
     
     func presentModalHintVC(config:TSAIListHintBaseVC.Config,complete:@escaping (UIImage)->Void){
     func presentModalHintVC(config:TSAIListHintBaseVC.Config,complete:@escaping (UIImage)->Void){
-        let vc = TSAIListHintBaseVC(config: config) { image in
+        hintBaseVC = TSAIListHintBaseVC(config: config) { [weak self] image in
+            guard let self = self else { return }
             if let image = image {
             if let image = image {
                 complete(image)
                 complete(image)
             }else{
             }else{
                 dePrint("图片异常")
                 dePrint("图片异常")
             }
             }
+            kDelayMainShort {
+                self.hintBaseVC.dismissPageVC()
+            }
         }
         }
-        kPresentModalVC(target: self, modelVC: vc,transitionStyle: .crossDissolve)
+        kPresentModalVC(target: self, modelVC: hintBaseVC,transitionStyle: .crossDissolve)
     }
     }
     
     
     func pickSinglePhoto(maxBitSize:Int,complete: @escaping (UIImage)->Void)  {
     func pickSinglePhoto(maxBitSize:Int,complete: @escaping (UIImage)->Void)  {
-        photoPickerManager.pickSinglePhoto(maxBitSize: maxBitSize) { image, errorString in
+        photoPickerManager.pickSinglePhoto(maxBitSize: maxBitSize) { [weak self] image, errorString in
+            guard let self = self else { return }
             if let errorString = errorString {
             if let errorString = errorString {
                 TSToastShared.showToast(text: errorString)
                 TSToastShared.showToast(text: errorString)
             }else if let image = image {
             }else if let image = image {
@@ -357,6 +363,10 @@ extension TSAILIstVC{
             }else{
             }else{
                 dePrint("图片异常")
                 dePrint("图片异常")
             }
             }
+            kDelayMainShort {
+                self.photoPickerManager.dismissPageVC()
+            }
+            
         }
         }
     }
     }
 }
 }

+ 32 - 59
AIEmoji/Business/TSPTPGeneratorVC/TSAIPhotoGeneratorBaseVC/TSAIPhotoBrowseVC.swift

@@ -55,24 +55,6 @@ class TSAIPhotoBrowseVC: TSBaseVC {
         }
         }
         return collectionView
         return collectionView
     }()
     }()
-    
-    
-//    lazy var leftBtn: UIButton = {
-//        let leftBtn = UIButton.createButton(image: UIImage(named: "page_left")){ [weak self]  in
-//            guard let self = self else { return }
-//            self.collectionView.scrollToItem(at:  IndexPath(item: self.currentIndex-1, section: 0), at: .left, animated: true)
-//        }
-//        return leftBtn
-//    }()
-//    
-//    lazy var rightBtn: UIButton = {
-//        let rightBtn = UIButton.createButton(image: UIImage(named: "page_right")){ [weak self]  in
-//            guard let self = self else { return }
-//            self.collectionView.scrollToItem(at: IndexPath(item: self.currentIndex+1, section: 0), at: .left, animated: true)
-//        }
-//        return rightBtn
-//    }()
-        
 
 
     //保存按钮
     //保存按钮
     lazy var bigSaveBtn: UIButton = {
     lazy var bigSaveBtn: UIButton = {
@@ -104,23 +86,8 @@ class TSAIPhotoBrowseVC: TSBaseVC {
         collectionView.snp.makeConstraints { make in
         collectionView.snp.makeConstraints { make in
             make.edges.equalTo(0)
             make.edges.equalTo(0)
         }
         }
-        
-//        contentView.addSubview(leftBtn)
-//        leftBtn.snp.makeConstraints { make in
-//            make.leading.equalTo(17)
-//            make.centerY.equalToSuperview()
-//            make.width.height.equalTo(40)
-//        }
-//        
-//        contentView.addSubview(rightBtn)
-//        rightBtn.snp.makeConstraints { make in
-//            make.trailing.equalTo(-18)
-//            make.centerY.equalToSuperview()
-//            make.width.height.equalTo(40)
-//        }
-        
+
         DispatchQueue.main.async {
         DispatchQueue.main.async {
-//        kDelayMainShort {
             self.collectionView.isHidden = false
             self.collectionView.isHidden = false
             self.collectionView.reloadData()
             self.collectionView.reloadData()
             self.collectionView.setContentOffset(CGPoint(x: CGFloat(self.currentIndex) * self.collectionView.frame.size.width, y: 0), animated: false)
             self.collectionView.setContentOffset(CGPoint(x: CGFloat(self.currentIndex) * self.collectionView.frame.size.width, y: 0), animated: false)
@@ -149,6 +116,11 @@ class TSAIPhotoBrowseVC: TSBaseVC {
         }
         }
     }
     }
     
     
+    override func dealThings() {
+        // 添加下拉手势
+        let panGesture = UIPanGestureRecognizer(target: self, action: #selector(handleDismissPan(_:)))
+        view.addGestureRecognizer(panGesture)
+    }
     @objc func clickSubmitBtn(){
     @objc func clickSubmitBtn(){
         
         
         if JudgeVip(){
         if JudgeVip(){
@@ -180,22 +152,33 @@ class TSAIPhotoBrowseVC: TSBaseVC {
 
 
 
 
 extension TSAIPhotoBrowseVC {
 extension TSAIPhotoBrowseVC {
-    
+    // 手势处理方法
+    @objc func handleDismissPan(_ gesture: UIPanGestureRecognizer) {
+        let translation = gesture.translation(in: gesture.view?.superview)
+        let velocity = gesture.velocity(in: gesture.view?.superview)
+        
+        switch gesture.state {
+        case .changed:
+            // 跟随手指移动
+            if translation.y > 0 {
+                gesture.view?.transform = CGAffineTransform(translationX: 0, y: translation.y)
+            }
+        case .ended:
+            // 判断是否应该关闭
+            if translation.y > 200 || velocity.y > 1000 {
+                dismiss(animated: true, completion: nil)
+            } else {
+                // 恢复原状
+                UIView.animate(withDuration: 0.3) {
+                    gesture.view?.transform = .identity
+                }
+            }
+        default:
+            break
+        }
+    }
     func reloadUI() {
     func reloadUI() {
-//        //判断前后是否还有,以此来确定左右翻页按钮
-//        var isHiddenLeft = false
-//        var isHiddenRight = false
-//        if dataModelArray.count == 1{
-//            isHiddenLeft = true
-//            isHiddenRight = true
-//        }else if currentIndex == 0 {
-//            isHiddenLeft = true
-//        }else if currentIndex+1 >= dataModelArray.count {
-//            isHiddenRight = true
-//        }
-//        
-//        leftBtn.isHidden = isHiddenLeft
-//        rightBtn.isHidden = isHiddenRight
+
     }
     }
 }
 }
 
 
@@ -287,25 +270,15 @@ class TSAIPhotoBrowseCell : TSBaseCollectionCell{
             make.top.equalTo(-5)
             make.top.equalTo(-5)
             make.trailing.equalTo(5)
             make.trailing.equalTo(5)
         }
         }
-        
-//        contentView.addSubview(exampleView)
-//        exampleView.snp.makeConstraints { make in
-//            make.bottom.equalTo(-(44+8+k_Height_safeAreaInsetsBottom()+20))
-//            make.centerX.equalToSuperview()
-//            make.height.equalTo(20)
-//        }
-        
     }
     }
     
     
     var model:TSActionInfoModel = TSActionInfoModel(){
     var model:TSActionInfoModel = TSActionInfoModel(){
         didSet{
         didSet{
             dePrint("TSAIPhotoBrowseCell didSet model")
             dePrint("TSAIPhotoBrowseCell didSet model")
             if model.modelType == .example {
             if model.modelType == .example {
-//                exampleView.isHidden = false
                 netWorkImageView.image = UIImage(named:model.response.resultUrl)
                 netWorkImageView.image = UIImage(named:model.response.resultUrl)
                 netWorkImageView.adaptiveScale()
                 netWorkImageView.adaptiveScale()
             }else{
             }else{
-//                exampleView.isHidden = true
                 netWorkImageView.setAsyncImage(urlString: model.response.resultUrl,placeholder: kPlaceholderImage,contentMode: .scaleAspectFit, completion: { [weak self] image in
                 netWorkImageView.setAsyncImage(urlString: model.response.resultUrl,placeholder: kPlaceholderImage,contentMode: .scaleAspectFit, completion: { [weak self] image in
                     guard let self = self else { return }
                     guard let self = self else { return }
                     netWorkImageView.adaptiveScale()
                     netWorkImageView.adaptiveScale()

+ 9 - 2
AIEmoji/Business/TSPTPGeneratorVC/TSPTPInputVC/TSPTPInputVC.swift

@@ -23,6 +23,9 @@ class TSPTPInputVC: TSBaseVC {
         return photoPickerManager
         return photoPickerManager
     }()
     }()
     
     
+    
+    var hintBaseVC = TSAIListHintBaseVC(config: .defaultConfig)
+    
     //###################################### 导航栏 view ######################################
     //###################################### 导航栏 view ######################################
 
 
     lazy var vipBtn: UIButton = {
     lazy var vipBtn: UIButton = {
@@ -92,6 +95,9 @@ class TSPTPInputVC: TSBaseVC {
                 viewModel.upLoadImage = image
                 viewModel.upLoadImage = image
                 uploadView.upLoadImage = image
                 uploadView.upLoadImage = image
             }
             }
+            kDelayMainShort {
+                self.photoPickerManager.dismissPageVC()
+            }
         }
         }
     }
     }
     
     
@@ -332,12 +338,13 @@ extension TSPTPInputVC {
     }
     }
     
     
     func presentModalHintVC(){
     func presentModalHintVC(){
-        let vc = TSAIListHintBaseVC(config: .defaultConfig) { [weak self] image in
+        hintBaseVC = TSAIListHintBaseVC(config: .defaultConfig) { [weak self] image in
             guard let self = self else { return }
             guard let self = self else { return }
             viewModel.upLoadImage = image
             viewModel.upLoadImage = image
             uploadView.upLoadImage = image
             uploadView.upLoadImage = image
+            hintBaseVC.dismissPageVC()
         }
         }
-        kPresentModalVC(target: self, modelVC: vc,transitionStyle: .crossDissolve)
+        kPresentModalVC(target: self, modelVC: hintBaseVC,transitionStyle: .crossDissolve)
     }
     }
     
     
     func setUpCusStackView(){
     func setUpCusStackView(){

+ 1 - 4
AIEmoji/Business/TSPTPGeneratorVC/TSPhotoToPhotoVC/TSPhotoToPhotoVC.swift

@@ -198,15 +198,12 @@ class TSPhotoToPhotoVC: TSBaseVC {
                 for itemModel in sections.items {
                 for itemModel in sections.items {
                     dataModelArray.append(itemModel.dataModel)
                     dataModelArray.append(itemModel.dataModel)
                 }
                 }
-                
-//                let browseVC = TSPTPBrowseVC()
+            
                 let browseVC = TSAIPhotoBrowseVC()
                 let browseVC = TSAIPhotoBrowseVC()
                 browseVC.dataModelArray = dataModelArray
                 browseVC.dataModelArray = dataModelArray
                 browseVC.currentIndex = indexPath.item
                 browseVC.currentIndex = indexPath.item
                 kPresentModalVC(target: self, modelVC: browseVC,transitionStyle: .crossDissolve)
                 kPresentModalVC(target: self, modelVC: browseVC,transitionStyle: .crossDissolve)
             }
             }
-
-
         }
         }
 
 
         return cp
         return cp

+ 34 - 25
AIEmoji/Common/View/TSPhotoPickerManager/TSPhotoPickerManager.swift

@@ -82,6 +82,10 @@ class TSPhotoPickerManager: NSObject {
         })
         })
         viewController?.present(alert, animated: true, completion: nil)
         viewController?.present(alert, animated: true, completion: nil)
     }
     }
+    
+    deinit {
+        debugPrint("♻️♻️♻️ TSPhotoPickerManager -> TSPhotoPickerManager deinit ♻️♻️♻️")
+    }
 }
 }
 
 
 // MARK: - UIImagePickerControllerDelegate & UINavigationControllerDelegate (iOS 14 以下)
 // MARK: - UIImagePickerControllerDelegate & UINavigationControllerDelegate (iOS 14 以下)
@@ -121,35 +125,40 @@ extension TSPhotoPickerManager{
         let maxmbSize = Int(Double(maxBitSize) / (1024 * 1024))
         let maxmbSize = Int(Double(maxBitSize) / (1024 * 1024))
         pickSinglePhoto { [weak self] image,phAsset in
         pickSinglePhoto { [weak self] image,phAsset in
             guard let self = self else { return }
             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
+            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)
 //                        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{
-                    self.completionSizeHandler?(image,nil)
-                    self.completionSizeHandler = nil
-                    imagePicker.dismiss(animated: true)
+                    }
                 }
                 }
             }else{
             }else{
-                self.completionSizeHandler?(nil,nil)
-                imagePicker.dismiss(animated: true)
+                if let image = image {
+                    if image.isLargerThan(byteSize: 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{
+                    self.completionSizeHandler?(nil,nil)
+//                    imagePicker.dismiss(animated: true)
+                }
             }
             }
         }
         }
     }
     }
+    
+    func dismissPageVC(){
+        self.imagePicker.view.isHidden = true
+        self.imagePicker.dismiss(animated: true)
+    }
 }
 }

+ 1 - 1
AIEmoji/es.lproj/Localizable.strings

@@ -216,7 +216,7 @@
 "Obvious hairstyle, Fully clear and visible face" = "Peinado evidente, Rostro totalmente claro y visible.";
 "Obvious hairstyle, Fully clear and visible face" = "Peinado evidente, Rostro totalmente claro y visible.";
 "Group photos, covered faces, skinhead" = "Fotos de grupo, caras cubiertas, skinhead.";
 "Group photos, covered faces, skinhead" = "Fotos de grupo, caras cubiertas, skinhead.";
 "Hair Salon" = "Peluquería";
 "Hair Salon" = "Peluquería";
-"Be Pretty" = "ser bonita";
+"Be Pretty" = "Ser bonita";
 "Week" = "Semana";
 "Week" = "Semana";
 "Open eyes" = "ojos abiertos";
 "Open eyes" = "ojos abiertos";
 "Photo must be smaller than %dMB." = "La foto debe ser menor a %dMB";
 "Photo must be smaller than %dMB." = "La foto debe ser menor a %dMB";