对话UI完善
authorliangzhenying <867174124@qq.com>
Sat, 27 Sep 2025 02:24:24 +0000 (10:24 +0800)
committerliangzhenying <867174124@qq.com>
Sat, 27 Sep 2025 02:24:24 +0000 (10:24 +0800)
36 files changed:
ShenYin/ShenYin/Assets.xcassets/home/audio_record_normal.imageset/Contents.json [new file with mode: 0644]
ShenYin/ShenYin/Assets.xcassets/home/audio_record_normal.imageset/record_normal@2x.png [new file with mode: 0644]
ShenYin/ShenYin/Assets.xcassets/home/audio_record_normal.imageset/record_normal@3x.png [new file with mode: 0644]
ShenYin/ShenYin/Assets.xcassets/home/record_detail_copy.imageset/Contents.json [new file with mode: 0644]
ShenYin/ShenYin/Assets.xcassets/home/record_detail_copy.imageset/Frame 1986@2x.png [new file with mode: 0644]
ShenYin/ShenYin/Assets.xcassets/home/record_detail_copy.imageset/Frame 1986@3x.png [new file with mode: 0644]
ShenYin/ShenYin/Assets.xcassets/home/upload.imageset/Contents.json [new file with mode: 0644]
ShenYin/ShenYin/Assets.xcassets/home/upload.imageset/Frame@2x.png [new file with mode: 0644]
ShenYin/ShenYin/Assets.xcassets/home/upload.imageset/Frame@3x.png [new file with mode: 0644]
ShenYin/ShenYin/Assets.xcassets/mine/tip_normal.imageset/Contents.json [new file with mode: 0644]
ShenYin/ShenYin/Assets.xcassets/mine/tip_normal.imageset/Ellipse_52@2x.png [new file with mode: 0644]
ShenYin/ShenYin/Assets.xcassets/mine/tip_normal.imageset/Ellipse_52@3x.png [new file with mode: 0644]
ShenYin/ShenYin/Assets.xcassets/mine/tip_selected.imageset/Contents.json [new file with mode: 0644]
ShenYin/ShenYin/Assets.xcassets/mine/tip_selected.imageset/Group 1255@2x.png [new file with mode: 0644]
ShenYin/ShenYin/Assets.xcassets/mine/tip_selected.imageset/Group 1255@3x.png [new file with mode: 0644]
ShenYin/ShenYin/Resource/dialog_record.gif [new file with mode: 0644]
ShenYin/ShenYin/Resource/record_start.gif [new file with mode: 0644]
ShenYin/ShenYin/UI/Home/CallingRecordVC.swift
ShenYin/ShenYin/UI/Home/Chat/ChatRecordBar.swift
ShenYin/ShenYin/UI/Home/Chat/ChatVC.swift
ShenYin/ShenYin/UI/Home/Chinese2English/Chinese2EnglishVC.swift
ShenYin/ShenYin/UI/Home/Dialog/DialogTranlateVC.swift
ShenYin/ShenYin/UI/Home/FieldRecording/FieldRecordBar.swift
ShenYin/ShenYin/UI/Home/FieldRecording/FieldRecordingVC.swift
ShenYin/ShenYin/UI/Home/FieldRecording/RhythView.swift
ShenYin/ShenYin/UI/Home/RecordDetail/RecordDetaiContent.swift [new file with mode: 0644]
ShenYin/ShenYin/UI/Home/RecordDetail/RecordDetailTopBar.swift
ShenYin/ShenYin/UI/Home/RecordDetail/RecordDetailVC.swift
ShenYin/ShenYin/UI/Home/RecordTranslateVC.swift
ShenYin/ShenYin/UI/Launch/AppManager.swift
ShenYin/ShenYin/UI/Launch/SceneDelegate.swift
ShenYin/ShenYin/UI/common/Cache/CacheManager.swift [new file with mode: 0644]
ShenYin/ShenYin/UI/common/Cache/DeviceCache.swift [moved from ShenYin/ShenYin/UI/Launch/CacheManager.swift with 81% similarity]
ShenYin/ShenYin/UI/common/Cache/TipsCache.swift [new file with mode: 0644]
ShenYin/ShenYin/UI/common/LoadingButton.swift
ShenYin/ShenYin/UI/common/pop/RecordTipsView.swift

diff --git a/ShenYin/ShenYin/Assets.xcassets/home/audio_record_normal.imageset/Contents.json b/ShenYin/ShenYin/Assets.xcassets/home/audio_record_normal.imageset/Contents.json
new file mode 100644 (file)
index 0000000..0ffdf24
--- /dev/null
@@ -0,0 +1,22 @@
+{
+  "images" : [
+    {
+      "idiom" : "universal",
+      "scale" : "1x"
+    },
+    {
+      "filename" : "record_normal@2x.png",
+      "idiom" : "universal",
+      "scale" : "2x"
+    },
+    {
+      "filename" : "record_normal@3x.png",
+      "idiom" : "universal",
+      "scale" : "3x"
+    }
+  ],
+  "info" : {
+    "author" : "xcode",
+    "version" : 1
+  }
+}
diff --git a/ShenYin/ShenYin/Assets.xcassets/home/audio_record_normal.imageset/record_normal@2x.png b/ShenYin/ShenYin/Assets.xcassets/home/audio_record_normal.imageset/record_normal@2x.png
new file mode 100644 (file)
index 0000000..675a506
Binary files /dev/null and b/ShenYin/ShenYin/Assets.xcassets/home/audio_record_normal.imageset/record_normal@2x.png differ
diff --git a/ShenYin/ShenYin/Assets.xcassets/home/audio_record_normal.imageset/record_normal@3x.png b/ShenYin/ShenYin/Assets.xcassets/home/audio_record_normal.imageset/record_normal@3x.png
new file mode 100644 (file)
index 0000000..d9ec282
Binary files /dev/null and b/ShenYin/ShenYin/Assets.xcassets/home/audio_record_normal.imageset/record_normal@3x.png differ
diff --git a/ShenYin/ShenYin/Assets.xcassets/home/record_detail_copy.imageset/Contents.json b/ShenYin/ShenYin/Assets.xcassets/home/record_detail_copy.imageset/Contents.json
new file mode 100644 (file)
index 0000000..16fb6d3
--- /dev/null
@@ -0,0 +1,22 @@
+{
+  "images" : [
+    {
+      "idiom" : "universal",
+      "scale" : "1x"
+    },
+    {
+      "filename" : "Frame 1986@2x.png",
+      "idiom" : "universal",
+      "scale" : "2x"
+    },
+    {
+      "filename" : "Frame 1986@3x.png",
+      "idiom" : "universal",
+      "scale" : "3x"
+    }
+  ],
+  "info" : {
+    "author" : "xcode",
+    "version" : 1
+  }
+}
diff --git a/ShenYin/ShenYin/Assets.xcassets/home/record_detail_copy.imageset/Frame 1986@2x.png b/ShenYin/ShenYin/Assets.xcassets/home/record_detail_copy.imageset/Frame 1986@2x.png
new file mode 100644 (file)
index 0000000..92ab540
Binary files /dev/null and b/ShenYin/ShenYin/Assets.xcassets/home/record_detail_copy.imageset/Frame 1986@2x.png differ
diff --git a/ShenYin/ShenYin/Assets.xcassets/home/record_detail_copy.imageset/Frame 1986@3x.png b/ShenYin/ShenYin/Assets.xcassets/home/record_detail_copy.imageset/Frame 1986@3x.png
new file mode 100644 (file)
index 0000000..12af0e5
Binary files /dev/null and b/ShenYin/ShenYin/Assets.xcassets/home/record_detail_copy.imageset/Frame 1986@3x.png differ
diff --git a/ShenYin/ShenYin/Assets.xcassets/home/upload.imageset/Contents.json b/ShenYin/ShenYin/Assets.xcassets/home/upload.imageset/Contents.json
new file mode 100644 (file)
index 0000000..5c4d3b1
--- /dev/null
@@ -0,0 +1,22 @@
+{
+  "images" : [
+    {
+      "idiom" : "universal",
+      "scale" : "1x"
+    },
+    {
+      "filename" : "Frame@2x.png",
+      "idiom" : "universal",
+      "scale" : "2x"
+    },
+    {
+      "filename" : "Frame@3x.png",
+      "idiom" : "universal",
+      "scale" : "3x"
+    }
+  ],
+  "info" : {
+    "author" : "xcode",
+    "version" : 1
+  }
+}
diff --git a/ShenYin/ShenYin/Assets.xcassets/home/upload.imageset/Frame@2x.png b/ShenYin/ShenYin/Assets.xcassets/home/upload.imageset/Frame@2x.png
new file mode 100644 (file)
index 0000000..3ce50ed
Binary files /dev/null and b/ShenYin/ShenYin/Assets.xcassets/home/upload.imageset/Frame@2x.png differ
diff --git a/ShenYin/ShenYin/Assets.xcassets/home/upload.imageset/Frame@3x.png b/ShenYin/ShenYin/Assets.xcassets/home/upload.imageset/Frame@3x.png
new file mode 100644 (file)
index 0000000..375579f
Binary files /dev/null and b/ShenYin/ShenYin/Assets.xcassets/home/upload.imageset/Frame@3x.png differ
diff --git a/ShenYin/ShenYin/Assets.xcassets/mine/tip_normal.imageset/Contents.json b/ShenYin/ShenYin/Assets.xcassets/mine/tip_normal.imageset/Contents.json
new file mode 100644 (file)
index 0000000..5905c9c
--- /dev/null
@@ -0,0 +1,22 @@
+{
+  "images" : [
+    {
+      "idiom" : "universal",
+      "scale" : "1x"
+    },
+    {
+      "filename" : "Ellipse_52@2x.png",
+      "idiom" : "universal",
+      "scale" : "2x"
+    },
+    {
+      "filename" : "Ellipse_52@3x.png",
+      "idiom" : "universal",
+      "scale" : "3x"
+    }
+  ],
+  "info" : {
+    "author" : "xcode",
+    "version" : 1
+  }
+}
diff --git a/ShenYin/ShenYin/Assets.xcassets/mine/tip_normal.imageset/Ellipse_52@2x.png b/ShenYin/ShenYin/Assets.xcassets/mine/tip_normal.imageset/Ellipse_52@2x.png
new file mode 100644 (file)
index 0000000..9280587
Binary files /dev/null and b/ShenYin/ShenYin/Assets.xcassets/mine/tip_normal.imageset/Ellipse_52@2x.png differ
diff --git a/ShenYin/ShenYin/Assets.xcassets/mine/tip_normal.imageset/Ellipse_52@3x.png b/ShenYin/ShenYin/Assets.xcassets/mine/tip_normal.imageset/Ellipse_52@3x.png
new file mode 100644 (file)
index 0000000..a1fa2d5
Binary files /dev/null and b/ShenYin/ShenYin/Assets.xcassets/mine/tip_normal.imageset/Ellipse_52@3x.png differ
diff --git a/ShenYin/ShenYin/Assets.xcassets/mine/tip_selected.imageset/Contents.json b/ShenYin/ShenYin/Assets.xcassets/mine/tip_selected.imageset/Contents.json
new file mode 100644 (file)
index 0000000..df1a323
--- /dev/null
@@ -0,0 +1,22 @@
+{
+  "images" : [
+    {
+      "idiom" : "universal",
+      "scale" : "1x"
+    },
+    {
+      "filename" : "Group 1255@2x.png",
+      "idiom" : "universal",
+      "scale" : "2x"
+    },
+    {
+      "filename" : "Group 1255@3x.png",
+      "idiom" : "universal",
+      "scale" : "3x"
+    }
+  ],
+  "info" : {
+    "author" : "xcode",
+    "version" : 1
+  }
+}
diff --git a/ShenYin/ShenYin/Assets.xcassets/mine/tip_selected.imageset/Group 1255@2x.png b/ShenYin/ShenYin/Assets.xcassets/mine/tip_selected.imageset/Group 1255@2x.png
new file mode 100644 (file)
index 0000000..955a662
Binary files /dev/null and b/ShenYin/ShenYin/Assets.xcassets/mine/tip_selected.imageset/Group 1255@2x.png differ
diff --git a/ShenYin/ShenYin/Assets.xcassets/mine/tip_selected.imageset/Group 1255@3x.png b/ShenYin/ShenYin/Assets.xcassets/mine/tip_selected.imageset/Group 1255@3x.png
new file mode 100644 (file)
index 0000000..b142b7e
Binary files /dev/null and b/ShenYin/ShenYin/Assets.xcassets/mine/tip_selected.imageset/Group 1255@3x.png differ
diff --git a/ShenYin/ShenYin/Resource/dialog_record.gif b/ShenYin/ShenYin/Resource/dialog_record.gif
new file mode 100644 (file)
index 0000000..056c544
Binary files /dev/null and b/ShenYin/ShenYin/Resource/dialog_record.gif differ
diff --git a/ShenYin/ShenYin/Resource/record_start.gif b/ShenYin/ShenYin/Resource/record_start.gif
new file mode 100644 (file)
index 0000000..89700a2
Binary files /dev/null and b/ShenYin/ShenYin/Resource/record_start.gif differ
index e8f88d5..3113dba 100644 (file)
@@ -23,9 +23,12 @@ class CallingRecordVC:BaseVC{
         navBar.title = "通话录音"
         toolBar.delegate = self
         toolBar.hasRightItem = false
+        navBar.backgroundColor = .white
+        toolBar.delegate = self
+        view.backgroundColor = .white
         
         textView.do { v in
-            v.backgroundColor = .hexString("#F7F7F7")
+            v.backgroundColor = .white
             v.isEditable = false
             v.font = .regular(14)
             v.text = ""
index 2afde8a..9c163c2 100644 (file)
 }
 
 class ChatRecordBar:BaseView{
-    private var recordBtn = UIButton(type: .custom)
+    private var label = UILabel()
+    private var animationBg = UIView()
+    private var animationView = UIImageView()
     weak var delegate:ChatRecordBarDelegate?
     
     var isRecord:Bool = false{
         didSet{
-            recordBtn.isSelected = isRecord
+            if isRecord {
+                animationBg.backgroundColor = .hexString("#0092E1")
+                animationView.isHidden = false
+                label.text = ""
+            }
+            else{
+                animationBg.backgroundColor = .white
+                animationView.isHidden = true
+                animationView.isHidden = true
+                label.text = "按住说话"
+            }
         }
     }
     
     override func setupViews() {
-        recordBtn.backgroundColor = .blue
-        recordBtn.setTitle("开始录音", for: .normal)
-        recordBtn.setTitle("停止录音", for: .selected)
-        recordBtn.addTarget(self, action:  #selector(recordAction), for: .touchUpInside)
-        addSubview(recordBtn)
+        addSubview(animationBg)
+        animationBg.addSubviews([label,animationView])
+        
+        backgroundColor = .clear
+        label.do { v in
+            v.textColor = .hexString("#121212")
+            v.font = .bold(16)
+            v.textAlignment = .center
+        }
+
+        animationBg.do { v in
+            v.yc.setCornerRadius(16)
+            animationBg.backgroundColor = .white
+        }
+        
+        animationView.kf.setImage(with: Bundle.main.url(forResource: "dialog_record", withExtension: "gif")!)
+        self.isRecord = false
 
+        let longPressGesture = UILongPressGestureRecognizer(target: self, action: #selector(handleLongPress(_:)))
+        self.addGestureRecognizer(longPressGesture)
+        
     }
     override func setupLayout() {
-        recordBtn.snp.makeConstraints { make in
-            make.width.centerX.bottom.equalToSuperview()
-            make.height.equalToSuperview()
+        animationBg.snp.makeConstraints { make in
+            make.left.right.equalToSuperview().inset(18)
+            make.top.height.equalToSuperview()
+        }
+        animationView.snp.makeConstraints { make in
+            make.width.equalTo(218)
+            make.height.equalTo(24)
+            make.center.equalToSuperview()
+        }
+        label.snp.makeConstraints { make in
+            make.edges.equalToSuperview()
         }
     }
     
-    @objc func recordAction(){
-        recordBtn.isSelected = !recordBtn.isSelected
-        if recordBtn.isSelected{
+    @objc func handleLongPress(_ gesture: UILongPressGestureRecognizer) {
+        switch gesture.state {
+        case.began:
+            print("started")
+            self.isRecord = true
             delegate?.recordBarStart(self)
-        }
-        else{
+        case.ended:
+            print("ended")
+            self.isRecord = false
             delegate?.recordBarStop(self)
+        default:
+            break
         }
     }
+
 }
 
index f271ff9..b547019 100644 (file)
@@ -63,7 +63,7 @@ class ChatVC:BaseVC{
         toolBar.snp.makeConstraints { make in
             make.width.centerX.equalToSuperview()
             make.height.equalTo(52)
-            make.bottom.equalToSuperview().inset(20)
+            make.bottom.equalToSuperview().inset(30)
         }
         tableView.snp.makeConstraints { make in
             make.top.equalToSuperview().inset(80)
index 0c3e100..1385935 100644 (file)
@@ -61,6 +61,10 @@ class Chinese2EnglishVC:BaseVC{
 //        } catch {
 //            print(error)
 //        }
+        
+        if TipsCache.needShow(type: .chinese2english) {
+            RecordTipsView(type: .chinese2english).show()
+        }
     }
     override func viewDidAppear(_ animated: Bool) {
         super.viewDidAppear(animated)
index 90333d7..e026732 100644 (file)
@@ -82,6 +82,10 @@ class DialogTranslateVC:BaseVC{
             print(error)
         }
         PcmSound.sharedInstance().setup(16000, withchannels: 1)
+        
+        if TipsCache.needShow(type: .dialog) {
+            RecordTipsView(type: .dialog).show()
+        }
     }
     override func navRightViewTapped() {
         let tip = RecordTipsView(type: .tongchuan)
index fc0689c..79c095d 100644 (file)
@@ -27,7 +27,7 @@ class FieldRecordBar: BaseView {
     var hasRightItem:Bool = true
     
     override func setupViews() {
-        backgroundColor = .hexString("#F7F7F7")
+        backgroundColor = .white
         addSubviews([leftItem,rightItem,recordBtn])
         
         recordBtn.do { v in
index 8c65613..f0cfa70 100644 (file)
@@ -18,13 +18,14 @@ class FieldRecordingVC:BaseVC{
 
     override func setupViews() {
         navBar.title = "现场录音"
+        navBar.backgroundColor = .white
         toolBar.delegate = self
-        
+        view.backgroundColor = .white
         textView.do { v in
             v.isEditable = false
             v.font = .regular(14)
             v.text = ""
-            v.backgroundColor = .hexString("#F7F7F7")
+            v.backgroundColor = .white
             v.textColor = .hexString("#121212")
             v.contentInset = UIEdgeInsets(top: 0, left: 18, bottom: 0, right: 18)
         }
index 1ea5b00..77f2e1b 100644 (file)
@@ -1,47 +1,59 @@
 import UIKit
-//import DSWaveformImage
+import Kingfisher
 
 class RhythView: BaseView {
     let lable = UILabel()
-    let wave = UIView()
+    let startWave = UIImageView()
+    let stopWave = UIImageView()
+    let wave = UIImageView()
     var timer:Timer?
     var num = 0
-//   let wave = WaveformLiveView(frame: CGRect(x: 0, y: 0, width: kScreenWid, height: 50))
 
     override func setupViews() {
-        addSubviews([lable,wave])
+        addSubviews([startWave,stopWave,lable])
         lable.do { v in
             v.textColor = .hexString("#121212")
             v.font = .bold(32)
             v.textAlignment = .center
             v.text = "00:00:00"
         }
+
+        stopWave.image = UIImage(named: "audio_record_normal")
+        startWave.kf.setImage(with: Bundle.main.url(forResource: "record_start", withExtension: "gif")!)
+        startWave.isHidden = true
+//        startWave.backgroundColor = .green
 //        backgroundColor = .red
-        wave.backgroundColor = .lightGray
     }
     override func setupLayout() {
         lable.snp.makeConstraints { make in
-            make.top.equalToSuperview().inset(10)
+            make.top.equalToSuperview().inset(0)
             make.centerX.equalToSuperview()
         }
-        wave.snp.makeConstraints { make in
+        stopWave.snp.makeConstraints { make in
             make.top.equalToSuperview().inset(40)
             make.left.right.equalToSuperview()
             make.height.equalTo(58)
             make.bottom.equalToSuperview()
         }
+        startWave.snp.makeConstraints { make in
+            make.edges.equalTo(stopWave)
+        }
     }
     @objc func timerAction(){
         num += 1
         lable.text = YLToos.formatSeconds(num)
     }
     func startTimer(){
+        startWave.isHidden = false
+        stopWave.isHidden = true
         if let timer = timer,timer.isValid{
             timer.invalidate()
         }
         timer = Timer.scheduledTimer(timeInterval: 1, target: self, selector: #selector(timerAction), userInfo: nil, repeats: true)
     }
     func stopTimer(){
+        startWave.isHidden = true
+        stopWave.isHidden = false
         timer?.invalidate()
     }
 }
diff --git a/ShenYin/ShenYin/UI/Home/RecordDetail/RecordDetaiContent.swift b/ShenYin/ShenYin/UI/Home/RecordDetail/RecordDetaiContent.swift
new file mode 100644 (file)
index 0000000..0c02b3b
--- /dev/null
@@ -0,0 +1,65 @@
+//
+//  RecordDetaiContent.swift
+//  ShenYin
+//
+//  Created by liangshi on 2025/9/26.
+//
+
+class RecordDetaiContent: BaseView {
+    let titleLabel = UILabel()
+    let btn = UIButton(type: .custom)
+    let textView = UITextView()
+    var title:String!{
+        didSet{
+            titleLabel.text = title
+        }
+    }
+    var content:String!{
+        didSet{
+            textView.text = content
+        }
+    }
+    
+    override func setupViews() {
+        addSubviews([titleLabel,textView,btn])
+        
+        titleLabel.do { v in
+            v.textColor = .rgb(0x0092E1)
+            v.font = .regular(16)
+        }
+        btn.do { v in
+            v.setImage(UIImage(named: "record_detail_copy"), for: .normal)
+            v.addTarget(self, action: #selector(copyAction), for: .touchUpInside)
+        }
+        textView.do { v in
+            v.font = .regular(14)
+            v.text = ""
+            v.textColor = .hexString("#121212")
+            v.contentInset = UIEdgeInsets(top: 0, left: 18, bottom: 0, right: 18)
+            v.backgroundColor = .clear
+            v.isEditable = false
+        }
+        backgroundColor = .color(.bgColor)
+    }
+    
+    override func setupLayout() {
+        titleLabel.snp.makeConstraints { make in
+            make.top.equalToSuperview().inset(15)
+            make.left.equalToSuperview().inset(18)
+        }
+        btn.snp.makeConstraints { make in
+            make.size.equalTo(26)
+            make.right.equalToSuperview().inset(18)
+            make.centerY.equalTo(titleLabel)
+        }
+        textView.snp.makeConstraints { make in
+            make.top.equalToSuperview().inset(35)
+            make.left.right.equalToSuperview()
+            make.bottom.equalToSuperview().inset(10)
+        }
+    }
+    @objc func copyAction(){
+        UIPasteboard.general.string = textView.text
+//        YLprogressHUD.showAutoHiden("已拷贝")
+    }
+}
index 7a196f4..c62bc20 100644 (file)
@@ -8,28 +8,34 @@
 protocol RecordDetailTopBarDelegate {
     func recordDetailBarTranstlateAction(_ bar:RecordDetailTopBar)
     func recordDetailTopBarOgrinAction(_ bar:RecordDetailTopBar)
+    func recordDetailTopBarSummaryAction(_ bar:RecordDetailTopBar)
 }
 
 class RecordDetailTopBar: BaseView {
     let tranlateItem = LanguageItem()
     let originItem = LanguageItem()
-
+    let summaryItem = LanguageItem()
     
     var delegate:RecordDetailTopBarDelegate?
     
     override func setupViews() {
         backgroundColor = .clear
-        addSubviews([tranlateItem,originItem])
+        addSubviews([tranlateItem,originItem,summaryItem])
         
+        originItem.do {v in
+            v.yc.addTap(target: self, action: #selector(originAction))
+            v.label.text = "原文"
+            v.isSelected = true
+        }
         tranlateItem.do {v in
             v.yc.addTap(target: self, action: #selector(tralateAction))
             v.label.text = "译文"
             v.isSelected = false
         }
-        originItem.do {v in
-            v.yc.addTap(target: self, action: #selector(originAction))
-            v.label.text = "原文"
-            v.isSelected = true
+        summaryItem.do {v in
+            v.yc.addTap(target: self, action: #selector(summaryAction))
+            v.label.text = "摘要"
+            v.isSelected = false
         }
     }
     
@@ -38,13 +44,19 @@ class RecordDetailTopBar: BaseView {
             make.width.equalTo(100)
             make.top.equalToSuperview()
             make.height.equalTo(36)
-            make.right.equalToSuperview().inset(kScreenWid/2 + 15)
+            make.left.equalToSuperview().inset(18)
         }
         tranlateItem.snp.makeConstraints { make in
             make.width.equalTo(100)
             make.top.equalToSuperview()
             make.height.equalTo(36)
-            make.left.equalToSuperview().offset(kScreenWid/2 + 15)
+            make.centerX.equalToSuperview()
+        }
+        summaryItem.snp.makeConstraints { make in
+            make.width.equalTo(100)
+            make.top.equalToSuperview()
+            make.height.equalTo(36)
+            make.right.equalToSuperview().inset(18)
         }
     }
     @objc func tralateAction(){
@@ -55,7 +67,11 @@ class RecordDetailTopBar: BaseView {
         originItem.isSelected = !originItem.isSelected
         delegate?.recordDetailTopBarOgrinAction(self)
     }
-
+    @objc func summaryAction(){
+        summaryItem.isSelected = !summaryItem.isSelected
+        delegate?.recordDetailTopBarSummaryAction(self)
+    }
+    
     
     class LanguageItem: BaseView {
         let label = UILabel()
index 8624305..4c20ccc 100644 (file)
@@ -12,19 +12,21 @@ class RecordDetailVC:BaseVC{
     let timeLabel = UILabel()
     let topBar = RecordDetailTopBar()
     let toolBar = RecordDetailBar()
-    let textView = UITextView()
-    var messageList : [(String,UInt)] = []
-    var recordFilePath : String?
-    
+    let originView = RecordDetaiContent()
+    let translateView = RecordDetaiContent()
+    let summaryView = RecordDetaiContent()
     
     override func viewDidLoad() {
         super.viewDidLoad()
     }
     override func setupViews() {
         navBar.title = "现场录音"
-        navBar.rightView.setImage(UIImage(named: "help_icon"), for: .normal)
+        navBar.rightView.setImage(UIImage(named: "upload"), for: .normal)
+        
         toolBar.delegate = self
-        topBar.delegate = self
+        topBar.do { v in
+            v.delegate = self
+        }
         
         timeLabel.do { (v) in
             v.font = .regular(14)
@@ -32,13 +34,19 @@ class RecordDetailVC:BaseVC{
             v.textColor = .hexString("#666666")
             v.text = Date().format(.full3)
         }
-        textView.do { v in
-            v.font = .regular(14)
-            v.text = ""
-            v.textColor = .hexString("#121212")
-            v.contentInset = UIEdgeInsets(top: 0, left: 18, bottom: 0, right: 18)
+        originView.do { v in
+            v.title = "原文"
+//            v.content = "好优美的一篇文章,山花落尽,我心犹青|||记得春日时分,山花绽放得那样热烈,鲜红的、明黄的、洁白的,仿佛将整片山野染成了一幅画。那时的心也如山花般明亮,轻快地跳跃在生活的每一个角落。"
         }
-        view.addSubviews([timeLabel,topBar,textView,toolBar])
+        translateView.do { v in
+            v.title = "译文"
+//            v.content = "What a beautiful article, the mountain flowers have all fallen, yet my heart remains green ||| Remembering the springtime, the mountain flowers bloomed so vividly, bright red, bright yellow, and pure white, as if they had painted the entire mountain wilderness into a picture. At that time, my heart was as bright as the mountain flowers, joyfully jumping around in every corner of life. "
+        }
+        summaryView.do { v in
+            v.title = "摘要"
+//            v.content = "这是摘要"
+        }
+        view.addSubviews([timeLabel,topBar,originView,translateView,summaryView,toolBar])
         
     }
     override func setupLayout() {
@@ -55,40 +63,141 @@ class RecordDetailVC:BaseVC{
         toolBar.snp.makeConstraints { make in
             make.width.centerX.equalToSuperview()
             make.height.equalTo(95)
-            make.bottom.equalToSuperview().inset(20)
-        }
-        textView.snp.makeConstraints { make in
-            make.top.equalTo(topBar.snp.bottom)
-            make.left.right.equalToSuperview()
-            make.bottom.equalTo(toolBar.snp.top)
+            make.bottom.equalToSuperview()
         }
+        updateLayout()
     }
     override func setupData() {
-        PcmSound.sharedInstance().delegate = self;
-        PcmSound.sharedInstance().setup(16000, withchannels: 1)
-        let options: AVAudioSession.CategoryOptions = [.allowBluetooth]
-        do {
-            try AVAudioSession.sharedInstance().setCategory(.playback, options: [options])
-            try AVAudioSession.sharedInstance().setActive(true)
-        } catch {
-            Logger.debug(error)
-        }
+
     }
     override func navRightViewTapped() {
         
     }
-    func scrollToBottom(){
-        let range = NSMakeRange(textView.text.count - 1, 1)
-        textView.scrollRangeToVisible(range)
+
+    func updateLayout(){
+        var h = 0.0
+
+        if topBar.originItem.isSelected  && topBar.tranlateItem.isSelected && topBar.summaryItem.isSelected{
+            originView.isHidden = false
+            translateView.isHidden = false
+            summaryView.isHidden = false
+           h = (kScreenHei - kNavBtm - 36 - 36 - 95)/3
+            originView.snp.remakeConstraints { make in
+                make.top.equalTo(topBar.snp.bottom)
+                make.left.right.equalToSuperview()
+                make.height.equalTo(h)
+            }
+            translateView.snp.remakeConstraints { make in
+                make.top.equalTo(originView.snp.bottom)
+                make.left.right.equalToSuperview()
+                make.height.equalTo(h)
+            }
+            summaryView.snp.remakeConstraints { make in
+                make.top.equalTo(translateView.snp.bottom)
+                make.left.right.equalToSuperview()
+                make.height.equalTo(h)
+            }
+        }
+        else if topBar.originItem.isSelected  && topBar.tranlateItem.isSelected{
+            originView.isHidden = false
+            translateView.isHidden = false
+            summaryView.isHidden = true
+             h = (kScreenHei - kNavBtm - 36 - 36 - 95)/2
+            originView.snp.remakeConstraints { make in
+                make.top.equalTo(topBar.snp.bottom)
+                make.left.right.equalToSuperview()
+                make.height.equalTo(h)
+            }
+            translateView.snp.remakeConstraints { make in
+                make.top.equalTo(originView.snp.bottom)
+                make.left.right.equalToSuperview()
+                make.height.equalTo(h)
+            }
+        }
+        else if topBar.originItem.isSelected  && topBar.summaryItem.isSelected{
+            originView.isHidden = false
+            translateView.isHidden = true
+            summaryView.isHidden = false
+            h = (kScreenHei - kNavBtm - 36 - 36 - 95)/2
+            originView.snp.remakeConstraints { make in
+                make.top.equalTo(topBar.snp.bottom)
+                make.left.right.equalToSuperview()
+                make.height.equalTo(h)
+            }
+            summaryView.snp.remakeConstraints { make in
+                make.top.equalTo(originView.snp.bottom)
+                make.left.right.equalToSuperview()
+                make.height.equalTo(h)
+            }
+        }
+        else if topBar.tranlateItem.isSelected  && topBar.summaryItem.isSelected{
+            originView.isHidden = true
+            translateView.isHidden = false
+            summaryView.isHidden = false
+            h = (kScreenHei - kNavBtm - 36 - 36 - 95)/2
+            translateView.snp.remakeConstraints { make in
+                make.top.equalTo(topBar.snp.bottom)
+                make.left.right.equalToSuperview()
+                make.height.equalTo(h)
+            }
+            summaryView.snp.remakeConstraints { make in
+                make.top.equalTo(translateView.snp.bottom)
+                make.left.right.equalToSuperview()
+                make.height.equalTo(h)
+            }
+        }
+        else if topBar.originItem.isSelected {
+            originView.isHidden = false
+            translateView.isHidden = true
+            summaryView.isHidden = true
+            h = (kScreenHei - kNavBtm - 36 - 36 - 95)
+            originView.snp.remakeConstraints { make in
+                make.top.equalTo(topBar.snp.bottom)
+                make.left.right.equalToSuperview()
+                make.height.equalTo(h)
+            }
+        }
+        else if topBar.tranlateItem.isSelected {
+            originView.isHidden = true
+            translateView.isHidden = false
+            summaryView.isHidden = true
+            h = (kScreenHei - kNavBtm - 36 - 36 - 95)
+            translateView.snp.remakeConstraints { make in
+                make.top.equalTo(topBar.snp.bottom)
+                make.left.right.equalToSuperview()
+                make.height.equalTo(h)
+            }
+        }
+        else if topBar.summaryItem.isSelected {
+            originView.isHidden = false
+            translateView.isHidden = true
+            summaryView.isHidden = false
+            h = (kScreenHei - kNavBtm - 36 - 36 - 95)
+            summaryView.snp.remakeConstraints { make in
+                make.top.equalTo(topBar.snp.bottom)
+                make.left.right.equalToSuperview()
+                make.height.equalTo(h)
+            }
+        }else{
+            originView.isHidden = true
+            translateView.isHidden = true
+            summaryView.isHidden = true
+        }
+        
+
     }
 }
 extension RecordDetailVC:RecordDetailTopBarDelegate{
+    func recordDetailTopBarSummaryAction(_ bar: RecordDetailTopBar) {
+        updateLayout()
+    }
+    
     func recordDetailBarTranstlateAction(_ bar: RecordDetailTopBar) {
-        
+        updateLayout()
     }
     
     func recordDetailTopBarOgrinAction(_ bar: RecordDetailTopBar) {
-        
+        updateLayout()
     }
 }
 extension RecordDetailVC:RecordDetailBarDelegate{
@@ -108,10 +217,3 @@ extension RecordDetailVC:RecordDetailBarDelegate{
         
     }
 }
-
-extension RecordDetailVC : PcmSoundDelegate {
-    
-    func remaining(_ frames: UInt) {
-        Logger.debug("[frame:\(frames)]");
-    }
-}
index fc60166..075e03e 100644 (file)
@@ -70,6 +70,10 @@ class RecordTranslateVC:BaseVC{
             Logger.debug(error)
         }
         PcmSound.sharedInstance().setup(16000, withchannels: 1)
+        
+        if TipsCache.needShow(type: .tongchuan) {
+            RecordTipsView(type: .tongchuan).show()
+        }
     }
     override func navRightViewTapped() {
         let tip = RecordTipsView(type: .tongchuan)
index f06e6f1..183d48a 100644 (file)
@@ -45,5 +45,6 @@ extension App{
 extension App{
     var deviceValid:Bool{
         return BleManager.shared.isConnetd
+//        return !BleManager.shared.isConnetd
     }
 }
index d49cccf..531b766 100644 (file)
@@ -20,7 +20,7 @@ class SceneDelegate: UIResponder, UIWindowSceneDelegate {
         
         App.shared.window = window
         window?.rootViewController = BaseTC()
-//        window?.rootViewController = UINavigationController(rootViewController: DialogTranslateVC())
+//        window?.rootViewController = UINavigationController(rootViewController: ChatVC())
         AppLaunch.start()
     }
 
diff --git a/ShenYin/ShenYin/UI/common/Cache/CacheManager.swift b/ShenYin/ShenYin/UI/common/Cache/CacheManager.swift
new file mode 100644 (file)
index 0000000..49d9de8
--- /dev/null
@@ -0,0 +1,18 @@
+//
+//  c.swift
+//  ShenYin
+//
+//  Created by liangshi on 2025/9/11.
+//
+import CoreBluetooth
+
+class CacheManager{
+    static let shared = CacheManager()
+    var currentDevice:DeviceModel?
+    
+    func saveDevice(_ device: DeviceModel) {
+        self.currentDevice = device
+        DeviceCache.shared.saveDevice(device)
+    }
+}
+
@@ -1,20 +1,9 @@
 //
-//  c.swift
+//  DeviceCache.swift
 //  ShenYin
 //
-//  Created by liangshi on 2025/9/11.
+//  Created by liangshi on 2025/9/26.
 //
-import CoreBluetooth
-
-class CacheManager{
-    static let shared = CacheManager()
-    var currentDevice:DeviceModel?
-    
-    func saveDevice(_ device: DeviceModel) {
-        self.currentDevice = device
-        DeviceCache.shared.saveDevice(device)
-    }
-}
 
 class DeviceModel: NSObject, NSCoding {
     var name = ""
diff --git a/ShenYin/ShenYin/UI/common/Cache/TipsCache.swift b/ShenYin/ShenYin/UI/common/Cache/TipsCache.swift
new file mode 100644 (file)
index 0000000..dc5ce48
--- /dev/null
@@ -0,0 +1,21 @@
+//
+//  TipsCache.swift
+//  ShenYin
+//
+//  Created by liangshi on 2025/9/26.
+//
+
+
+ 
+
+class TipsCache{
+    static func needShow(type:RecordTipsType,show:Bool){
+        UserDefaults.standard.set(show, forKey: type.title)
+    }
+    static func needShow(type:RecordTipsType)->Bool{
+        if let value = UserDefaults.standard.value(forKey: type.title){
+            return value as? Bool ?? false
+        }
+        return true
+    }
+}
index 7565b2b..1c9f657 100644 (file)
@@ -24,7 +24,7 @@ class LoadingButton:UIButton{
     }
     func startAnimating(finished:(()->Void)? = nil){
         loading = true
-        activeView.backgroundColor = .hexString("#F7F7F7")
+        activeView.backgroundColor = .white
         activeView.startAnimating()
         DispatchQueue.main.asyncAfter(deadline:.now() + 2) {
             self.stopAnimating()
index 4ae8ed7..e8cac32 100644 (file)
@@ -63,12 +63,13 @@ class RecordTipsView: BasePresentView {
     let desLabel1 = UILabel()
     let desLabel2 = UILabel()
     let actionbtn = UIButton(type: .custom)
+    let agreeView = AgreeView()
     var didSelected: ((Int,String)->Void)?
     var tipsType:RecordTipsType = .dialog
     
     init(type:RecordTipsType) {
         tipsType = type
-        let h =  595.0
+        let h =  620.0
         super.init(contentHeight:h)
     }
     
@@ -78,7 +79,7 @@ class RecordTipsView: BasePresentView {
     
     override func setupSubView() {
         super.setupSubView()
-        contentView.addSubviews([titleLabel,btn,tipsIcon,desLabel1,desLabel2,actionbtn])
+        contentView.addSubviews([titleLabel,btn,tipsIcon,desLabel1,desLabel2,actionbtn,agreeView])
     }
     override func setupLayout() {
         super.setupLayout()
@@ -106,11 +107,15 @@ class RecordTipsView: BasePresentView {
             m.left.right.equalToSuperview().inset(30)
         }
         actionbtn.snp.makeConstraints { (m) in
-            m.bottom.equalToSuperview().inset(30)
+            m.bottom.equalToSuperview().inset(60)
             m.left.right.equalToSuperview().inset(52)
             m.height.equalTo(46)
         }
-        
+        agreeView.snp.makeConstraints { (m) in
+            m.bottom.equalToSuperview().inset(20)
+            m.centerX.equalToSuperview()
+            m.height.equalTo(30)
+        }
     }
     
     override func setupStyle() {
@@ -164,6 +169,10 @@ class RecordTipsView: BasePresentView {
             v.setTitleColor(.white, for: .normal)
             v.addTarget(self, action: #selector(btnAction), for: .touchUpInside)
         }
+        agreeView.do { v in
+            v.agreeBtn.isSelected = false
+            v.agreeBtn.addTarget(self, action: #selector(agreeBtnAction), for: .touchUpInside)
+        }
     }
     @objc func closeAction(){
         hide()
@@ -171,4 +180,42 @@ class RecordTipsView: BasePresentView {
     @objc func btnAction(){
         hide()
     }
+    @objc func agreeBtnAction(){
+        agreeView.agreeBtn.isSelected = !agreeView.agreeBtn.isSelected
+        TipsCache.needShow(type: tipsType, show: !agreeView.agreeBtn.isSelected)
+    }
+    class AgreeView: BaseView {
+        let agreeBtn = UIButton()
+        let agreeTitle = UILabel()
+        override func setupViews() {
+            agreeBtn.do { (v) in
+                v.isSelected = true
+                v.contentMode = .center
+                v.setImage(UIImage(named: "tip_normal"), for: .normal)
+                v.setImage(UIImage(named: "tip_selected"), for: .selected)
+            }
+            agreeTitle.do { (v) in
+                v.textColor = .hexString("##999999")
+                v.font = .regular(12)
+                v.textAlignment = .left
+                v.text = "下次不再提示"
+            }
+//            backgroundColor = .red
+            addSubviews([agreeBtn,agreeTitle])
+        }
+        override func setupLayout() {
+            agreeBtn.snp.makeConstraints { (m) in
+                m.left.top.equalToSuperview()
+                m.height.equalTo(30)
+                m.width.equalTo(30)
+            }
+            agreeTitle.snp.makeConstraints { (m) in
+                m.left.equalTo(agreeBtn.snp.right)
+                m.height.equalToSuperview()
+                m.centerY.equalTo(agreeBtn)
+                m.right.equalToSuperview()
+            }
+        }
+    }
+
 }