"$(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;
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 {
}
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
pipController = AVPictureInPictureController(contentSource: contentSource)
pipController?.delegate = self
- pipController?.canStartPictureInPictureAutomaticallyFromInline = false
+// pipController?.canStartPictureInPictureAutomaticallyFromInline = false
}
@objc func startPictureInPicture(){
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)
}
}
}
--- /dev/null
+////
+//// 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
+// }
+// }
+//}
@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?()