PAXA修改UI dev master paisa
authorliangzhenying <867174124@qq.com>
Thu, 9 Apr 2026 01:59:04 +0000 (09:59 +0800)
committerliangzhenying <867174124@qq.com>
Thu, 9 Apr 2026 01:59:04 +0000 (09:59 +0800)
71 files changed:
ShenYin/ShenYin.xcodeproj/project.pbxproj
ShenYin/ShenYin/Channel/DeepChords/Channel/Config/CCConfig.swift
ShenYin/ShenYin/Channel/DeepChords/Channel/UI/JoyChinese2EnglishVC.swift
ShenYin/ShenYin/Channel/DeepChords/Channel/UI/JoyDialogTranslateVC.swift
ShenYin/ShenYin/Channel/DeepChords/Channel/UI/JoyTctyVC.swift
ShenYin/ShenYin/Channel/DeepChords/DeepChords.xcassets/home/pop_pause.imageset/Contents.json [moved from ShenYin/ShenYin/Channel/DeepChords/DeepChords.xcassets/home/record_pause 3.imageset/Contents.json with 100% similarity]
ShenYin/ShenYin/Channel/DeepChords/DeepChords.xcassets/home/pop_pause.imageset/Group_2274@2x.png [moved from ShenYin/ShenYin/Channel/DeepChords/DeepChords.xcassets/home/record_pause 3.imageset/Group_2274@2x.png with 100% similarity]
ShenYin/ShenYin/Channel/DeepChords/DeepChords.xcassets/home/pop_pause.imageset/Group_2274@3x.png [moved from ShenYin/ShenYin/Channel/DeepChords/DeepChords.xcassets/home/record_pause 3.imageset/Group_2274@3x.png with 100% similarity]
ShenYin/ShenYin/Channel/DeepChords/DeepChords.xcassets/home/pop_play.imageset/Contents.json [moved from ShenYin/ShenYin/Channel/DeepChords/DeepChords.xcassets/home/record_play 3.imageset/Contents.json with 100% similarity]
ShenYin/ShenYin/Channel/DeepChords/DeepChords.xcassets/home/pop_play.imageset/Group_2275@2x.png [moved from ShenYin/ShenYin/Channel/DeepChords/DeepChords.xcassets/home/record_play 3.imageset/Group_2275@2x.png with 100% similarity]
ShenYin/ShenYin/Channel/DeepChords/DeepChords.xcassets/home/pop_play.imageset/Group_2275@3x.png [moved from ShenYin/ShenYin/Channel/DeepChords/DeepChords.xcassets/home/record_play 3.imageset/Group_2275@3x.png with 100% similarity]
ShenYin/ShenYin/Channel/PLAYBOY/Channel/Config/CCConfig.swift
ShenYin/ShenYin/Channel/PLAYBOY/Channel/UI/PbChinese2EnglishVC.swift
ShenYin/ShenYin/Channel/PLAYBOY/Channel/UI/PbDialogTranslateVC.swift
ShenYin/ShenYin/Channel/PLAYBOY/Channel/UI/PbSubTitleVC.swift
ShenYin/ShenYin/Channel/PLAYBOY/Channel/UI/PbTctyVC.swift
ShenYin/ShenYin/Channel/PLAYBOY/PLAYBOY.xcassets/home/pop_pause.imageset/Contents.json [moved from ShenYin/ShenYin/Channel/PLAYBOY/PLAYBOY.xcassets/home/record_pause 3.imageset/Contents.json with 100% similarity]
ShenYin/ShenYin/Channel/PLAYBOY/PLAYBOY.xcassets/home/pop_pause.imageset/Group_2274@2x.png [moved from ShenYin/ShenYin/Channel/PLAYBOY/PLAYBOY.xcassets/home/record_pause 3.imageset/Group_2274@2x.png with 100% similarity]
ShenYin/ShenYin/Channel/PLAYBOY/PLAYBOY.xcassets/home/pop_pause.imageset/Group_2274@3x.png [moved from ShenYin/ShenYin/Channel/PLAYBOY/PLAYBOY.xcassets/home/record_pause 3.imageset/Group_2274@3x.png with 100% similarity]
ShenYin/ShenYin/Channel/PLAYBOY/PLAYBOY.xcassets/home/pop_play.imageset/Contents.json [moved from ShenYin/ShenYin/Channel/PLAYBOY/PLAYBOY.xcassets/home/record_play 3.imageset/Contents.json with 100% similarity]
ShenYin/ShenYin/Channel/PLAYBOY/PLAYBOY.xcassets/home/pop_play.imageset/Group_2275@2x.png [moved from ShenYin/ShenYin/Channel/PLAYBOY/PLAYBOY.xcassets/home/record_play 3.imageset/Group_2275@2x.png with 100% similarity]
ShenYin/ShenYin/Channel/PLAYBOY/PLAYBOY.xcassets/home/pop_play.imageset/Group_2275@3x.png [moved from ShenYin/ShenYin/Channel/PLAYBOY/PLAYBOY.xcassets/home/record_play 3.imageset/Group_2275@3x.png with 100% similarity]
ShenYin/ShenYin/Channel/PaXa/Config/CCConfig.swift
ShenYin/ShenYin/Channel/PaXa/Config/Chinese2EnglishRecordBar.swift [new file with mode: 0644]
ShenYin/ShenYin/Channel/PaXa/Config/DialogRecordBar.swift [new file with mode: 0644]
ShenYin/ShenYin/Channel/PaXa/Config/FieldRecordBar.swift [new file with mode: 0644]
ShenYin/ShenYin/Channel/PaXa/PaXa.xcassets/home/btn_record_normal.imageset/Contents.json
ShenYin/ShenYin/Channel/PaXa/PaXa.xcassets/home/btn_record_normal.imageset/Group 2104@2x.png [deleted file]
ShenYin/ShenYin/Channel/PaXa/PaXa.xcassets/home/btn_record_normal.imageset/Group 2104@3x.png [deleted file]
ShenYin/ShenYin/Channel/PaXa/PaXa.xcassets/home/btn_record_normal.imageset/Slice 324@2x.png [new file with mode: 0644]
ShenYin/ShenYin/Channel/PaXa/PaXa.xcassets/home/btn_record_normal.imageset/Slice 324@3x.png [new file with mode: 0644]
ShenYin/ShenYin/Channel/PaXa/PaXa.xcassets/home/btn_record_stop.imageset/Contents.json
ShenYin/ShenYin/Channel/PaXa/PaXa.xcassets/home/btn_record_stop.imageset/Group_2122@2x.png [deleted file]
ShenYin/ShenYin/Channel/PaXa/PaXa.xcassets/home/btn_record_stop.imageset/Group_2122@3x.png [deleted file]
ShenYin/ShenYin/Channel/PaXa/PaXa.xcassets/home/btn_record_stop.imageset/Slice 324@2x.png [new file with mode: 0644]
ShenYin/ShenYin/Channel/PaXa/PaXa.xcassets/home/btn_record_stop.imageset/Slice 324@3x.png [new file with mode: 0644]
ShenYin/ShenYin/Channel/PaXa/PaXa.xcassets/home/dialog_device_ear.imageset/Contents.json
ShenYin/ShenYin/Channel/PaXa/PaXa.xcassets/home/dialog_device_ear.imageset/Group_2437@2x.png [deleted file]
ShenYin/ShenYin/Channel/PaXa/PaXa.xcassets/home/dialog_device_ear.imageset/Group_2437@3x.png [deleted file]
ShenYin/ShenYin/Channel/PaXa/PaXa.xcassets/home/dialog_device_ear.imageset/Slice 324@2x.png [new file with mode: 0644]
ShenYin/ShenYin/Channel/PaXa/PaXa.xcassets/home/dialog_device_ear.imageset/Slice 324@3x.png [new file with mode: 0644]
ShenYin/ShenYin/Channel/PaXa/PaXa.xcassets/home/dialog_device_phone.imageset/Contents.json
ShenYin/ShenYin/Channel/PaXa/PaXa.xcassets/home/dialog_device_phone.imageset/Group_2435@2x.png [deleted file]
ShenYin/ShenYin/Channel/PaXa/PaXa.xcassets/home/dialog_device_phone.imageset/Group_2435@3x.png [deleted file]
ShenYin/ShenYin/Channel/PaXa/PaXa.xcassets/home/dialog_device_phone.imageset/Slice 324@2x.png [new file with mode: 0644]
ShenYin/ShenYin/Channel/PaXa/PaXa.xcassets/home/dialog_device_phone.imageset/Slice 324@3x.png [new file with mode: 0644]
ShenYin/ShenYin/Channel/PaXa/PaXa.xcassets/home/language_switch.imageset/Contents.json
ShenYin/ShenYin/Channel/PaXa/PaXa.xcassets/home/language_switch.imageset/Frame@2x(2).png [deleted file]
ShenYin/ShenYin/Channel/PaXa/PaXa.xcassets/home/language_switch.imageset/Frame@2x.png [new file with mode: 0644]
ShenYin/ShenYin/Channel/PaXa/PaXa.xcassets/home/language_switch.imageset/Frame@3x(2).png [deleted file]
ShenYin/ShenYin/Channel/PaXa/PaXa.xcassets/home/language_switch.imageset/Frame@3x.png [new file with mode: 0644]
ShenYin/ShenYin/Channel/PaXa/PaXa.xcassets/home/pop_pause.imageset/Contents.json [new file with mode: 0644]
ShenYin/ShenYin/Channel/PaXa/PaXa.xcassets/home/pop_pause.imageset/Slice 358@2x.png [new file with mode: 0644]
ShenYin/ShenYin/Channel/PaXa/PaXa.xcassets/home/pop_pause.imageset/Slice 358@3x.png [new file with mode: 0644]
ShenYin/ShenYin/Channel/PaXa/PaXa.xcassets/home/pop_play.imageset/Contents.json [new file with mode: 0644]
ShenYin/ShenYin/Channel/PaXa/PaXa.xcassets/home/pop_play.imageset/Slice 359@2x.png [new file with mode: 0644]
ShenYin/ShenYin/Channel/PaXa/PaXa.xcassets/home/pop_play.imageset/Slice 359@3x.png [new file with mode: 0644]
ShenYin/ShenYin/Channel/PaXa/PaXa.xcassets/home/record_pause 3.imageset/Contents.json [deleted file]
ShenYin/ShenYin/Channel/PaXa/PaXa.xcassets/home/record_pause 3.imageset/Group_2274@2x.png [deleted file]
ShenYin/ShenYin/Channel/PaXa/PaXa.xcassets/home/record_pause 3.imageset/Group_2274@3x.png [deleted file]
ShenYin/ShenYin/Channel/PaXa/PaXa.xcassets/home/record_play 3.imageset/Contents.json [deleted file]
ShenYin/ShenYin/Channel/PaXa/PaXa.xcassets/home/record_play 3.imageset/Group_2275@2x.png [deleted file]
ShenYin/ShenYin/Channel/PaXa/PaXa.xcassets/home/record_play 3.imageset/Group_2275@3x.png [deleted file]
ShenYin/ShenYin/Channel/PaXa/PaXa.xcassets/home/translate_bg.imageset/Contents.json [deleted file]
ShenYin/ShenYin/Channel/PaXa/PaXa.xcassets/home/translate_bg.imageset/语音发送中@2x.png [deleted file]
ShenYin/ShenYin/Channel/PaXa/PaXa.xcassets/home/translate_bg.imageset/语音发送中@3x.png [deleted file]
ShenYin/ShenYin/UI/Home/Dialog/DialogRecordBar.swift
ShenYin/ShenYin/UI/Home/FieldRecording/Chinese2EnglishRecordBar.swift [moved from ShenYin/ShenYin/UI/Home/FieldRecording/RecordBar.swift with 94% similarity]
ShenYin/ShenYin/UI/Home/RecordDetail/RecordDetaiContent.swift
ShenYin/ShenYin/UI/common/LoadingButton.swift
ShenYin/ShenYin/UI/common/pop/PopPlayView.swift

index 6e25b77..b349718 100644 (file)
                                Channel/PLAYBOY/PLAYBOY.storyboard,
                                Channel/PLAYBOY/PLAYBOY.xcassets,
                                Channel/recording.gif,
                                Channel/PLAYBOY/PLAYBOY.storyboard,
                                Channel/PLAYBOY/PLAYBOY.xcassets,
                                Channel/recording.gif,
+                               UI/Home/Dialog/DialogRecordBar.swift,
+                               UI/Home/FieldRecording/Chinese2EnglishRecordBar.swift,
+                               UI/Home/FieldRecording/FieldRecordBar.swift,
                        );
                        target = 3F1301D42F750E7400B9B4F5 /* PaXa */;
                };
                        );
                        target = 3F1301D42F750E7400B9B4F5 /* PaXa */;
                };
                                Channel/DeepChords/DeepChords.plist,
                                Channel/PaXa/Config/BleScanHeaderView.swift,
                                Channel/PaXa/Config/CCConfig.swift,
                                Channel/DeepChords/DeepChords.plist,
                                Channel/PaXa/Config/BleScanHeaderView.swift,
                                Channel/PaXa/Config/CCConfig.swift,
+                               Channel/PaXa/Config/Chinese2EnglishRecordBar.swift,
                                Channel/PaXa/Config/CustomButton.swift,
                                Channel/PaXa/Config/CustomButton.swift,
+                               Channel/PaXa/Config/DialogRecordBar.swift,
+                               Channel/PaXa/Config/FieldRecordBar.swift,
                                Channel/PaXa/PaXa.plist,
                                Channel/PaXa/PaXa.storyboard,
                                Channel/PaXa/PaXa.xcassets,
                                Channel/PaXa/PaXa.plist,
                                Channel/PaXa/PaXa.storyboard,
                                Channel/PaXa/PaXa.xcassets,
                                Channel/DeepChords/Sdk/JoyTcty.swift,
                                Channel/PaXa/Config/BleScanHeaderView.swift,
                                Channel/PaXa/Config/CCConfig.swift,
                                Channel/DeepChords/Sdk/JoyTcty.swift,
                                Channel/PaXa/Config/BleScanHeaderView.swift,
                                Channel/PaXa/Config/CCConfig.swift,
+                               Channel/PaXa/Config/Chinese2EnglishRecordBar.swift,
                                Channel/PaXa/Config/CustomButton.swift,
                                Channel/PaXa/Config/CustomButton.swift,
+                               Channel/PaXa/Config/DialogRecordBar.swift,
+                               Channel/PaXa/Config/FieldRecordBar.swift,
                                Channel/PaXa/PaXa.plist,
                                Channel/PaXa/PaXa.storyboard,
                                Channel/PaXa/PaXa.xcassets,
                                Channel/PaXa/PaXa.plist,
                                Channel/PaXa/PaXa.storyboard,
                                Channel/PaXa/PaXa.xcassets,
                                CODE_SIGN_ENTITLEMENTS = ShenYin/Channel/PLAYBOY/PLAYBOY.entitlements;
                                CODE_SIGN_IDENTITY = "Apple Development";
                                CODE_SIGN_STYLE = Automatic;
                                CODE_SIGN_ENTITLEMENTS = ShenYin/Channel/PLAYBOY/PLAYBOY.entitlements;
                                CODE_SIGN_IDENTITY = "Apple Development";
                                CODE_SIGN_STYLE = Automatic;
-                               CURRENT_PROJECT_VERSION = 202604081115;
+                               CURRENT_PROJECT_VERSION = 202604081715;
                                DEVELOPMENT_TEAM = JKLJ58J33Q;
                                FRAMEWORK_SEARCH_PATHS = (
                                        "$(inherited)",
                                DEVELOPMENT_TEAM = JKLJ58J33Q;
                                FRAMEWORK_SEARCH_PATHS = (
                                        "$(inherited)",
                                CODE_SIGN_ENTITLEMENTS = ShenYin/Channel/PLAYBOY/PLAYBOY.entitlements;
                                CODE_SIGN_IDENTITY = "Apple Development";
                                CODE_SIGN_STYLE = Automatic;
                                CODE_SIGN_ENTITLEMENTS = ShenYin/Channel/PLAYBOY/PLAYBOY.entitlements;
                                CODE_SIGN_IDENTITY = "Apple Development";
                                CODE_SIGN_STYLE = Automatic;
-                               CURRENT_PROJECT_VERSION = 202604081115;
+                               CURRENT_PROJECT_VERSION = 202604081715;
                                DEVELOPMENT_TEAM = JKLJ58J33Q;
                                FRAMEWORK_SEARCH_PATHS = (
                                        "$(inherited)",
                                DEVELOPMENT_TEAM = JKLJ58J33Q;
                                FRAMEWORK_SEARCH_PATHS = (
                                        "$(inherited)",
index 452d55c..532fd61 100644 (file)
@@ -45,6 +45,8 @@ class CCConfig{
     static let preferredStatusBarStyle: UIStatusBarStyle = .darkContent
     
     static let currentDeviceSize = CGSize(width: 168, height: 138)
     static let preferredStatusBarStyle: UIStatusBarStyle = .darkContent
     
     static let currentDeviceSize = CGSize(width: 168, height: 138)
+    static let popPlaySize = CGSize(width: 60, height: 60)
+    static let dialogRecordBarHeight =  kNavBtm + 15
 }
 extension YLColor: ColorRGBProviderProtocol {
     public var rgbValue: Int {
 }
 extension YLColor: ColorRGBProviderProtocol {
     public var rgbValue: Int {
index 1bdb328..a0befba 100644 (file)
@@ -8,7 +8,7 @@
 import UIKit
 import AVFAudio
 class JoyChinese2EnglishVC:BaseVC{
 import UIKit
 import AVFAudio
 class JoyChinese2EnglishVC:BaseVC{
-    let toolBar = RecordBar()
+    let toolBar = Chinese2EnglishRecordBar()
     let tableView = UITableView(frame: CGRectZero, style: .plain)
     let bg = UIImageView()
     let sdk = JoyChinse2English()
     let tableView = UITableView(frame: CGRectZero, style: .plain)
     let bg = UIImageView()
     let sdk = JoyChinse2English()
@@ -114,11 +114,11 @@ class JoyChinese2EnglishVC:BaseVC{
         }
     }
 }
         }
     }
 }
-extension JoyChinese2EnglishVC:RecordBarDelegate{
-    func recordBarLanguageChange(_ bar: RecordBar) {
+extension JoyChinese2EnglishVC:Chinese2EnglishRecordBarDelegate{
+    func recordBarLanguageChange(_ bar: Chinese2EnglishRecordBar) {
         
     }
         
     }
-    func recordBar(_ bar: RecordBar, stateChange state: RecordBarSate) {
+    func recordBar(_ bar: Chinese2EnglishRecordBar, stateChange state: Chinese2EnglishRecordBarSate) {
         if state == .start {
             sdk.start()
         }
         if state == .start {
             sdk.start()
         }
index 1bb3271..c7a9fa3 100644 (file)
@@ -61,7 +61,7 @@ class JoyDialogTranslateVC:BaseVC{
             make.bottom.equalTo(toolBar.snp.top)
         }
         splitView.snp.makeConstraints { make in
             make.bottom.equalTo(toolBar.snp.top)
         }
         splitView.snp.makeConstraints { make in
-            make.top.equalToSuperview().inset(kNavBtm + 15)
+            make.top.equalToSuperview().inset(CCConfig.dialogRecordBarHeight)
             make.left.equalToSuperview()
             make.width.equalTo(kScreenWid)
             make.bottom.equalTo(toolBar.snp.top)
             make.left.equalToSuperview()
             make.width.equalTo(kScreenWid)
             make.bottom.equalTo(toolBar.snp.top)
@@ -137,7 +137,7 @@ extension JoyDialogTranslateVC:DialogRecordBarDelegate{
         }
     }
     
         }
     }
     
-    func recordBar(_ bar: DialogRecordBar, device: DialogRecordDeviceType, stateChange state: RecordBarSate) {
+    func recordBar(_ bar: DialogRecordBar, device: DialogRecordDeviceType, stateChange state: DialogRecordDeviceState) {
         if device == .earphone {
             if state == .start {
                 startEarRecord()
         if device == .earphone {
             if state == .start {
                 startEarRecord()
index ae9f1aa..ed9f6aa 100644 (file)
@@ -8,7 +8,7 @@
 import UIKit
 import AVFoundation
 class JoyTctyVC:BaseVC{
 import UIKit
 import AVFoundation
 class JoyTctyVC:BaseVC{
-    let toolBar = RecordBar()
+    let toolBar = Chinese2EnglishRecordBar()
     let textView = PlaceHolderTextView()
     let translateTextView = PlaceHolderTextView()
     let sdk = JoyTcty()
     let textView = PlaceHolderTextView()
     let translateTextView = PlaceHolderTextView()
     let sdk = JoyTcty()
@@ -159,12 +159,12 @@ class JoyTctyVC:BaseVC{
     }
 }
 
     }
 }
 
-extension JoyTctyVC:RecordBarDelegate{
-    func recordBarLanguageChange(_ bar:RecordBar){
+extension JoyTctyVC:Chinese2EnglishRecordBarDelegate{
+    func recordBarLanguageChange(_ bar:Chinese2EnglishRecordBar){
         AiLanguageCache.save(type: .tscy_left, lan: bar.leftItem.language)
         AiLanguageCache.save(type: .tscy_right, lan: bar.rightItem.language)
     }
         AiLanguageCache.save(type: .tscy_left, lan: bar.leftItem.language)
         AiLanguageCache.save(type: .tscy_right, lan: bar.rightItem.language)
     }
-    func recordBar(_ bar: RecordBar, stateChange state: RecordBarSate) {
+    func recordBar(_ bar: Chinese2EnglishRecordBar, stateChange state: Chinese2EnglishRecordBarSate) {
         if state == .start {
             textView.text = nil
             translateTextView.text = nil
         if state == .start {
             textView.text = nil
             translateTextView.text = nil
index 0f2515a..2ae2945 100644 (file)
@@ -40,6 +40,8 @@ class CCConfig{
     static let userInfoList:[UserInfoCellType] =  [.avatar,.nickName,.gender,.uid,.area]
     static let preferredStatusBarStyle: UIStatusBarStyle = .lightContent
     static let currentDeviceSize = CGSize(width: 168, height: 138)
     static let userInfoList:[UserInfoCellType] =  [.avatar,.nickName,.gender,.uid,.area]
     static let preferredStatusBarStyle: UIStatusBarStyle = .lightContent
     static let currentDeviceSize = CGSize(width: 168, height: 138)
+    static let popPlaySize = CGSize(width: 60, height: 60)
+    static let dialogRecordBarHeight =  kNavBtm + 15
 }
 
 extension YLColor: ColorRGBProviderProtocol {
 }
 
 extension YLColor: ColorRGBProviderProtocol {
index c49089d..a6d1948 100644 (file)
@@ -8,7 +8,7 @@
 import UIKit
 import AVFAudio
 class PbChinese2EnglishVC:BaseVC{
 import UIKit
 import AVFAudio
 class PbChinese2EnglishVC:BaseVC{
-    let toolBar = RecordBar()
+    let toolBar = Chinese2EnglishRecordBar()
     let tableView = UITableView(frame: CGRectZero, style: .plain)
     let bg = UIImageView()
     let sdk = DcChinese2Enligsh()
     let tableView = UITableView(frame: CGRectZero, style: .plain)
     let bg = UIImageView()
     let sdk = DcChinese2Enligsh()
@@ -114,11 +114,11 @@ class PbChinese2EnglishVC:BaseVC{
         }
     }
 }
         }
     }
 }
-extension PbChinese2EnglishVC:RecordBarDelegate{
-    func recordBarLanguageChange(_ bar: RecordBar) {
+extension PbChinese2EnglishVC:Chinese2EnglishRecordBarDelegate{
+    func recordBarLanguageChange(_ bar: Chinese2EnglishRecordBar) {
         
     }
         
     }
-    func recordBar(_ bar: RecordBar, stateChange state: RecordBarSate) {
+    func recordBar(_ bar: Chinese2EnglishRecordBar, stateChange state: Chinese2EnglishRecordBarSate) {
         if state == .start {
             sdk.start()
         }
         if state == .start {
             sdk.start()
         }
index 5a48cf2..45ffcf6 100644 (file)
@@ -60,7 +60,7 @@ class PbDialogTranslateVC:BaseVC{
             make.bottom.equalTo(toolBar.snp.top)
         }
         splitView.snp.makeConstraints { make in
             make.bottom.equalTo(toolBar.snp.top)
         }
         splitView.snp.makeConstraints { make in
-            make.top.equalToSuperview().inset(kNavBtm + 15)
+            make.top.equalToSuperview().inset(CCConfig.dialogRecordBarHeight)
             make.left.equalToSuperview()
             make.width.equalTo(kScreenWid)
             make.bottom.equalTo(toolBar.snp.top)
             make.left.equalToSuperview()
             make.width.equalTo(kScreenWid)
             make.bottom.equalTo(toolBar.snp.top)
@@ -270,7 +270,7 @@ extension PbDialogTranslateVC:DialogRecordBarDelegate{
         }
     }
     
         }
     }
     
-    func recordBar(_ bar: DialogRecordBar, device: DialogRecordDeviceType, stateChange state: RecordBarSate) {
+    func recordBar(_ bar: DialogRecordBar, device: DialogRecordDeviceType, stateChange state: DialogRecordDeviceState) {
         if device == .earphone {
             if state == .start {
                 startEarRecord()
         if device == .earphone {
             if state == .start {
                 startEarRecord()
index 95d402f..24133bf 100644 (file)
@@ -12,7 +12,7 @@ import AVKit
 @available(iOS 15.0, *)
 class PbSubTitleVC: BaseVC {
     let languageItem = LanguageSelectItem()
 @available(iOS 15.0, *)
 class PbSubTitleVC: BaseVC {
     let languageItem = LanguageSelectItem()
-    let toolBar = RecordBar()
+    let toolBar = Chinese2EnglishRecordBar()
     let tableView = UITableView(frame: CGRectZero, style: .plain)
     
     
     let tableView = UITableView(frame: CGRectZero, style: .plain)
     
     
@@ -210,12 +210,12 @@ extension PbSubTitleVC:PipManagerDelegate{
 }
 
 @available(iOS 15.0, *)
 }
 
 @available(iOS 15.0, *)
-extension PbSubTitleVC:RecordBarDelegate{
-    func recordBarLanguageChange(_ bar: RecordBar) {
+extension PbSubTitleVC:Chinese2EnglishRecordBarDelegate{
+    func recordBarLanguageChange(_ bar: Chinese2EnglishRecordBar) {
         sdk.stopEarRecord()
         sdk.startEarRecord(from: languageItem.leftLabel.language, to: languageItem.rightLabel.language)
     }
         sdk.stopEarRecord()
         sdk.startEarRecord(from: languageItem.leftLabel.language, to: languageItem.rightLabel.language)
     }
-    func recordBar(_ bar: RecordBar, stateChange state: RecordBarSate) {
+    func recordBar(_ bar: Chinese2EnglishRecordBar, stateChange state: Chinese2EnglishRecordBarSate) {
         if state == .start {
             sdk.startEarRecord(from: languageItem.leftLabel.language, to: languageItem.rightLabel.language)
             pipManager.start()
         if state == .start {
             sdk.startEarRecord(from: languageItem.leftLabel.language, to: languageItem.rightLabel.language)
             pipManager.start()
index 9aa7971..963d972 100644 (file)
@@ -8,7 +8,7 @@
 import UIKit
 import AVFoundation
 class PbTctyVC:BaseVC{
 import UIKit
 import AVFoundation
 class PbTctyVC:BaseVC{
-    let toolBar = RecordBar()
+    let toolBar = Chinese2EnglishRecordBar()
     let textView = PlaceHolderTextView()
     let translateTextView = PlaceHolderTextView()
     let sdk = DcTcty()
     let textView = PlaceHolderTextView()
     let translateTextView = PlaceHolderTextView()
     let sdk = DcTcty()
@@ -160,12 +160,12 @@ class PbTctyVC:BaseVC{
     }
 }
 
     }
 }
 
-extension PbTctyVC:RecordBarDelegate{
-    func recordBarLanguageChange(_ bar:RecordBar){
+extension PbTctyVC:Chinese2EnglishRecordBarDelegate{
+    func recordBarLanguageChange(_ bar:Chinese2EnglishRecordBar){
         AiLanguageCache.save(type: .tscy_left, lan: bar.leftItem.language)
         AiLanguageCache.save(type: .tscy_right, lan: bar.rightItem.language)
     }
         AiLanguageCache.save(type: .tscy_left, lan: bar.leftItem.language)
         AiLanguageCache.save(type: .tscy_right, lan: bar.rightItem.language)
     }
-    func recordBar(_ bar: RecordBar, stateChange state: RecordBarSate) {
+    func recordBar(_ bar: Chinese2EnglishRecordBar, stateChange state: Chinese2EnglishRecordBarSate) {
         if state == .start {
             textView.text = nil
             translateTextView.text = nil
         if state == .start {
             textView.text = nil
             translateTextView.text = nil
index b19e960..8e0fde1 100644 (file)
@@ -43,6 +43,8 @@ class CCConfig{
     static let preferredStatusBarStyle: UIStatusBarStyle = .darkContent
     
     static let currentDeviceSize = CGSize(width: 168, height: 138)
     static let preferredStatusBarStyle: UIStatusBarStyle = .darkContent
     
     static let currentDeviceSize = CGSize(width: 168, height: 138)
+    static let popPlaySize = CGSize(width: 138, height: 45)
+    static let dialogRecordBarHeight =  kNavBtm + 25
 }
 
 
 }
 
 
diff --git a/ShenYin/ShenYin/Channel/PaXa/Config/Chinese2EnglishRecordBar.swift b/ShenYin/ShenYin/Channel/PaXa/Config/Chinese2EnglishRecordBar.swift
new file mode 100644 (file)
index 0000000..ebf2ff2
--- /dev/null
@@ -0,0 +1,198 @@
+//
+//  RecordBar.swift
+//  ShenYin
+//
+//  Created by liangshi on 2025/8/27.
+//
+
+enum Chinese2EnglishRecordBarSate:Int{
+    case start
+    case stop
+}
+
+protocol Chinese2EnglishRecordBarDelegate:NSObject {
+    func recordBarLanguageChange(_ bar:Chinese2EnglishRecordBar)
+    func recordBar(_ bar:Chinese2EnglishRecordBar,stateChange state:Chinese2EnglishRecordBarSate)
+}
+
+class Chinese2EnglishRecordBar: BaseView {
+    let recordBtn = LoadingButton()
+    let leftItem = RecordBarItem()
+    let rightItem = RecordBarItem()
+    weak var delegate:Chinese2EnglishRecordBarDelegate?
+    var isChienseEnglish = false{
+        didSet{
+            if isChienseEnglish {
+                leftItem.icon.isHidden = true
+                rightItem.icon.isHidden = true
+            }
+            else{
+                leftItem.icon.isHidden = false
+                rightItem.icon.isHidden = false
+            }
+        }
+    }
+    
+    override func setupViews() {
+        backgroundColor = .color(.bgColor)
+        addSubviews([leftItem,rightItem,recordBtn])
+        
+        recordBtn.do { v in
+            v.setImage(UIImage(named: "btn_record_normal"), for: .normal)
+            v.setImage(UIImage(named: "btn_record_stop"), for: .selected)
+            v.addTarget(self, action: #selector(recordBtnAction), for: .touchUpInside)
+        }
+        leftItem.do { (v) in
+            v.language = CCAiLanguage.chinse
+            v.yc.addTap(target: self, action: #selector(leftAction))
+        }
+        rightItem.do { (v) in
+            
+            v.language = CCAiLanguage.english
+            v.yc.addTap(target: self, action: #selector(rightAction))
+        }
+    }
+    
+    override func setupLayout() {
+        recordBtn.snp.makeConstraints { make in
+            make.width.equalTo(100)
+            make.height.equalTo(50)
+            make.center.equalToSuperview()
+        }
+        leftItem.snp.makeConstraints { make in
+            make.height.equalTo(56)
+            make.centerY.equalTo(recordBtn)
+            make.right.equalToSuperview().offset(-(kScreenWid/2 + 70))
+        }
+        rightItem.snp.makeConstraints { make in
+            make.height.equalTo(56)
+            make.centerY.equalTo(recordBtn)
+            make.left.equalToSuperview().offset(kScreenWid/2 + 70)
+        }
+    }
+    func startAnimating(){
+        leftItem.alpha = 0.3
+        rightItem.alpha = 0.3
+        recordBtn.startAnimating()
+        recordBtn.activeView.backgroundColor = .color(.bgColor)
+    }
+    func stopAnimation(){
+        leftItem.alpha = 1
+        rightItem.alpha = 1
+    }
+    @objc func recordBtnAction(){
+        if recordBtn.activeView.animating {
+            return
+        }
+        recordBtn.isSelected = !recordBtn.isSelected
+        if recordBtn.isSelected {
+            leftItem.alpha = 0.3
+            rightItem.alpha = 0.3
+        }
+        else{
+            leftItem.alpha = 1
+            rightItem.alpha = 1
+        }
+        
+        if recordBtn.isSelected {
+            delegate?.recordBar(self, stateChange: .start)
+        }
+        else{
+            delegate?.recordBar(self, stateChange: .stop)
+        }
+    }
+    
+    @objc func leftAction(){
+        if isChienseEnglish {
+            return
+        }
+        if recordBtn.activeView.animating {
+            return
+        }
+        if recordBtn.isSelected {
+            return
+        }
+        let v = LanguagePickerView(languages: CCAiLanguage.all,isLeft: true,left: leftItem.language,right: rightItem.language)
+        v.selectedIndex = v.list.firstIndex(where: {$0.title == leftItem.language.title}) ?? 0
+        v.show()
+        v.didSelected = {[weak self] (index,value) in
+            guard let self = self else { return  }
+            if index == 0 {
+                leftItem.language = value
+            }
+            else{
+                rightItem.language = value
+            }
+            delegate?.recordBarLanguageChange(self)
+        }
+    }
+    @objc func rightAction(){
+        if isChienseEnglish {
+            return
+        }
+        if recordBtn.activeView.animating {
+            return
+        }
+        if recordBtn.isSelected {
+            return
+        }
+        let v = LanguagePickerView(languages: CCAiLanguage.all,isLeft: false,left: leftItem.language,right: rightItem.language)
+        v.selectedIndex = v.list.firstIndex(where: {$0.title == rightItem.language.title}) ?? 0
+        v.show()
+        v.didSelected = {[weak self] (index,value) in
+            guard let self = self else { return  }
+            if index == 0 {
+                leftItem.language = value
+            }
+            else{
+                rightItem.language = value
+            }
+            delegate?.recordBarLanguageChange(self)
+        }
+    }
+    
+    class RecordBarItem: BaseView {
+        let icon = UIImageView()
+        let titleLabel = UILabel()
+        let valueLabel = UILabel()
+        
+        var language:CCAiLanguage = CCAiLanguage.chinse{
+            didSet{
+                titleLabel.text = language.title
+            }
+        }
+        
+        override func setupViews() {
+//            backgroundColor = .red
+            addSubviews([titleLabel,valueLabel,icon])
+            icon.do { v in
+                v.image = UIImage(named: "polygon")
+            }
+            titleLabel.do { v in
+                v.textColor = .color(.level1)
+                v.font = .bold(16)
+            }
+            valueLabel.do { v in
+                v.textColor = .color(.level2)
+                v.font = .regular(10)
+            }
+        }
+        
+        override func setupLayout() {
+            icon.snp.makeConstraints { make in
+                make.size.equalTo(12)
+                make.top.equalToSuperview().inset(10)
+                make.right.equalToSuperview()
+            }
+            titleLabel.snp.makeConstraints { make in
+                make.right.equalTo(icon.snp.left).offset(-5)
+                make.centerY.equalTo(icon)
+                make.left.equalToSuperview()
+            }
+            valueLabel.snp.makeConstraints { make in
+                make.right.equalTo(titleLabel)
+                make.top.equalTo(titleLabel.snp.bottom).offset(5)
+            }
+        }
+    }
+}
diff --git a/ShenYin/ShenYin/Channel/PaXa/Config/DialogRecordBar.swift b/ShenYin/ShenYin/Channel/PaXa/Config/DialogRecordBar.swift
new file mode 100644 (file)
index 0000000..fe3d5f5
--- /dev/null
@@ -0,0 +1,400 @@
+//
+//  Untitled.swift
+//  ShenYin
+//
+//  Created by liangshi on 2026/4/8.
+//
+
+//
+//  DialogRecordBar.swift
+//  ShenYin
+//
+//  Created by liangshi on 2025/9/16.
+//
+import DGActivityIndicatorView
+
+enum DialogRecordDeviceType{
+    case earphone
+    case phone
+}
+enum DialogRecordDeviceState{
+    case start
+    case stop
+}
+enum DialogRecordLayoutType{
+    case normal
+    case spolit
+}
+protocol DialogRecordBarDelegate:NSObject {
+    func recordBar(_ bar:DialogRecordBar,layoutChange :DialogRecordLayoutType)
+    func recordBar(_ bar:DialogRecordBar, device:DialogRecordDeviceType,stateChange state:DialogRecordDeviceState)
+}
+
+extension UIView{
+    static let converView = UIView()
+    func updateConnectState(_ state:Bool) {
+        if state {
+            if UIView.converView.superview == nil {
+                return
+            }
+            self.alpha = 1
+            UIView.converView.removeFromSuperview()
+        }
+        else{
+            if UIView.converView.superview != nil {
+                return
+            }
+            self.alpha = 0.3
+            UIView.converView.backgroundColor = .clear
+            self.addSubview(UIView.converView)
+            UIView.converView.snp.makeConstraints { make in
+                make.edges.equalToSuperview()
+            }
+        }
+    }
+}
+
+class DialogRecordBar: BaseView {
+    let leftItem = DialogItem()
+    let rightItem = DialogItem()
+    let switchBtn = UIButton()
+    
+    weak var delegate:DialogRecordBarDelegate?
+    var navBar:BaseNavigationBar = BaseNavigationBar()
+    
+    var isBusy:Bool{
+        return leftItem.recordItem.activeView.animating || leftItem.recordItem.loadView.animating || rightItem.recordItem.activeView.animating || rightItem.recordItem.loadView.animating
+    }
+    
+    override func setupViews() {
+        backgroundColor = .clear
+        
+        addSubviews([leftItem,rightItem,switchBtn])
+        switchBtn.do { v in
+            v.setImage(UIImage(named: "split_screen_1"), for: .normal)
+            v.setImage(UIImage(named: "split_screen_2"), for: .selected)
+            v.addTarget(self, action: #selector(switchBtnAction), for: .touchUpInside)
+        }
+        leftItem.do { v in
+            v.recordItem.setImage(UIImage(named: "dialog_device_ear"), for: .normal)
+            v.recordItem.setImage(UIImage(named: "dialog_device_ear"), for: .selected)
+            
+            v.recordItem.addTarget(self, action: #selector(leftRecordBtnAction), for: .touchUpInside)
+            v.languageItem.yc.addTap(target: self, action: #selector(leftLanguageAction))
+            v.languageItem.language = AiLanguageCache.get(type: .dialog_left) ?? .chinse
+        }
+        rightItem.do { v in
+            v.recordItem.setImage(UIImage(named: "dialog_device_phone"), for: .normal)
+            v.recordItem.setImage(UIImage(named: "dialog_device_phone"), for: .selected)
+
+            
+            v.recordItem.addTarget(self, action: #selector(rightRecordBtnAction), for: .touchUpInside)
+            v.languageItem.yc.addTap(target: self, action: #selector(rightLanguageAction))
+            v.languageItem.language = AiLanguageCache.get(type: .dialog_right) ?? .english
+        }
+    }
+    
+    override func setupLayout() {
+        switchBtn.snp.remakeConstraints { make in
+            make.size.equalTo(38)
+            make.centerX.equalToSuperview()
+            make.top.equalToSuperview().inset(10)
+        }
+        leftItem.snp.remakeConstraints { make in
+            make.width.equalTo(100)
+            make.height.equalTo(98)
+            make.top.equalToSuperview().inset(10)
+            make.right.equalToSuperview().offset(-(kScreenWid/2 + 60))
+        }
+        rightItem.snp.remakeConstraints { make in
+            make.width.height.equalTo(leftItem)
+            make.top.equalToSuperview().inset(10)
+            make.left.equalToSuperview().offset(kScreenWid/2 + 60)
+        }
+    }
+    func splitLayout(){
+        switchBtn.snp.remakeConstraints { make in
+            make.size.equalTo(38)
+            make.right.equalToSuperview().inset(36)
+            make.top.equalToSuperview().inset(10)
+        }
+        leftItem.snp.remakeConstraints { make in
+            make.width.equalTo(100)
+            make.height.equalTo(98)
+            make.top.equalToSuperview().inset(10)
+            make.right.equalToSuperview().offset(-(kScreenWid/2 - 33))
+        }
+    }
+    func stopRecord(_ type:DialogRecordDeviceType){
+        if type == .earphone {
+            leftItem.recordItem.isSelected = false
+            leftItem.recordItem.stopAnimating(finished: { [weak self] in
+                guard let self = self else { return  }
+                leftItem.recordItem.alpha = 1
+                leftItem.languageItem.alpha = 1
+                rightItem.recordItem.alpha = 1
+                rightItem.languageItem.alpha = 1
+            })
+        }
+        else{
+            rightItem.recordItem.isSelected = false
+            rightItem.recordItem.stopAnimating(finished: { [weak self] in
+                guard let self = self else { return  }
+                leftItem.recordItem.alpha = 1
+                leftItem.languageItem.alpha = 1
+                rightItem.recordItem.alpha = 1
+                rightItem.languageItem.alpha = 1
+            })
+        }
+    }
+    override func setupData() {
+        NotificationManager.add(self, selector: #selector(deviceChange), forName: .deviceValidChange)
+    }
+    @objc func deviceChange(){
+        self.updateConnectState(CCBleManager.shared.isConneted)
+    }
+    
+    @objc func switchBtnAction(){
+        switchBtn.isSelected = !switchBtn.isSelected
+        let type:DialogRecordLayoutType = switchBtn.isSelected ?  .spolit:.normal
+        delegate?.recordBar(self, layoutChange: type)
+        
+        if type == .normal {
+            navBar.titleLabel.isHidden = false
+            addSubview(rightItem)
+            setupLayout()
+            rightItem.setupLayout()
+            navBar.frame = CGRectMake(0, 0, kScreenWid, kNavBtm)
+            rightItem.transform = CGAffineTransform(rotationAngle: .pi*2)
+        }
+        else{
+            splitLayout()
+            rightItem.setupLayout()
+            rightItem.transform = CGAffineTransform(rotationAngle: .pi)
+            
+            navBar.titleLabel.isHidden = true
+            navBar.addSubview(rightItem)
+            navBar.frame = CGRectMake(0, 0, kScreenWid, CCConfig.dialogRecordBarHeight)
+            navBar.superview?.bringSubviewToFront(navBar)
+            rightItem.snp.remakeConstraints { make in
+                make.centerX.equalToSuperview()
+                make.bottom.equalToSuperview()
+                make.width.height.equalTo(leftItem)
+            }
+        }
+    }
+    
+    @objc func leftRecordBtnAction(){
+        if rightItem.recordItem.activeView.animating || rightItem.recordItem.loadView.animating || leftItem.recordItem.loadView.animating{
+            return
+        }
+        if leftItem.recordItem.activeView.animating{
+            delegate?.recordBar(self, device: .earphone,stateChange: .stop)
+            stopRecord(.earphone)
+            return
+        }
+        
+        leftItem.recordItem.isSelected = !leftItem.recordItem.isSelected
+        if  leftItem.recordItem.isSelected {
+            leftItem.recordItem.alpha = 1
+            leftItem.languageItem.alpha = 0.3
+            rightItem.recordItem.alpha = 0.3
+            rightItem.languageItem.alpha = 0.3
+            
+            leftItem.recordItem.startAnimating()
+            delegate?.recordBar(self, device: .earphone,stateChange: .start)
+        }
+        else{
+            stopRecord(.earphone)
+            delegate?.recordBar(self, device: .earphone,stateChange: .stop)
+        }
+    }
+    @objc func rightRecordBtnAction(){
+        if leftItem.recordItem.activeView.animating || leftItem.recordItem.loadView.animating || rightItem.recordItem.loadView.animating{
+            return
+        }
+        if rightItem.recordItem.activeView.animating{
+            stopRecord(.phone)
+            delegate?.recordBar(self, device: .phone,stateChange: .stop)
+            return
+        }
+        
+        rightItem.recordItem.isSelected = !rightItem.recordItem.isSelected
+        
+        if  rightItem.recordItem.isSelected {
+            leftItem.recordItem.alpha = 0.3
+            leftItem.languageItem.alpha = 0.3
+            rightItem.recordItem.alpha = 1
+            rightItem.languageItem.alpha = 0.3
+            
+            rightItem.recordItem.startAnimating()
+            delegate?.recordBar(self, device: .phone,stateChange: .start)
+        }
+        else{
+            stopRecord(.phone)
+            delegate?.recordBar(self, device: .phone,stateChange: .stop)
+        }
+    }
+    
+    @objc func leftLanguageAction(){
+        if self.isBusy {
+            return
+        }
+        let v = LanguagePickerView(languages: CCAiLanguage.all,isLeft: true,left: leftItem.languageItem.language,right: rightItem.languageItem.language)
+        v.selectedIndex = v.list.firstIndex(where: {$0.title == leftItem.languageItem.language.title}) ?? 0
+        v.show()
+        v.didSelected = {[weak self] (index,value) in
+            guard let self = self else { return  }
+            if index == 0 {
+                leftItem.languageItem.language = value
+                AiLanguageCache.save(type: .dialog_left, lan: value)
+            }
+            else{
+                rightItem.languageItem.language = value
+                AiLanguageCache.save(type: .dialog_right, lan: value)
+            }
+        }
+    }
+    @objc func rightLanguageAction(){
+        if self.isBusy{
+            return
+        }
+        let v = LanguagePickerView(languages: CCAiLanguage.all,isLeft: false,left: leftItem.languageItem.language,right: rightItem.languageItem.language)
+        v.selectedIndex = v.list.firstIndex(where: {$0.title == rightItem.languageItem.language.title}) ?? 0
+        v.show()
+        v.didSelected = {[weak self] (index,value) in
+            guard let self = self else { return  }
+            if index == 0 {
+                leftItem.languageItem.language = value
+                AiLanguageCache.save(type: .dialog_left, lan: value)
+            }
+            else{
+                rightItem.languageItem.language = value
+                AiLanguageCache.save(type: .dialog_right, lan: value)
+            }
+        }
+    }
+    
+    class DialogItem: UIView {
+        let languageItem = RecordLanguageItem()
+        let recordItem = DialogRecordingButton()
+        
+        override init(frame: CGRect) {
+            super.init(frame: frame)
+            setupViews()
+            setupLayout()
+        }
+        
+        @MainActor required init?(coder: NSCoder) {
+            fatalError("init(coder:) has not been implemented")
+        }
+        
+        func setupViews() {
+//                        backgroundColor = .yellow
+            addSubviews([languageItem,recordItem])
+        }
+        
+        func setupLayout() {
+            recordItem.snp.remakeConstraints { make in
+                make.width.equalToSuperview()
+                make.height.equalTo(50)
+                make.top.equalToSuperview().inset(0)
+                make.centerX.equalToSuperview()
+            }
+            languageItem.snp.remakeConstraints { make in
+                make.height.equalTo(40)
+                make.top.equalTo(recordItem.snp.bottom)
+                make.centerX.equalToSuperview()
+            }
+            
+        }
+    }
+    class RecordLanguageItem: BaseView {
+        let icon = UIImageView()
+        let titleLabel = UILabel()
+        let valueLabel = UILabel()
+        
+        var language:CCAiLanguage = CCAiLanguage.chinse{
+            didSet{
+                titleLabel.text = language.title
+            }
+        }
+        
+        override func setupViews() {
+            addSubviews([titleLabel,valueLabel,icon])
+            icon.do { v in
+                v.image = UIImage(named: "polygon")
+            }
+            titleLabel.do { v in
+                v.textColor = .color(.level1)
+                v.font = .bold(16)
+            }
+            valueLabel.do { v in
+                v.textColor = .color(.level2)
+                v.font = .regular(10)
+            }
+        }
+        
+        override func setupLayout() {
+            icon.snp.makeConstraints { make in
+                make.size.equalTo(12)
+                make.top.equalToSuperview().inset(10)
+                make.right.equalToSuperview()
+            }
+            titleLabel.snp.makeConstraints { make in
+                make.right.equalTo(icon.snp.left).offset(-5)
+                make.centerY.equalTo(icon)
+                make.left.equalToSuperview()
+            }
+            valueLabel.snp.makeConstraints { make in
+                make.right.equalTo(titleLabel)
+                make.top.equalTo(titleLabel.snp.bottom).offset(5)
+                make.bottom.equalToSuperview().inset(12)
+            }
+        }
+    }
+    
+    class DialogRecordingButton:UIButton{
+        let activeView = DGActivityIndicatorView(type: .lineScalePulseOut,tintColor: UIColor.white,size: 25)!
+        let loadView = DGActivityIndicatorView(type: .ballClipRotate,tintColor: UIColor.white)!
+        
+        override init(frame: CGRect) {
+            super.init(frame: frame)
+            activeView.backgroundColor = .color(.theme)
+            activeView.yc.setCornerRadius(25)
+            addSubview(activeView)
+            activeView.snp.remakeConstraints { make in
+                make.edges.equalToSuperview()
+            }
+            
+            loadView.yc.setCornerRadius(25)
+            loadView.backgroundColor = .color(.theme)
+            addSubview(loadView)
+            loadView.snp.remakeConstraints { make in
+                make.edges.equalToSuperview()
+            }
+
+        }
+        
+        required init?(coder: NSCoder) {
+            fatalError("init(coder:) has not been implemented")
+        }
+        func startAnimating(finished:(()->Void)? = nil){
+            loadView.isHidden = true
+            activeView.isHidden = false
+            activeView.startAnimating()
+        }
+        func stopAnimating(finished:@escaping (()->Void)){
+            activeView.stopAnimating()
+            activeView.isHidden = true
+            
+            loadView.isHidden = false
+            loadView.startAnimating()
+            DispatchQueue.main.asyncAfter(deadline:.now() + 0.3) { [weak self] in
+                self?.loadView.stopAnimating()
+                finished()
+            }
+        }
+    }
+    
+}
diff --git a/ShenYin/ShenYin/Channel/PaXa/Config/FieldRecordBar.swift b/ShenYin/ShenYin/Channel/PaXa/Config/FieldRecordBar.swift
new file mode 100644 (file)
index 0000000..baa655f
--- /dev/null
@@ -0,0 +1,201 @@
+//
+//  Untitled.swift
+//  ShenYin
+//
+//  Created by liangshi on 2025/8/27.
+//
+
+enum RecordSate:Int{
+    case start
+    case stop
+    case resume
+    case pause
+}
+
+protocol FieldRecordBarDelegate:NSObject {
+    func fieldRecordBar(_ bar:FieldRecordBar,languageChange language:CCAiLanguage)
+    func fieldRecordBar(_ bar:FieldRecordBar,stateChange state:RecordSate)
+}
+
+
+class FieldRecordBar: BaseView {
+     let recordBtn = LoadingButton()
+    let leftItem = RecordBarItem()
+    let rightItem = RecordBarButton()
+    var state:RecordSate = .stop
+    weak var  delegate:FieldRecordBarDelegate?
+    var hasRightItem:Bool = true
+    
+    override func setupViews() {
+        backgroundColor = .color(.cellBg)
+        addSubviews([leftItem,rightItem,recordBtn])
+        
+        recordBtn.do { v in
+            v.setImage(UIImage(named: "btn_record_normal"), for: .normal)
+            v.setImage(UIImage(named: "btn_record_stop"), for: .selected)
+            v.addTarget(self, action: #selector(recordBtnAction), for: .touchUpInside)
+        }
+        leftItem.do {v in
+            v.yc.addTap(target: self, action: #selector(leftAction))
+            v.language = .chinse
+        }
+        rightItem.do {v in
+            v.state = .stop
+            v.yc.addTap(target: self, action: #selector(pauseAction))
+        }
+    }
+    
+    override func setupLayout() {
+        recordBtn.snp.makeConstraints { make in
+            make.width.equalTo(100)
+            make.height.equalTo(50)
+            make.center.equalToSuperview()
+        }
+        leftItem.snp.makeConstraints { make in
+            make.size.equalTo(56)
+            make.centerY.equalTo(recordBtn)
+            make.right.equalToSuperview().offset(-(kScreenWid/2 + 70))
+        }
+        rightItem.snp.makeConstraints { make in
+            make.size.equalTo(56)
+            make.centerY.equalTo(recordBtn)
+            make.left.equalToSuperview().offset(kScreenWid/2 + 70)
+        }
+    }
+    
+    func startAnimating(){
+        leftItem.alpha = 0.3
+        recordBtn.startAnimating()
+    }
+    func stopAnimation(){
+        leftItem.alpha = 1
+    }
+    @objc func leftAction(){
+        if recordBtn.isSelected || recordBtn.activeView.animating {
+            return
+        }
+        let list = CCAiLanguage.all.map{$0.title}
+        
+        let v = CustomPicker(title: "请选择语言".l10n, list:list )
+        v.selectedIndex = list.firstIndex(where: {leftItem.language.title == $0})!
+        v.show()
+        v.didSelected = {[weak self] (index,value) in
+            guard let self = self else { return  }
+            leftItem.language = CCAiLanguage.all.first(where: {$0.title == value})!
+            delegate?.fieldRecordBar(self, languageChange:leftItem.language)
+        }
+        return
+    }
+    @objc func recordBtnAction(){
+        if recordBtn.activeView.animating {
+            return
+        }
+        recordBtn.isSelected = !recordBtn.isSelected
+        rightItem.state = .start
+        rightItem.isHidden = !recordBtn.isSelected
+        
+        if hasRightItem == false{
+            rightItem.isHidden = true
+        }
+        
+        
+        if recordBtn.isSelected {
+            leftItem.alpha = 0.3
+        }
+        else{
+            leftItem.alpha = 1
+        }
+        if recordBtn.isSelected {
+            delegate?.fieldRecordBar(self, stateChange: .start)
+        }
+        else{
+            delegate?.fieldRecordBar(self, stateChange: .stop)
+        }
+    }
+    @objc func pauseAction(){
+        if rightItem.state == .start {
+            rightItem.state = .pause
+        }
+        else if rightItem.state == .resume {
+            rightItem.state = .pause
+        }
+        else if rightItem.state == .pause {
+            rightItem.state = .resume
+        }
+        delegate?.fieldRecordBar(self, stateChange: rightItem.state)
+    }
+    
+    class RecordBarItem: BaseView {
+        private let icon = UIImageView()
+        private let titleLabel = UILabel()
+        var language:CCAiLanguage = .chinse{
+            didSet{
+                titleLabel.text = language.title
+            }
+        }
+        override func setupViews() {
+            addSubviews([titleLabel,icon])
+            icon.do { v in
+                v.image = UIImage(named: "record_select_language")
+            }
+            titleLabel.do { v in
+                v.textColor = .color(.level1)
+                v.font = .regular(10)
+            }
+        }
+        
+        override func setupLayout() {
+            icon.snp.makeConstraints { make in
+                make.size.equalTo(28)
+                make.top.equalToSuperview().inset(10)
+                make.centerX.equalToSuperview()
+            }
+            titleLabel.snp.makeConstraints { make in
+                make.top.equalTo(icon.snp.bottom).offset(5)
+                make.centerX.equalTo(icon)
+            }
+        }
+    }
+    class RecordBarButton: BaseView {
+        let icon = UIImageView()
+        let titleLabel = UILabel()
+        var state:RecordSate = .resume{
+            didSet{
+                if state == .start {
+                    titleLabel.text = "暂停".l10n
+                    icon.image = UIImage(named: "record_pause")
+                }
+                else if state == .resume{
+                    titleLabel.text = "暂停".l10n
+                    icon.image = UIImage(named: "record_pause")
+                }
+                else if state == .pause{
+                    titleLabel.text = "继续".l10n
+                    icon.image = UIImage(named: "record_play")
+                }
+            }
+        }
+        
+        override func setupViews() {
+            addSubviews([titleLabel,icon])
+            icon.do { v in
+            }
+            titleLabel.do { v in
+                v.textColor = .color(.level1)
+                v.font = .regular(10)
+            }
+        }
+        
+        override func setupLayout() {
+            icon.snp.makeConstraints { make in
+                make.size.equalTo(28)
+                make.top.equalToSuperview().inset(10)
+                make.centerX.equalToSuperview()
+            }
+            titleLabel.snp.makeConstraints { make in
+                make.top.equalTo(icon.snp.bottom).offset(5)
+                make.centerX.equalTo(icon)
+            }
+        }
+    }
+}
index 04fa73f..0146e1e 100644 (file)
@@ -5,12 +5,12 @@
       "scale" : "1x"
     },
     {
       "scale" : "1x"
     },
     {
-      "filename" : "Group 2104@2x.png",
+      "filename" : "Slice 324@2x.png",
       "idiom" : "universal",
       "scale" : "2x"
     },
     {
       "idiom" : "universal",
       "scale" : "2x"
     },
     {
-      "filename" : "Group 2104@3x.png",
+      "filename" : "Slice 324@3x.png",
       "idiom" : "universal",
       "scale" : "3x"
     }
       "idiom" : "universal",
       "scale" : "3x"
     }
diff --git a/ShenYin/ShenYin/Channel/PaXa/PaXa.xcassets/home/btn_record_normal.imageset/Group 2104@2x.png b/ShenYin/ShenYin/Channel/PaXa/PaXa.xcassets/home/btn_record_normal.imageset/Group 2104@2x.png
deleted file mode 100644 (file)
index 238251e..0000000
Binary files a/ShenYin/ShenYin/Channel/PaXa/PaXa.xcassets/home/btn_record_normal.imageset/Group 2104@2x.png and /dev/null differ
diff --git a/ShenYin/ShenYin/Channel/PaXa/PaXa.xcassets/home/btn_record_normal.imageset/Group 2104@3x.png b/ShenYin/ShenYin/Channel/PaXa/PaXa.xcassets/home/btn_record_normal.imageset/Group 2104@3x.png
deleted file mode 100644 (file)
index 052a3af..0000000
Binary files a/ShenYin/ShenYin/Channel/PaXa/PaXa.xcassets/home/btn_record_normal.imageset/Group 2104@3x.png and /dev/null differ
diff --git a/ShenYin/ShenYin/Channel/PaXa/PaXa.xcassets/home/btn_record_normal.imageset/Slice 324@2x.png b/ShenYin/ShenYin/Channel/PaXa/PaXa.xcassets/home/btn_record_normal.imageset/Slice 324@2x.png
new file mode 100644 (file)
index 0000000..db7a891
Binary files /dev/null and b/ShenYin/ShenYin/Channel/PaXa/PaXa.xcassets/home/btn_record_normal.imageset/Slice 324@2x.png differ
diff --git a/ShenYin/ShenYin/Channel/PaXa/PaXa.xcassets/home/btn_record_normal.imageset/Slice 324@3x.png b/ShenYin/ShenYin/Channel/PaXa/PaXa.xcassets/home/btn_record_normal.imageset/Slice 324@3x.png
new file mode 100644 (file)
index 0000000..2199da1
Binary files /dev/null and b/ShenYin/ShenYin/Channel/PaXa/PaXa.xcassets/home/btn_record_normal.imageset/Slice 324@3x.png differ
index 3adc415..0146e1e 100644 (file)
@@ -5,12 +5,12 @@
       "scale" : "1x"
     },
     {
       "scale" : "1x"
     },
     {
-      "filename" : "Group_2122@2x.png",
+      "filename" : "Slice 324@2x.png",
       "idiom" : "universal",
       "scale" : "2x"
     },
     {
       "idiom" : "universal",
       "scale" : "2x"
     },
     {
-      "filename" : "Group_2122@3x.png",
+      "filename" : "Slice 324@3x.png",
       "idiom" : "universal",
       "scale" : "3x"
     }
       "idiom" : "universal",
       "scale" : "3x"
     }
diff --git a/ShenYin/ShenYin/Channel/PaXa/PaXa.xcassets/home/btn_record_stop.imageset/Group_2122@2x.png b/ShenYin/ShenYin/Channel/PaXa/PaXa.xcassets/home/btn_record_stop.imageset/Group_2122@2x.png
deleted file mode 100644 (file)
index 1ffb38a..0000000
Binary files a/ShenYin/ShenYin/Channel/PaXa/PaXa.xcassets/home/btn_record_stop.imageset/Group_2122@2x.png and /dev/null differ
diff --git a/ShenYin/ShenYin/Channel/PaXa/PaXa.xcassets/home/btn_record_stop.imageset/Group_2122@3x.png b/ShenYin/ShenYin/Channel/PaXa/PaXa.xcassets/home/btn_record_stop.imageset/Group_2122@3x.png
deleted file mode 100644 (file)
index 93b3ac8..0000000
Binary files a/ShenYin/ShenYin/Channel/PaXa/PaXa.xcassets/home/btn_record_stop.imageset/Group_2122@3x.png and /dev/null differ
diff --git a/ShenYin/ShenYin/Channel/PaXa/PaXa.xcassets/home/btn_record_stop.imageset/Slice 324@2x.png b/ShenYin/ShenYin/Channel/PaXa/PaXa.xcassets/home/btn_record_stop.imageset/Slice 324@2x.png
new file mode 100644 (file)
index 0000000..0e59971
Binary files /dev/null and b/ShenYin/ShenYin/Channel/PaXa/PaXa.xcassets/home/btn_record_stop.imageset/Slice 324@2x.png differ
diff --git a/ShenYin/ShenYin/Channel/PaXa/PaXa.xcassets/home/btn_record_stop.imageset/Slice 324@3x.png b/ShenYin/ShenYin/Channel/PaXa/PaXa.xcassets/home/btn_record_stop.imageset/Slice 324@3x.png
new file mode 100644 (file)
index 0000000..49f99af
Binary files /dev/null and b/ShenYin/ShenYin/Channel/PaXa/PaXa.xcassets/home/btn_record_stop.imageset/Slice 324@3x.png differ
index 6d169ae..0146e1e 100644 (file)
@@ -5,12 +5,12 @@
       "scale" : "1x"
     },
     {
       "scale" : "1x"
     },
     {
-      "filename" : "Group_2437@2x.png",
+      "filename" : "Slice 324@2x.png",
       "idiom" : "universal",
       "scale" : "2x"
     },
     {
       "idiom" : "universal",
       "scale" : "2x"
     },
     {
-      "filename" : "Group_2437@3x.png",
+      "filename" : "Slice 324@3x.png",
       "idiom" : "universal",
       "scale" : "3x"
     }
       "idiom" : "universal",
       "scale" : "3x"
     }
diff --git a/ShenYin/ShenYin/Channel/PaXa/PaXa.xcassets/home/dialog_device_ear.imageset/Group_2437@2x.png b/ShenYin/ShenYin/Channel/PaXa/PaXa.xcassets/home/dialog_device_ear.imageset/Group_2437@2x.png
deleted file mode 100644 (file)
index 275aaab..0000000
Binary files a/ShenYin/ShenYin/Channel/PaXa/PaXa.xcassets/home/dialog_device_ear.imageset/Group_2437@2x.png and /dev/null differ
diff --git a/ShenYin/ShenYin/Channel/PaXa/PaXa.xcassets/home/dialog_device_ear.imageset/Group_2437@3x.png b/ShenYin/ShenYin/Channel/PaXa/PaXa.xcassets/home/dialog_device_ear.imageset/Group_2437@3x.png
deleted file mode 100644 (file)
index 752bfa3..0000000
Binary files a/ShenYin/ShenYin/Channel/PaXa/PaXa.xcassets/home/dialog_device_ear.imageset/Group_2437@3x.png and /dev/null differ
diff --git a/ShenYin/ShenYin/Channel/PaXa/PaXa.xcassets/home/dialog_device_ear.imageset/Slice 324@2x.png b/ShenYin/ShenYin/Channel/PaXa/PaXa.xcassets/home/dialog_device_ear.imageset/Slice 324@2x.png
new file mode 100644 (file)
index 0000000..fe9c8ea
Binary files /dev/null and b/ShenYin/ShenYin/Channel/PaXa/PaXa.xcassets/home/dialog_device_ear.imageset/Slice 324@2x.png differ
diff --git a/ShenYin/ShenYin/Channel/PaXa/PaXa.xcassets/home/dialog_device_ear.imageset/Slice 324@3x.png b/ShenYin/ShenYin/Channel/PaXa/PaXa.xcassets/home/dialog_device_ear.imageset/Slice 324@3x.png
new file mode 100644 (file)
index 0000000..7bc814f
Binary files /dev/null and b/ShenYin/ShenYin/Channel/PaXa/PaXa.xcassets/home/dialog_device_ear.imageset/Slice 324@3x.png differ
index b7db985..0146e1e 100644 (file)
@@ -5,12 +5,12 @@
       "scale" : "1x"
     },
     {
       "scale" : "1x"
     },
     {
-      "filename" : "Group_2435@2x.png",
+      "filename" : "Slice 324@2x.png",
       "idiom" : "universal",
       "scale" : "2x"
     },
     {
       "idiom" : "universal",
       "scale" : "2x"
     },
     {
-      "filename" : "Group_2435@3x.png",
+      "filename" : "Slice 324@3x.png",
       "idiom" : "universal",
       "scale" : "3x"
     }
       "idiom" : "universal",
       "scale" : "3x"
     }
diff --git a/ShenYin/ShenYin/Channel/PaXa/PaXa.xcassets/home/dialog_device_phone.imageset/Group_2435@2x.png b/ShenYin/ShenYin/Channel/PaXa/PaXa.xcassets/home/dialog_device_phone.imageset/Group_2435@2x.png
deleted file mode 100644 (file)
index 1fe725e..0000000
Binary files a/ShenYin/ShenYin/Channel/PaXa/PaXa.xcassets/home/dialog_device_phone.imageset/Group_2435@2x.png and /dev/null differ
diff --git a/ShenYin/ShenYin/Channel/PaXa/PaXa.xcassets/home/dialog_device_phone.imageset/Group_2435@3x.png b/ShenYin/ShenYin/Channel/PaXa/PaXa.xcassets/home/dialog_device_phone.imageset/Group_2435@3x.png
deleted file mode 100644 (file)
index 62a8eab..0000000
Binary files a/ShenYin/ShenYin/Channel/PaXa/PaXa.xcassets/home/dialog_device_phone.imageset/Group_2435@3x.png and /dev/null differ
diff --git a/ShenYin/ShenYin/Channel/PaXa/PaXa.xcassets/home/dialog_device_phone.imageset/Slice 324@2x.png b/ShenYin/ShenYin/Channel/PaXa/PaXa.xcassets/home/dialog_device_phone.imageset/Slice 324@2x.png
new file mode 100644 (file)
index 0000000..05d7f48
Binary files /dev/null and b/ShenYin/ShenYin/Channel/PaXa/PaXa.xcassets/home/dialog_device_phone.imageset/Slice 324@2x.png differ
diff --git a/ShenYin/ShenYin/Channel/PaXa/PaXa.xcassets/home/dialog_device_phone.imageset/Slice 324@3x.png b/ShenYin/ShenYin/Channel/PaXa/PaXa.xcassets/home/dialog_device_phone.imageset/Slice 324@3x.png
new file mode 100644 (file)
index 0000000..f780df0
Binary files /dev/null and b/ShenYin/ShenYin/Channel/PaXa/PaXa.xcassets/home/dialog_device_phone.imageset/Slice 324@3x.png differ
index c98d767..5c4d3b1 100644 (file)
@@ -5,12 +5,12 @@
       "scale" : "1x"
     },
     {
       "scale" : "1x"
     },
     {
-      "filename" : "Frame@2x(2).png",
+      "filename" : "Frame@2x.png",
       "idiom" : "universal",
       "scale" : "2x"
     },
     {
       "idiom" : "universal",
       "scale" : "2x"
     },
     {
-      "filename" : "Frame@3x(2).png",
+      "filename" : "Frame@3x.png",
       "idiom" : "universal",
       "scale" : "3x"
     }
       "idiom" : "universal",
       "scale" : "3x"
     }
diff --git a/ShenYin/ShenYin/Channel/PaXa/PaXa.xcassets/home/language_switch.imageset/Frame@2x(2).png b/ShenYin/ShenYin/Channel/PaXa/PaXa.xcassets/home/language_switch.imageset/Frame@2x(2).png
deleted file mode 100644 (file)
index f8e63fe..0000000
Binary files a/ShenYin/ShenYin/Channel/PaXa/PaXa.xcassets/home/language_switch.imageset/Frame@2x(2).png and /dev/null differ
diff --git a/ShenYin/ShenYin/Channel/PaXa/PaXa.xcassets/home/language_switch.imageset/Frame@2x.png b/ShenYin/ShenYin/Channel/PaXa/PaXa.xcassets/home/language_switch.imageset/Frame@2x.png
new file mode 100644 (file)
index 0000000..6fce424
Binary files /dev/null and b/ShenYin/ShenYin/Channel/PaXa/PaXa.xcassets/home/language_switch.imageset/Frame@2x.png differ
diff --git a/ShenYin/ShenYin/Channel/PaXa/PaXa.xcassets/home/language_switch.imageset/Frame@3x(2).png b/ShenYin/ShenYin/Channel/PaXa/PaXa.xcassets/home/language_switch.imageset/Frame@3x(2).png
deleted file mode 100644 (file)
index 436718b..0000000
Binary files a/ShenYin/ShenYin/Channel/PaXa/PaXa.xcassets/home/language_switch.imageset/Frame@3x(2).png and /dev/null differ
diff --git a/ShenYin/ShenYin/Channel/PaXa/PaXa.xcassets/home/language_switch.imageset/Frame@3x.png b/ShenYin/ShenYin/Channel/PaXa/PaXa.xcassets/home/language_switch.imageset/Frame@3x.png
new file mode 100644 (file)
index 0000000..5f0d0cf
Binary files /dev/null and b/ShenYin/ShenYin/Channel/PaXa/PaXa.xcassets/home/language_switch.imageset/Frame@3x.png differ
diff --git a/ShenYin/ShenYin/Channel/PaXa/PaXa.xcassets/home/pop_pause.imageset/Contents.json b/ShenYin/ShenYin/Channel/PaXa/PaXa.xcassets/home/pop_pause.imageset/Contents.json
new file mode 100644 (file)
index 0000000..1fbb8c3
--- /dev/null
@@ -0,0 +1,22 @@
+{
+  "images" : [
+    {
+      "idiom" : "universal",
+      "scale" : "1x"
+    },
+    {
+      "filename" : "Slice 358@2x.png",
+      "idiom" : "universal",
+      "scale" : "2x"
+    },
+    {
+      "filename" : "Slice 358@3x.png",
+      "idiom" : "universal",
+      "scale" : "3x"
+    }
+  ],
+  "info" : {
+    "author" : "xcode",
+    "version" : 1
+  }
+}
diff --git a/ShenYin/ShenYin/Channel/PaXa/PaXa.xcassets/home/pop_pause.imageset/Slice 358@2x.png b/ShenYin/ShenYin/Channel/PaXa/PaXa.xcassets/home/pop_pause.imageset/Slice 358@2x.png
new file mode 100644 (file)
index 0000000..df381c1
Binary files /dev/null and b/ShenYin/ShenYin/Channel/PaXa/PaXa.xcassets/home/pop_pause.imageset/Slice 358@2x.png differ
diff --git a/ShenYin/ShenYin/Channel/PaXa/PaXa.xcassets/home/pop_pause.imageset/Slice 358@3x.png b/ShenYin/ShenYin/Channel/PaXa/PaXa.xcassets/home/pop_pause.imageset/Slice 358@3x.png
new file mode 100644 (file)
index 0000000..b996fe4
Binary files /dev/null and b/ShenYin/ShenYin/Channel/PaXa/PaXa.xcassets/home/pop_pause.imageset/Slice 358@3x.png differ
diff --git a/ShenYin/ShenYin/Channel/PaXa/PaXa.xcassets/home/pop_play.imageset/Contents.json b/ShenYin/ShenYin/Channel/PaXa/PaXa.xcassets/home/pop_play.imageset/Contents.json
new file mode 100644 (file)
index 0000000..75f3491
--- /dev/null
@@ -0,0 +1,22 @@
+{
+  "images" : [
+    {
+      "idiom" : "universal",
+      "scale" : "1x"
+    },
+    {
+      "filename" : "Slice 359@2x.png",
+      "idiom" : "universal",
+      "scale" : "2x"
+    },
+    {
+      "filename" : "Slice 359@3x.png",
+      "idiom" : "universal",
+      "scale" : "3x"
+    }
+  ],
+  "info" : {
+    "author" : "xcode",
+    "version" : 1
+  }
+}
diff --git a/ShenYin/ShenYin/Channel/PaXa/PaXa.xcassets/home/pop_play.imageset/Slice 359@2x.png b/ShenYin/ShenYin/Channel/PaXa/PaXa.xcassets/home/pop_play.imageset/Slice 359@2x.png
new file mode 100644 (file)
index 0000000..3ba1492
Binary files /dev/null and b/ShenYin/ShenYin/Channel/PaXa/PaXa.xcassets/home/pop_play.imageset/Slice 359@2x.png differ
diff --git a/ShenYin/ShenYin/Channel/PaXa/PaXa.xcassets/home/pop_play.imageset/Slice 359@3x.png b/ShenYin/ShenYin/Channel/PaXa/PaXa.xcassets/home/pop_play.imageset/Slice 359@3x.png
new file mode 100644 (file)
index 0000000..30f7190
Binary files /dev/null and b/ShenYin/ShenYin/Channel/PaXa/PaXa.xcassets/home/pop_play.imageset/Slice 359@3x.png differ
diff --git a/ShenYin/ShenYin/Channel/PaXa/PaXa.xcassets/home/record_pause 3.imageset/Contents.json b/ShenYin/ShenYin/Channel/PaXa/PaXa.xcassets/home/record_pause 3.imageset/Contents.json
deleted file mode 100644 (file)
index ee25467..0000000
+++ /dev/null
@@ -1,22 +0,0 @@
-{
-  "images" : [
-    {
-      "idiom" : "universal",
-      "scale" : "1x"
-    },
-    {
-      "filename" : "Group_2274@2x.png",
-      "idiom" : "universal",
-      "scale" : "2x"
-    },
-    {
-      "filename" : "Group_2274@3x.png",
-      "idiom" : "universal",
-      "scale" : "3x"
-    }
-  ],
-  "info" : {
-    "author" : "xcode",
-    "version" : 1
-  }
-}
diff --git a/ShenYin/ShenYin/Channel/PaXa/PaXa.xcassets/home/record_pause 3.imageset/Group_2274@2x.png b/ShenYin/ShenYin/Channel/PaXa/PaXa.xcassets/home/record_pause 3.imageset/Group_2274@2x.png
deleted file mode 100644 (file)
index 79d60ef..0000000
Binary files a/ShenYin/ShenYin/Channel/PaXa/PaXa.xcassets/home/record_pause 3.imageset/Group_2274@2x.png and /dev/null differ
diff --git a/ShenYin/ShenYin/Channel/PaXa/PaXa.xcassets/home/record_pause 3.imageset/Group_2274@3x.png b/ShenYin/ShenYin/Channel/PaXa/PaXa.xcassets/home/record_pause 3.imageset/Group_2274@3x.png
deleted file mode 100644 (file)
index fa0aab5..0000000
Binary files a/ShenYin/ShenYin/Channel/PaXa/PaXa.xcassets/home/record_pause 3.imageset/Group_2274@3x.png and /dev/null differ
diff --git a/ShenYin/ShenYin/Channel/PaXa/PaXa.xcassets/home/record_play 3.imageset/Contents.json b/ShenYin/ShenYin/Channel/PaXa/PaXa.xcassets/home/record_play 3.imageset/Contents.json
deleted file mode 100644 (file)
index 146b9ca..0000000
+++ /dev/null
@@ -1,22 +0,0 @@
-{
-  "images" : [
-    {
-      "idiom" : "universal",
-      "scale" : "1x"
-    },
-    {
-      "filename" : "Group_2275@2x.png",
-      "idiom" : "universal",
-      "scale" : "2x"
-    },
-    {
-      "filename" : "Group_2275@3x.png",
-      "idiom" : "universal",
-      "scale" : "3x"
-    }
-  ],
-  "info" : {
-    "author" : "xcode",
-    "version" : 1
-  }
-}
diff --git a/ShenYin/ShenYin/Channel/PaXa/PaXa.xcassets/home/record_play 3.imageset/Group_2275@2x.png b/ShenYin/ShenYin/Channel/PaXa/PaXa.xcassets/home/record_play 3.imageset/Group_2275@2x.png
deleted file mode 100644 (file)
index f046216..0000000
Binary files a/ShenYin/ShenYin/Channel/PaXa/PaXa.xcassets/home/record_play 3.imageset/Group_2275@2x.png and /dev/null differ
diff --git a/ShenYin/ShenYin/Channel/PaXa/PaXa.xcassets/home/record_play 3.imageset/Group_2275@3x.png b/ShenYin/ShenYin/Channel/PaXa/PaXa.xcassets/home/record_play 3.imageset/Group_2275@3x.png
deleted file mode 100644 (file)
index b6f9917..0000000
Binary files a/ShenYin/ShenYin/Channel/PaXa/PaXa.xcassets/home/record_play 3.imageset/Group_2275@3x.png and /dev/null differ
diff --git a/ShenYin/ShenYin/Channel/PaXa/PaXa.xcassets/home/translate_bg.imageset/Contents.json b/ShenYin/ShenYin/Channel/PaXa/PaXa.xcassets/home/translate_bg.imageset/Contents.json
deleted file mode 100644 (file)
index 884debb..0000000
+++ /dev/null
@@ -1,22 +0,0 @@
-{
-  "images" : [
-    {
-      "idiom" : "universal",
-      "scale" : "1x"
-    },
-    {
-      "filename" : "语音发送中@2x.png",
-      "idiom" : "universal",
-      "scale" : "2x"
-    },
-    {
-      "filename" : "语音发送中@3x.png",
-      "idiom" : "universal",
-      "scale" : "3x"
-    }
-  ],
-  "info" : {
-    "author" : "xcode",
-    "version" : 1
-  }
-}
diff --git a/ShenYin/ShenYin/Channel/PaXa/PaXa.xcassets/home/translate_bg.imageset/语音发送中@2x.png b/ShenYin/ShenYin/Channel/PaXa/PaXa.xcassets/home/translate_bg.imageset/语音发送中@2x.png
deleted file mode 100644 (file)
index de5c375..0000000
Binary files "a/ShenYin/ShenYin/Channel/PaXa/PaXa.xcassets/home/translate_bg.imageset/\350\257\255\351\237\263\345\217\221\351\200\201\344\270\255@2x.png" and /dev/null differ
diff --git a/ShenYin/ShenYin/Channel/PaXa/PaXa.xcassets/home/translate_bg.imageset/语音发送中@3x.png b/ShenYin/ShenYin/Channel/PaXa/PaXa.xcassets/home/translate_bg.imageset/语音发送中@3x.png
deleted file mode 100644 (file)
index 60cb958..0000000
Binary files "a/ShenYin/ShenYin/Channel/PaXa/PaXa.xcassets/home/translate_bg.imageset/\350\257\255\351\237\263\345\217\221\351\200\201\344\270\255@3x.png" and /dev/null differ
index a0fd3e0..f260450 100644 (file)
@@ -4,6 +4,7 @@
 //
 //  Created by liangshi on 2025/9/16.
 //
 //
 //  Created by liangshi on 2025/9/16.
 //
+import DGActivityIndicatorView
 
 enum DialogRecordDeviceType{
     case earphone
 
 enum DialogRecordDeviceType{
     case earphone
@@ -19,7 +20,7 @@ enum DialogRecordLayoutType{
 }
 protocol DialogRecordBarDelegate:NSObject {
     func recordBar(_ bar:DialogRecordBar,layoutChange :DialogRecordLayoutType)
 }
 protocol DialogRecordBarDelegate:NSObject {
     func recordBar(_ bar:DialogRecordBar,layoutChange :DialogRecordLayoutType)
-    func recordBar(_ bar:DialogRecordBar, device:DialogRecordDeviceType,stateChange state:RecordBarSate)
+    func recordBar(_ bar:DialogRecordBar, device:DialogRecordDeviceType,stateChange state:DialogRecordDeviceState)
 }
 
 extension UIView{
 }
 
 extension UIView{
@@ -354,4 +355,46 @@ class DialogRecordBar: BaseView {
             }
         }
     }
             }
         }
     }
+    
+    class DialogRecordingButton:UIButton{
+        let activeView = DGActivityIndicatorView(type: .lineScalePulseOut,tintColor: UIColor.hexString("#919191"),size: 20)!
+        let loadView = DGActivityIndicatorView(type: .ballClipRotate,tintColor: UIColor.hexString("#919191"))!
+        
+        override init(frame: CGRect) {
+            super.init(frame: frame)
+            activeView.backgroundColor = .color(.bgColor)
+            activeView.yc.setBorder(width: 2, color: .hexString("#919191"), radius: 17)
+            addSubview(activeView)
+            activeView.snp.remakeConstraints { make in
+                make.edges.equalToSuperview()
+            }
+            
+            addSubview(loadView)
+            loadView.snp.remakeConstraints { make in
+                make.edges.equalToSuperview()
+            }
+            loadView.backgroundColor = .color(.bgColor)
+        }
+        
+        required init?(coder: NSCoder) {
+            fatalError("init(coder:) has not been implemented")
+        }
+        func startAnimating(finished:(()->Void)? = nil){
+            loadView.isHidden = true
+            activeView.isHidden = false
+            activeView.startAnimating()
+        }
+        func stopAnimating(finished:@escaping (()->Void)){
+            activeView.stopAnimating()
+            activeView.isHidden = true
+            
+            loadView.isHidden = false
+            loadView.startAnimating()
+            DispatchQueue.main.asyncAfter(deadline:.now() + 0.3) { [weak self] in
+                self?.loadView.stopAnimating()
+                finished()
+            }
+        }
+    }
+
 }
 }
@@ -5,21 +5,21 @@
 //  Created by liangshi on 2025/8/27.
 //
 
 //  Created by liangshi on 2025/8/27.
 //
 
-enum RecordBarSate:Int{
+enum Chinese2EnglishRecordBarSate:Int{
     case start
     case stop
 }
 
     case start
     case stop
 }
 
-protocol RecordBarDelegate:NSObject {
-    func recordBarLanguageChange(_ bar:RecordBar)
-    func recordBar(_ bar:RecordBar,stateChange state:RecordBarSate)
+protocol Chinese2EnglishRecordBarDelegate:NSObject {
+    func recordBarLanguageChange(_ bar:Chinese2EnglishRecordBar)
+    func recordBar(_ bar:Chinese2EnglishRecordBar,stateChange state:Chinese2EnglishRecordBarSate)
 }
 
 }
 
-class RecordBar: BaseView {
+class Chinese2EnglishRecordBar: BaseView {
     let recordBtn = LoadingButton()
     let leftItem = RecordBarItem()
     let rightItem = RecordBarItem()
     let recordBtn = LoadingButton()
     let leftItem = RecordBarItem()
     let rightItem = RecordBarItem()
-    weak var delegate:RecordBarDelegate?
+    weak var delegate:Chinese2EnglishRecordBarDelegate?
     var isChienseEnglish = false{
         didSet{
             if isChienseEnglish {
     var isChienseEnglish = false{
         didSet{
             if isChienseEnglish {
index aa38f8a..718e642 100644 (file)
@@ -46,6 +46,10 @@ class RecordDetaiContent: BaseView {
             v.isEditable = false
         }
         backgroundColor = .color(.bgColor)
             v.isEditable = false
         }
         backgroundColor = .color(.bgColor)
+//        if CCConfig.appType == .paxa {
+//            backgroundColor = .white
+//            yc.setCornerRadius(8)
+//        }
     }
     
     override func setupLayout() {
     }
     
     override func setupLayout() {
index 0910d00..ed97e9a 100644 (file)
@@ -93,43 +93,3 @@ class RecordingView: UIView {
         activeView.stopAnimating()
     }
 }
         activeView.stopAnimating()
     }
 }
-class DialogRecordingButton:UIButton{
-    let activeView = DGActivityIndicatorView(type: .lineScalePulseOut,tintColor: UIColor.hexString("#919191"),size: 20)!
-    let loadView = DGActivityIndicatorView(type: .ballClipRotate,tintColor: UIColor.hexString("#919191"))!
-    
-    override init(frame: CGRect) {
-        super.init(frame: frame)
-        activeView.backgroundColor = .color(.bgColor)
-        activeView.yc.setBorder(width: 2, color: .hexString("#919191"), radius: 17)
-        addSubview(activeView)
-        activeView.snp.remakeConstraints { make in
-            make.edges.equalToSuperview()
-        }
-        
-        addSubview(loadView)
-        loadView.snp.remakeConstraints { make in
-            make.edges.equalToSuperview()
-        }
-        loadView.backgroundColor = .color(.bgColor)
-    }
-    
-    required init?(coder: NSCoder) {
-        fatalError("init(coder:) has not been implemented")
-    }
-    func startAnimating(finished:(()->Void)? = nil){
-        loadView.isHidden = true
-        activeView.isHidden = false
-        activeView.startAnimating()
-    }
-    func stopAnimating(finished:@escaping (()->Void)){
-        activeView.stopAnimating()
-        activeView.isHidden = true
-
-        loadView.isHidden = false
-        loadView.startAnimating()
-        DispatchQueue.main.asyncAfter(deadline:.now() + 0.3) { [weak self] in
-            self?.loadView.stopAnimating()
-            finished()
-        }
-    }
-}
index cbfb862..0661b1a 100644 (file)
@@ -81,8 +81,8 @@ class PopPlayView: BasePresentView2 {
             v.font = .regular(12)
         }
         playBtn.do { v in
             v.font = .regular(12)
         }
         playBtn.do { v in
-            v.setImage(UIImage(named: "record_play 3"), for: .normal)
-            v.setImage(UIImage(named: "record_pause 3"), for: .selected)
+            v.setImage(UIImage(named: "pop_play"), for: .normal)
+            v.setImage(UIImage(named: "pop_pause"), for: .selected)
             v.addTarget(self, action: #selector(btnAction), for: .touchUpInside)
             v.isEnabled = false
         }
             v.addTarget(self, action: #selector(btnAction), for: .touchUpInside)
             v.isEnabled = false
         }
@@ -115,7 +115,6 @@ class PopPlayView: BasePresentView2 {
             m.left.right.equalToSuperview()
         }
         slider.snp.makeConstraints { make in
             m.left.right.equalToSuperview()
         }
         slider.snp.makeConstraints { make in
-            //            make.width.equalTo(200)
             make.height.equalTo(40)
             make.centerX.equalToSuperview()
             make.left.right.equalToSuperview().inset(40)
             make.height.equalTo(40)
             make.centerX.equalToSuperview()
             make.left.right.equalToSuperview().inset(40)
@@ -130,7 +129,7 @@ class PopPlayView: BasePresentView2 {
             make.top.equalTo(slider.snp.bottom)
         }
         playBtn.snp.makeConstraints { make in
             make.top.equalTo(slider.snp.bottom)
         }
         playBtn.snp.makeConstraints { make in
-            make.size.equalTo(60)
+            make.size.equalTo(CCConfig.popPlaySize)
             make.centerX.equalToSuperview()
             make.bottom.equalToSuperview().inset(20)
         }
             make.centerX.equalToSuperview()
             make.bottom.equalToSuperview().inset(20)
         }