优化了字幕翻译
authorliangzhenying <867174124@qq.com>
Wed, 25 Mar 2026 09:25:53 +0000 (17:25 +0800)
committerliangzhenying <867174124@qq.com>
Wed, 25 Mar 2026 09:25:53 +0000 (17:25 +0800)
ShenYin/ShenYin.xcodeproj/project.pbxproj
ShenYin/ShenYin/Cache/SubTitleCache.swift
ShenYin/ShenYin/UI/Home/SubTitle/PipContentVC.swift
ShenYin/ShenYin/UI/Home/SubTitle/PipManager2.swift [new file with mode: 0644]
ShenYin/ShenYin/UI/Home/SubTitle/SubTitleSetVC.swift

index 89833d6..9df6c43 100644 (file)
                                        "$(PROJECT_DIR)/ShenYin/Sdk/JoySdk",
                                        "$(PROJECT_DIR)/ShenYin/Sdk/JoySdk/tool",
                                        "$(PROJECT_DIR)/ShenYin/Channel/DeepChords/JoySdk/tool",
+                                       "$(PROJECT_DIR)/ShenYin/Channel/DeepChords/Sdk",
                                );
                                GENERATE_INFOPLIST_FILE = YES;
                                INFOPLIST_FILE = ShenYin/Channel/PLAYBOY/PLAYBOY.plist;
                                        "$(PROJECT_DIR)/ShenYin/Sdk/JoySdk/tool",
                                        "$(PROJECT_DIR)/DeepChordsSdk",
                                        "$(PROJECT_DIR)/ShenYin/Channel/DeepChords/JoySdk/tool",
+                                       "$(PROJECT_DIR)/ShenYin/Channel/DeepChords/Sdk",
                                );
                                GENERATE_INFOPLIST_FILE = YES;
                                INFOPLIST_FILE = ShenYin/Channel/PLAYBOY/PLAYBOY.plist;
index 794accb..1af6607 100644 (file)
@@ -45,18 +45,26 @@ enum SubTitleFontType:Int,HandyJSONEnum{
 enum SubTitleSoureType:Int,HandyJSONEnum{
     case mic = 0
     case phone = 1
+    
+    static var all:[SubTitleSoureType] = [.mic,.phone]
 
     var title:String{
         switch self {
         case .mic:
-            return "麦克风".l10n
+            return "耳机外部声音".l10n
         case .phone:
-            return "仅手机内部".l10n
+            return "耳机内部声音".l10n
         }
     }
-    var font:UIFont{
-        return .regular(CGFloat(self.rawValue))
+    var des:String{
+        switch self {
+        case .mic:
+            return "适用于参加现场讲座、会议等线下场景".l10n
+        case .phone:
+            return "适用于看视频时实时翻译字幕".l10n
+        }
     }
+
 }
 
 class SubTitleCacheModel:NSObject,HandyJSON,NSCoding {
index 93687ac..7bcb035 100644 (file)
@@ -21,7 +21,13 @@ class PipManager:NSObject,AVPictureInPictureControllerDelegate{
         }
         
         contentVC = PipContentVC()
-        contentVC.preferredContentSize = CGSizeMake(kScreenWid, 200)
+        let cache = SubTitleCache.shared.get()
+        if cache.showType == .all {
+            contentVC.preferredContentSize = CGSizeMake(kScreenWid, 100)
+        }
+        else{
+            contentVC.preferredContentSize = CGSizeMake(kScreenWid, 50)
+        }
         let contentSource = AVPictureInPictureController.ContentSource(
             activeVideoCallSourceView:soureceView ,
             contentViewController: contentVC
@@ -29,7 +35,7 @@ class PipManager:NSObject,AVPictureInPictureControllerDelegate{
         
         pipController = AVPictureInPictureController(contentSource: contentSource)
         pipController?.delegate = self
-        pipController?.canStartPictureInPictureAutomaticallyFromInline = false
+//        pipController?.canStartPictureInPictureAutomaticallyFromInline = false
     }
     
     @objc func startPictureInPicture(){
@@ -80,83 +86,113 @@ class PipManager:NSObject,AVPictureInPictureControllerDelegate{
     func pictureInPictureControllerDidStopPictureInPicture(_ pictureInPictureController: AVPictureInPictureController) {
         print("🛑 画中画已结束")
     }
-    
 }
 
 
 
-
-
-
-
 // 画中画内容视图控制器
 @available(iOS 15.0, *)
 class PipContentVC : AVPictureInPictureVideoCallViewController {
-    var textView = UITextView()
-    var translateTextView = UITextView()
+    var textView = UILabel()
+    var translateTextView = UILabel()
+    var line = UIView()
     
     override func viewDidLoad() {
         super.viewDidLoad()
-        view.addSubviews([textView,translateTextView])
+        view.addSubviews([textView,translateTextView,line])
         view.backgroundColor = .black
         reset()
     }
     
     func updateRaw(_ text: String) {
         textView.text = text
-        textView.scrollRangeToVisible(NSRange(location: textView.text.count, length: 0))
+//        textView.scrollRangeToVisible(NSRange(location: textView.text.count, length: 0))
     }
     
     func updateTrans(_ text : String) {
         translateTextView.text = text
-        translateTextView.scrollRangeToVisible(NSRange(location: translateTextView.text.count, length: 0))
+//        translateTextView.scrollRangeToVisible(NSRange(location: translateTextView.text.count, length: 0))
     }
     func reset(){
+        
+//        setClearView()
+        
         if (textView.superview == nil) {
             return
         }
         let cache = SubTitleCache.shared.get()
+        if cache.showType == .all {
+            preferredContentSize = CGSizeMake(kScreenWid, 100)
+        }
+        else{
+            preferredContentSize = CGSizeMake(kScreenWid, 50)
+        }
         
         textView.do { v in
             v.textColor = .rgb(0xD8D8D8)
             v.font = cache.fontType.font
             v.backgroundColor = .clear
+            v.adjustsFontSizeToFitWidth = true
+            v.numberOfLines = 0
         }
         
         translateTextView.do { v in
             v.textColor = .white
             v.font = cache.fontType.font
             v.backgroundColor = .clear
+            v.adjustsFontSizeToFitWidth = true
+            v.numberOfLines = 0
         }
+        line.backgroundColor = .color(.separateLine).withAlphaComponent(0.5)
+        
         
         if cache.showType == .all {
             textView.snp.remakeConstraints { make in
-                make.top.equalToSuperview().inset(50)
+                make.top.equalToSuperview().inset(10)
                 make.leading.trailing.equalToSuperview().inset(16)
                 make.bottom.equalTo(view.snp.centerY)
             }
             translateTextView.snp.remakeConstraints { make in
                 make.leading.trailing.equalToSuperview().inset(16)
                 make.top.equalTo(textView.snp.bottom).offset(2)
-                make.bottom.equalToSuperview().inset(16)
+                make.bottom.equalToSuperview().inset(10)
+            }
+            line.snp.remakeConstraints { make in
+                make.bottom.equalTo(textView.snp.bottom)
+                make.leading.trailing.equalToSuperview().inset(16)
+                make.height.equalTo(0.5)
             }
             textView.isHidden = false
             translateTextView.isHidden = false
+            line.isHidden = false
         }
         else if cache.showType == .from {
             textView.snp.remakeConstraints { make in
-                make.top.bottom.equalToSuperview().inset(50)
+                make.top.bottom.equalToSuperview().inset(10)
                 make.leading.trailing.equalToSuperview().inset(16)
             }
             textView.isHidden = false
             translateTextView.isHidden = true
+            line.isHidden = true
         } else {
             translateTextView.snp.remakeConstraints { make in
-                make.top.bottom.equalToSuperview().inset(50)
+                make.top.bottom.equalToSuperview().inset(10)
                 make.leading.trailing.equalToSuperview().inset(16)
             }
             textView.isHidden = true
             translateTextView.isHidden = false
+            line.isHidden = true
+        }
+    }
+    func setClearView(){
+        for window in UIApplication.shared.windows {
+            finedView(window)
+        }
+    }
+    func finedView(_ sView:UIView){
+        sView.backgroundColor = .clear
+        for v in sView.subviews {
+            finedView(v)
         }
     }
 }
diff --git a/ShenYin/ShenYin/UI/Home/SubTitle/PipManager2.swift b/ShenYin/ShenYin/UI/Home/SubTitle/PipManager2.swift
new file mode 100644 (file)
index 0000000..e5fdd2a
--- /dev/null
@@ -0,0 +1,169 @@
+////
+////  Untitled.swift
+////  ShenYin
+////
+////  Created by liangshi on 2026/3/23.
+////
+//
+////
+////  Untitled.swift
+////  ShenYin
+////
+////  Created by liangshi on 2026/3/5.
+////
+//
+//import AVKit
+//import UIKit
+//
+//@available(iOS 15.0, *)
+//class PipManager:NSObject,AVPictureInPictureControllerDelegate{
+//    var pipController: AVPictureInPictureController?
+//    var contentVC: PipContentVC!
+//    
+//    
+//    func setupPictureInPicture(soureceView:UIView) {
+//        guard AVPictureInPictureController.isPictureInPictureSupported() else {
+//            print("❌ 设备不支持画中画")
+//            return
+//        }
+//        
+//        contentVC = PipContentVC()
+//        contentVC.preferredContentSize = CGSizeMake(kScreenWid, 200)
+//        let contentSource = AVPictureInPictureController.ContentSource(
+//            activeVideoCallSourceView:soureceView ,
+//            contentViewController: contentVC
+//        )
+//        
+//        pipController = AVPictureInPictureController(contentSource: contentSource)
+//        pipController?.delegate = self
+//        pipController?.canStartPictureInPictureAutomaticallyFromInline = false
+//    }
+//    
+//    @objc func startPictureInPicture(){
+//        guard let pipController = pipController else {
+//            print("❌ pipController 未初始化,无法启动画中画")
+//            return
+//        }
+//        
+//        if pipController.isPictureInPicturePossible {
+//            print("✅ 画中画可以启动,准备开始...")
+//            pipController.startPictureInPicture()
+//            contentVC?.reset()
+//        } else {
+//            print("❌ 画中画当前无法启动")
+//        }
+//    }
+//    @objc func stopPictureInPicture() {
+//        guard let pipController = pipController else {
+//            print("❌ pipController 未初始化,无法停止画中画")
+//            return
+//        }
+//        
+//        if pipController.isPictureInPictureActive {
+//            print("✅ 画中画正在显示,准备停止...")
+//            pipController.stopPictureInPicture()
+//            print("✅ 画中画已停止")
+//        } else {
+//            print("⚠️ 画中画当前未显示")
+//        }
+//    }
+//    
+//    func pictureInPictureControllerWillStartPictureInPicture(_ pictureInPictureController: AVPictureInPictureController) {
+//        print("画中画即将开始")
+//    }
+//    
+//    func pictureInPictureControllerDidStartPictureInPicture(_ pictureInPictureController: AVPictureInPictureController) {
+//        print("✅ 画中画已开始")
+//    }
+//    
+//    func pictureInPictureController(_ pictureInPictureController: AVPictureInPictureController, failedToStartPictureInPictureWithError error: Error) {
+//        print("❌ 画中画启动失败: \(error)")
+//    }
+//    
+//    func pictureInPictureControllerWillStopPictureInPicture(_ pictureInPictureController: AVPictureInPictureController) {
+//        print("⏹️ 画中画即将结束")
+//    }
+//    
+//    func pictureInPictureControllerDidStopPictureInPicture(_ pictureInPictureController: AVPictureInPictureController) {
+//        print("🛑 画中画已结束")
+//    }
+//    
+//}
+//
+//
+//
+//
+//
+//
+//
+//// 画中画内容视图控制器
+//@available(iOS 15.0, *)
+//class PipContentVC : AVPictureInPictureVideoCallViewController {
+//    var textView = UITextView()
+//    var translateTextView = UITextView()
+//    
+//    override func viewDidLoad() {
+//        super.viewDidLoad()
+//        view.addSubviews([textView,translateTextView])
+//        view.backgroundColor = .black
+//        reset()
+//    }
+//    
+//    func updateRaw(_ text: String) {
+//        textView.text = text
+//        textView.scrollRangeToVisible(NSRange(location: textView.text.count, length: 0))
+//    }
+//    
+//    func updateTrans(_ text : String) {
+//        translateTextView.text = text
+//        translateTextView.scrollRangeToVisible(NSRange(location: translateTextView.text.count, length: 0))
+//    }
+//    func reset(){
+//        if (textView.superview == nil) {
+//            return
+//        }
+//        let cache = SubTitleCache.shared.get()
+//        
+//        textView.do { v in
+//            v.textColor = .rgb(0xD8D8D8)
+//            v.font = cache.fontType.font
+//            v.backgroundColor = .clear
+//        }
+//        
+//        translateTextView.do { v in
+//            v.textColor = .white
+//            v.font = cache.fontType.font
+//            v.backgroundColor = .clear
+//        }
+//        
+//        if cache.showType == .all {
+//            textView.snp.remakeConstraints { make in
+//                make.top.equalToSuperview().inset(50)
+//                make.leading.trailing.equalToSuperview().inset(16)
+//                make.bottom.equalTo(view.snp.centerY)
+//            }
+//            translateTextView.snp.remakeConstraints { make in
+//                make.leading.trailing.equalToSuperview().inset(16)
+//                make.top.equalTo(textView.snp.bottom).offset(2)
+//                make.bottom.equalToSuperview().inset(16)
+//            }
+//            textView.isHidden = false
+//            translateTextView.isHidden = false
+//        }
+//        else if cache.showType == .from {
+//            textView.snp.remakeConstraints { make in
+//                make.top.bottom.equalToSuperview().inset(50)
+//                make.leading.trailing.equalToSuperview().inset(16)
+//            }
+//            textView.isHidden = false
+//            translateTextView.isHidden = true
+//        } else {
+//            translateTextView.snp.remakeConstraints { make in
+//                make.top.bottom.equalToSuperview().inset(50)
+//                make.leading.trailing.equalToSuperview().inset(16)
+//            }
+//            textView.isHidden = true
+//            translateTextView.isHidden = false
+//        }
+//    }
+//}
index cf9f7a8..8eaf70d 100644 (file)
@@ -97,13 +97,14 @@ extension SubTitleSetVC{
     
     @objc func sourceTypeAction(){
         let cache = SubTitleCache.shared.get()
-        let list:[SubTitleSoureType] = [.mic,.phone]
-        let picker = CustomPicker(title: "声音源".l10n, list: list.map{$0.title})
+        let list:[SubTitleSoureType] = SubTitleSoureType.all
+        let dataList = [CustomPickerModel(title: list[0].title,detail: list[0].des),CustomPickerModel(title: list[1].title,detail: list[1].des)]
+        let picker = CustomPicker4(title: "声音源".l10n, list: dataList)
         picker.selectedIndex = list.firstIndex(where: {cache.sourceType.title == $0.title})!
         picker.show()
         picker.didSelected = {[weak self] (index,value) in
             guard let self = self else { return  }
-            cache.sourceType = list.first(where: {$0.title == value})!
+            cache.sourceType = list.first(where: {$0.title == value.title})!
             SubTitleCache.shared.save(cache)
             tableView.reloadData()
             soureChanged?()