From a8922baa4e37454c9a209721cdcf9bb76bff07bb Mon Sep 17 00:00:00 2001 From: liangzhenying <867174124@qq.com> Date: Wed, 27 Aug 2025 16:27:03 +0800 Subject: [PATCH] =?utf8?q?=E5=AE=8C=E5=96=84UI?= MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit --- .../btn_record_normal.imageset/Contents.json | 22 +++ .../Group 2104@2x.png | Bin 0 -> 5721 bytes .../Group 2104@3x.png | Bin 0 -> 11004 bytes .../btn_record_stop.imageset/Contents.json | 22 +++ .../Group_2122@2x.png | Bin 0 -> 4894 bytes .../Group_2122@3x.png | Bin 0 -> 9339 bytes .../home/record_pause.imageset/Contents.json | 22 +++ .../record_pause.imageset/Frame_2245@2x.png | Bin 0 -> 623 bytes .../record_pause.imageset/Frame_2245@3x.png | Bin 0 -> 1029 bytes .../home/record_play.imageset/Contents.json | 22 +++ .../record_play.imageset/Frame_2246@2x.png | Bin 0 -> 1219 bytes .../record_play.imageset/Frame_2246@3x.png | Bin 0 -> 2188 bytes .../Contents.json | 22 +++ .../Group_2299@2x.png | Bin 0 -> 1451 bytes .../Group_2299@3x.png | Bin 0 -> 2779 bytes ShenYin/ShenYin/SceneDelegate.swift | 2 +- ShenYin/ShenYin/UI/Base/BaseTC.swift | 2 +- ShenYin/ShenYin/UI/Base/BaseVC.swift | 5 +- ShenYin/ShenYin/UI/Base/GlobalConfig.swift | 10 ++ ShenYin/ShenYin/UI/Home/CallingRecordVC.swift | 39 ++++- ShenYin/ShenYin/UI/Home/Chat/ChatCell.swift | 86 ++++++++++ ShenYin/ShenYin/UI/Home/Chat/ChatVC.swift | 97 +++++++++++ .../UI/Home/{ => Chat}/RoleListVC.swift | 2 +- ShenYin/ShenYin/UI/Home/ChatVC.swift | 24 --- .../ShenYin/UI/Home/Chinese2EnglishVC.swift | 51 +++++- .../ShenYin/UI/Home/DialogTranlateVC.swift | 50 +++++- .../Home/FieldRecording/FieldRecordBar.swift | 153 ++++++++++++++++++ .../FieldRecording/FieldRecordingCell.swift | 134 --------------- .../FieldRecording/FieldRecordingVC.swift | 66 +++----- .../UI/Home/FieldRecording/RecordBar.swift | 92 +++++++++++ .../UI/Home/FieldRecording/RhythView.swift | 20 +++ .../HistoryRecord/HistoryRecordCell.swift | 7 +- .../ShenYin/UI/Home/RecordTranslateVC.swift | 50 +++++- .../UI/Home/Root/HomeFunctionView.swift | 2 +- .../ShenYin/UI/Home/Root/HomeHeadView.swift | 4 + ShenYin/ShenYin/UI/Home/Root/HomeVC.swift | 8 +- .../textTranslateVC/TextTranslateVC.swift | 6 + .../Home/textTranslateVC/TranslateCell.swift | 1 + .../ShenYin/UI/Mine/Root/MineBannerView.swift | 2 +- ShenYin/ShenYin/UI/common/CustomPicker.swift | 2 +- 40 files changed, 788 insertions(+), 237 deletions(-) create mode 100644 ShenYin/ShenYin/Assets.xcassets/home/btn_record_normal.imageset/Contents.json create mode 100644 ShenYin/ShenYin/Assets.xcassets/home/btn_record_normal.imageset/Group 2104@2x.png create mode 100644 ShenYin/ShenYin/Assets.xcassets/home/btn_record_normal.imageset/Group 2104@3x.png create mode 100644 ShenYin/ShenYin/Assets.xcassets/home/btn_record_stop.imageset/Contents.json create mode 100644 ShenYin/ShenYin/Assets.xcassets/home/btn_record_stop.imageset/Group_2122@2x.png create mode 100644 ShenYin/ShenYin/Assets.xcassets/home/btn_record_stop.imageset/Group_2122@3x.png create mode 100644 ShenYin/ShenYin/Assets.xcassets/home/record_pause.imageset/Contents.json create mode 100644 ShenYin/ShenYin/Assets.xcassets/home/record_pause.imageset/Frame_2245@2x.png create mode 100644 ShenYin/ShenYin/Assets.xcassets/home/record_pause.imageset/Frame_2245@3x.png create mode 100644 ShenYin/ShenYin/Assets.xcassets/home/record_play.imageset/Contents.json create mode 100644 ShenYin/ShenYin/Assets.xcassets/home/record_play.imageset/Frame_2246@2x.png create mode 100644 ShenYin/ShenYin/Assets.xcassets/home/record_play.imageset/Frame_2246@3x.png create mode 100644 ShenYin/ShenYin/Assets.xcassets/home/record_select_language.imageset/Contents.json create mode 100644 ShenYin/ShenYin/Assets.xcassets/home/record_select_language.imageset/Group_2299@2x.png create mode 100644 ShenYin/ShenYin/Assets.xcassets/home/record_select_language.imageset/Group_2299@3x.png create mode 100644 ShenYin/ShenYin/UI/Base/GlobalConfig.swift create mode 100644 ShenYin/ShenYin/UI/Home/Chat/ChatCell.swift create mode 100644 ShenYin/ShenYin/UI/Home/Chat/ChatVC.swift rename ShenYin/ShenYin/UI/Home/{ => Chat}/RoleListVC.swift (99%) delete mode 100644 ShenYin/ShenYin/UI/Home/ChatVC.swift create mode 100644 ShenYin/ShenYin/UI/Home/FieldRecording/FieldRecordBar.swift delete mode 100644 ShenYin/ShenYin/UI/Home/FieldRecording/FieldRecordingCell.swift create mode 100644 ShenYin/ShenYin/UI/Home/FieldRecording/RecordBar.swift create mode 100644 ShenYin/ShenYin/UI/Home/FieldRecording/RhythView.swift diff --git a/ShenYin/ShenYin/Assets.xcassets/home/btn_record_normal.imageset/Contents.json b/ShenYin/ShenYin/Assets.xcassets/home/btn_record_normal.imageset/Contents.json new file mode 100644 index 0000000..04fa73f --- /dev/null +++ b/ShenYin/ShenYin/Assets.xcassets/home/btn_record_normal.imageset/Contents.json @@ -0,0 +1,22 @@ +{ + "images" : [ + { + "idiom" : "universal", + "scale" : "1x" + }, + { + "filename" : "Group 2104@2x.png", + "idiom" : "universal", + "scale" : "2x" + }, + { + "filename" : "Group 2104@3x.png", + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/ShenYin/ShenYin/Assets.xcassets/home/btn_record_normal.imageset/Group 2104@2x.png b/ShenYin/ShenYin/Assets.xcassets/home/btn_record_normal.imageset/Group 2104@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..238251e5dc365bf600b93b244fe4f55373da53ba GIT binary patch literal 5721 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 LNkvXXu0mjfMlIsS literal 0 HcmV?d00001 diff --git a/ShenYin/ShenYin/Assets.xcassets/home/btn_record_normal.imageset/Group 2104@3x.png b/ShenYin/ShenYin/Assets.xcassets/home/btn_record_normal.imageset/Group 2104@3x.png new file mode 100644 index 0000000000000000000000000000000000000000..052a3af4158f80d99624827f7f6d63135b54543a GIT binary patch literal 11004 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 Q9{>OV07*qoM6N<$f|TH1f&c&j literal 0 HcmV?d00001 diff --git a/ShenYin/ShenYin/Assets.xcassets/home/btn_record_stop.imageset/Group_2122@3x.png b/ShenYin/ShenYin/Assets.xcassets/home/btn_record_stop.imageset/Group_2122@3x.png new file mode 100644 index 0000000000000000000000000000000000000000..93b3ac8cd7b7861b4a7fc6d5835f7d3fad2e6206 GIT binary patch literal 9339 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 JPDHLkV1jvw7+L@T literal 0 HcmV?d00001 diff --git a/ShenYin/ShenYin/Assets.xcassets/home/record_pause.imageset/Frame_2245@3x.png b/ShenYin/ShenYin/Assets.xcassets/home/record_pause.imageset/Frame_2245@3x.png new file mode 100644 index 0000000000000000000000000000000000000000..6013525d735e1c518082ed90a0a9aacaabbd87ed GIT binary patch literal 1029 zcmeAS@N?(olHy`uVBq!ia0vp^-as77!3HGX9-N)Sz`(rA)5S5Qg7M8X-)!MTk=FOt zj?UV5JDM)EawtVi*rLg?bazws{uk%IiHES5yY4D_$ljsAweByoo``nGjy18SbITOB zy1aDS{lZCH)pyF7nD-)FPR5hxyz~+N*z&zC@m{g)$PL%(Kef#RX=H4-4U|uV#dtOX8vH#6qvl~U<1^k~qv=^Hul5(eW_k^T=TyCyICJN1R$8ks-UoDP$|3Ej%^KFS&wuwilDx-);5|38?QG~r#$oDB@` zT3jO-7#&Wf2#Pr{OfZUUVHIFl;v<&G$ikpG8CgosBJ#l2f0devjN2z{;NVtZ@R+G{ zh>3$CNUeJV15?A4lS(=b3<{~6U{YD$3R4?SGHnpVViq=QZv9PROxvxis`G$PfJiOB z$~QG^`ycETaiCTmk6YHPI~;T|;IP_*#oLz{{+m2$>(nYHb>E-5Td(}RX_EHNp7UB% z)%m>Y^z?M&TKh|qtIyu4*U=HJ6whA#_t^2Qt-n_9)vuTyS6^IG+%F0TmQ zCOfP7e?-LJzklOhzb@?+h$!7MXNQAx<)%G*{;XWwCgWQ9qrY|QjvW!@>pq<6ta*{5 zCf+DiDc|<+vEP@<>`x!$xwWO11+5I3eYW6KUwpKxUTEy6Ip&*p?V9!OqVJ!tC9@-c z`?rWjZh5%<*YCc&8;-x;C;T(#d0muiJ$KfkPtGpabMo~#4s|YFx>SE#`unio?n~7|FBw7&k@$Y`NUnhM8*zI?uM`I3=IGO*9p&124-e9 cP%dU>C>Eb}N^RbZ>p&3(Pgg&ebxsLQ08E0@lK=n! literal 0 HcmV?d00001 diff --git a/ShenYin/ShenYin/Assets.xcassets/home/record_play.imageset/Contents.json b/ShenYin/ShenYin/Assets.xcassets/home/record_play.imageset/Contents.json new file mode 100644 index 0000000..194398d --- /dev/null +++ b/ShenYin/ShenYin/Assets.xcassets/home/record_play.imageset/Contents.json @@ -0,0 +1,22 @@ +{ + "images" : [ + { + "idiom" : "universal", + "scale" : "1x" + }, + { + "filename" : "Frame_2246@2x.png", + "idiom" : "universal", + "scale" : "2x" + }, + { + "filename" : "Frame_2246@3x.png", + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/ShenYin/ShenYin/Assets.xcassets/home/record_play.imageset/Frame_2246@2x.png b/ShenYin/ShenYin/Assets.xcassets/home/record_play.imageset/Frame_2246@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..1eaefede56ac0554aa99a161b1dc62e955d904c9 GIT binary patch literal 1219 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 literal 0 HcmV?d00001 diff --git a/ShenYin/ShenYin/Assets.xcassets/home/record_select_language.imageset/Group_2299@3x.png b/ShenYin/ShenYin/Assets.xcassets/home/record_select_language.imageset/Group_2299@3x.png new file mode 100644 index 0000000000000000000000000000000000000000..0b5ba983c46975beb59d6705a73263a54ffdaef5 GIT binary patch literal 2779 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 h00006Nkl 0 { + tableView.scrollToRow(at: IndexPath(row: dataList.count - 1, section: 0), at: .none, animated: true) + } + } +} +extension ChatVC:UITableViewDelegate,UITableViewDataSource { + func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { + return dataList.count + } + + func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { + let cell = ChatCell.cell(withTableView: tableView, indexPath: indexPath) + cell.data = dataList[indexPath.row] + return cell + } + func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) { + + } +} +extension ChatVC:SendToolBarDelegate{ + func sendToolBar(_ toolBar: SendToolBar, _ text: String) { + toolBar.textField.resignFirstResponder() + // list.append(ChatCellModel(isSend:true,content:text)) + // tableView.reloadData() + // scrollToBottom() + // StartburstGlassesSdk.shared().chat.fireText(text) + } +} diff --git a/ShenYin/ShenYin/UI/Home/RoleListVC.swift b/ShenYin/ShenYin/UI/Home/Chat/RoleListVC.swift similarity index 99% rename from ShenYin/ShenYin/UI/Home/RoleListVC.swift rename to ShenYin/ShenYin/UI/Home/Chat/RoleListVC.swift index fba3b1f..1cccb22 100644 --- a/ShenYin/ShenYin/UI/Home/RoleListVC.swift +++ b/ShenYin/ShenYin/UI/Home/Chat/RoleListVC.swift @@ -8,7 +8,7 @@ import UIKit class RoleListVC: BaseVC{ let tableView = UITableView(frame: .zero, style: .plain) - var list:[MineCellType] = [] + var list = [1,2,3,4,5,6,7] override func viewDidLoad() { super.viewDidLoad() diff --git a/ShenYin/ShenYin/UI/Home/ChatVC.swift b/ShenYin/ShenYin/UI/Home/ChatVC.swift deleted file mode 100644 index 42186a4..0000000 --- a/ShenYin/ShenYin/UI/Home/ChatVC.swift +++ /dev/null @@ -1,24 +0,0 @@ -// -// ChatVC.swift -// ShenYin -// -// Created by liangshi on 2025/8/6. -// - -import UIKit - -class ChatVC:BaseVC{ - - override func viewDidLoad() { - super.viewDidLoad() - - - } - override func setupViews() { - self.navBar.title = "对话" - } - override func setupLayout() { - - } - -} diff --git a/ShenYin/ShenYin/UI/Home/Chinese2EnglishVC.swift b/ShenYin/ShenYin/UI/Home/Chinese2EnglishVC.swift index e7db819..e9f183b 100644 --- a/ShenYin/ShenYin/UI/Home/Chinese2EnglishVC.swift +++ b/ShenYin/ShenYin/UI/Home/Chinese2EnglishVC.swift @@ -5,21 +5,62 @@ // Created by liangshi on 2025/8/6. // - import UIKit class Chinese2EnglishVC:BaseVC{ - + let toolBar = RecordBar() + let tableView = UITableView(frame: CGRectZero, style: .plain) + var dataList = [1,2,3] override func viewDidLoad() { super.viewDidLoad() - - } override func setupViews() { - self.navBar.title = "中英互译" + navBar.title = "中英互译" + navBar.rightView.setImage(UIImage(named: "help_icon"), for: .normal) + + + tableView.backgroundColor = .clear + tableView.delegate = self + tableView.dataSource = self + tableView.estimatedRowHeight = 60 + tableView.separatorStyle = .none + tableView.register(TranslateCell.self, forCellReuseIdentifier: TranslateCell.reuseID) + view.addSubview(tableView) + view.addSubview(toolBar) + } override func setupLayout() { + toolBar.snp.makeConstraints { make in + make.width.centerX.equalToSuperview() + make.height.equalTo(120) + make.bottom.equalToSuperview().inset(20) + } + tableView.snp.makeConstraints { make in + make.top.equalToSuperview().inset(80) + make.left.right.equalToSuperview() + make.bottom.equalTo(toolBar.snp.top) + } + } + override func navRightViewTapped() { } + func scrollToBottom(){ + if dataList.count > 0 { + tableView.scrollToRow(at: IndexPath(row: dataList.count - 1, section: 0), at: .none, animated: true) + } + } +} +extension Chinese2EnglishVC:UITableViewDelegate,UITableViewDataSource { + func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { + return dataList.count + } + func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { + let cell = TranslateCell.cell(withTableView: tableView, indexPath: indexPath) + // cell.data = dataList[indexPath.row] + return cell + } + func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) { + + } } diff --git a/ShenYin/ShenYin/UI/Home/DialogTranlateVC.swift b/ShenYin/ShenYin/UI/Home/DialogTranlateVC.swift index c7e4f60..4871fde 100644 --- a/ShenYin/ShenYin/UI/Home/DialogTranlateVC.swift +++ b/ShenYin/ShenYin/UI/Home/DialogTranlateVC.swift @@ -8,17 +8,59 @@ import UIKit class DialogTranlateVC:BaseVC{ - + let toolBar = RecordBar() + let tableView = UITableView(frame: CGRectZero, style: .plain) + var dataList = [1,2,3] override func viewDidLoad() { super.viewDidLoad() - - } override func setupViews() { - self.navBar.title = "对话翻译" + navBar.title = "对话翻译" + navBar.rightView.setImage(UIImage(named: "help_icon"), for: .normal) + + + tableView.backgroundColor = .clear + tableView.delegate = self + tableView.dataSource = self + tableView.estimatedRowHeight = 60 + tableView.separatorStyle = .none + tableView.register(TranslateCell.self, forCellReuseIdentifier: TranslateCell.reuseID) + view.addSubview(tableView) + view.addSubview(toolBar) + } override func setupLayout() { + toolBar.snp.makeConstraints { make in + make.width.centerX.equalToSuperview() + make.height.equalTo(120) + make.bottom.equalToSuperview().inset(20) + } + tableView.snp.makeConstraints { make in + make.top.equalToSuperview().inset(80) + make.left.right.equalToSuperview() + make.bottom.equalTo(toolBar.snp.top) + } + } + override func navRightViewTapped() { } + func scrollToBottom(){ + if dataList.count > 0 { + tableView.scrollToRow(at: IndexPath(row: dataList.count - 1, section: 0), at: .none, animated: true) + } + } +} +extension DialogTranlateVC:UITableViewDelegate,UITableViewDataSource { + func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { + return dataList.count + } + func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { + let cell = TranslateCell.cell(withTableView: tableView, indexPath: indexPath) + // cell.data = dataList[indexPath.row] + return cell + } + func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) { + + } } diff --git a/ShenYin/ShenYin/UI/Home/FieldRecording/FieldRecordBar.swift b/ShenYin/ShenYin/UI/Home/FieldRecording/FieldRecordBar.swift new file mode 100644 index 0000000..ceb1103 --- /dev/null +++ b/ShenYin/ShenYin/UI/Home/FieldRecording/FieldRecordBar.swift @@ -0,0 +1,153 @@ +// +// Untitled.swift +// ShenYin +// +// Created by liangshi on 2025/8/27. +// + +enum RecordSate:Int{ + case normal + case recording + case pause +} + +class FieldRecordBar: BaseView { + let recordBtn = UIButton() + let leftItem = RecordBarItem() + let rightItem = RecordBarButton() + var state:RecordSate = .normal + + override func setupViews() { + backgroundColor = .white + 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)) + } + rightItem.do {v in + v.state = .normal + v.yc.addTap(target: self, action: #selector(pauseAction)) + } + } + + override func setupLayout() { + recordBtn.snp.makeConstraints { make in + make.size.equalTo(56) + make.center.equalToSuperview() + } + leftItem.snp.makeConstraints { make in + make.size.equalTo(56) + make.centerY.equalTo(recordBtn) + make.right.equalToSuperview().offset(-(kScreenWid/2 + 60)) + } + rightItem.snp.makeConstraints { make in + make.size.equalTo(56) + make.centerY.equalTo(recordBtn) + make.left.equalToSuperview().offset(kScreenWid/2 + 60) + } + } + @objc func leftAction(){ + if recordBtn.isSelected { + return + } + let v = CustomPicker(title: "请选择语言", list: GlobalConfig.languages) + v.selectedIndex = 0 + v.show() + v.didSelected = {[weak self] (index,value) in + guard let self = self else { return } + leftItem.titleLabel.text = value + } + return + } + @objc func recordBtnAction(){ + recordBtn.isSelected = !recordBtn.isSelected + rightItem.state = .recording + rightItem.isHidden = !recordBtn.isSelected + + if recordBtn.isSelected { + leftItem.alpha = 0.5 + } + else{ + leftItem.alpha = 1 + } + } + @objc func pauseAction(){ + if rightItem.state == .recording { + rightItem.state = .pause + } + else if rightItem.state == .pause { + rightItem.state = .recording + } + } + + class RecordBarItem: BaseView { + let icon = UIImageView() + let titleLabel = UILabel() + override func setupViews() { + addSubviews([titleLabel,icon]) + icon.do { v in + v.image = UIImage(named: "record_select_language") + } + titleLabel.do { v in + v.textColor = .rgb(0x121212) + v.font = .regular(10) + v.text = "中文" + } + } + + 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 = .normal{ + didSet{ + if state == .pause { + titleLabel.text = "继续" + icon.image = UIImage(named: "record_play") + } + else if state == .recording{ + titleLabel.text = "暂停" + icon.image = UIImage(named: "record_pause") + } + } + } + + override func setupViews() { + addSubviews([titleLabel,icon]) + icon.do { v in + } + titleLabel.do { v in + v.textColor = .rgb(0x121212) + 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) + } + } + } +} diff --git a/ShenYin/ShenYin/UI/Home/FieldRecording/FieldRecordingCell.swift b/ShenYin/ShenYin/UI/Home/FieldRecording/FieldRecordingCell.swift deleted file mode 100644 index c5a651c..0000000 --- a/ShenYin/ShenYin/UI/Home/FieldRecording/FieldRecordingCell.swift +++ /dev/null @@ -1,134 +0,0 @@ -// -// Fi.swift -// ShenYin -// -// Created by liangshi on 2025/8/26. -// - -import UIKit - -/// Ai回应模型 -public class UBAiResponse { - /// 类型, - /// 0:AI录音解析错误(只发类型即可,后面字节均不发) - /// 1:AI录音解析内容 - /// 2:AI回应内容 - /// 3:AI回应错误(只发类型即可,后面字节均不发) - /// 4:AI回应结束(只发类型即可,后面字节均不发) - public var type: Int = 0 - /// 类型 start middle end - public var state:String = "" - - /// 回复id - public var reponseId: String = "" - /// 内容 - public var content: String = "" - /// 累积内容 - public var totalContent: String = "" - - - init(_ reponseId:String) { - self.reponseId = reponseId - } - - public var description: String { - return "UBAiResponse(type: \(type), state:\(state), content:\(content))" - } -} - - -class FieldRecordingCell:BaseTableViewCell{ - let bgView = UIView() - let line = BrokenLineView() - let originalLabel = UILabel() - let translationLabel = UILabel() - - override init(style: UITableViewCell.CellStyle, reuseIdentifier: String?) { - super.init(style: style, reuseIdentifier: reuseIdentifier) - - } - - required init?(coder: NSCoder) { - fatalError("init(coder:) has not been implemented") - } - - override func setupViews() { - contentView.backgroundColor = .rgb(0xF6F6F6) - - bgView.do { v in - v.yc.setCornerRadius(12) - v.backgroundColor = .white - } - originalLabel.do { v in - v.text = "你好,欢迎使用AI翻译,点击下方按钮立即开始咱们的对话吧" - v.font = .regular(14) - v.textColor = .hexString("#606D80") - v.numberOfLines = 0 - v.textAlignment = .left - } - translationLabel.do { v in - v.text = "Hello, welcome to AI translation, click the button below now Let's start our conversation" - v.font = .regular(14) - v.textColor = .hexString("#121212") - v.numberOfLines = 0 - v.textAlignment = .left - } - line.do { v in -// v.backgroundColor = .hexString("#93C6EC") - } - contentView.addSubview(bgView) - bgView.addSubviews([originalLabel,translationLabel,line]) - - -// let brokenLineView = BrokenLineView(frame: CGRect(x: 0, y: 0, width: 300, height:100)) -// addSubview(brokenLineView) - } - - override func setupLayout() { - bgView.snp.makeConstraints { make in - make.top.bottom.equalToSuperview().inset(10) - make.width.lessThanOrEqualTo(kScreenWid - 36) - make.left.equalToSuperview().inset(18) - } - - originalLabel.snp.makeConstraints { make in - make.top.equalToSuperview().inset(14) - make.left.equalToSuperview().inset(10) - make.width.lessThanOrEqualTo(kScreenWid - 60) - } - line.snp.makeConstraints { make in - make.left.right.equalToSuperview().inset(10) - make.height.equalTo(10) - make.top.equalTo(originalLabel.snp.bottom).offset(18) - } - - translationLabel.snp.makeConstraints { make in - make.top.equalTo(line.snp.bottom).offset(18) - make.left.equalToSuperview().inset(10) - make.width.lessThanOrEqualTo(kScreenWid - 60) - make.bottom.equalToSuperview().inset(10) - } - } - -// var data:UBAiResponse!{ -// didSet{ -// if data.type == 1 { -// bgView.snp.remakeConstraints { make in -// make.top.bottom.equalToSuperview().inset(10) -// make.right.equalToSuperview().inset(20) -// } -// } -// else{ -// -// bgView.snp.remakeConstraints { make in -// make.top.bottom.equalToSuperview().inset(10) -// make.left.equalToSuperview().inset(20) -// } -// } -// msgLabel.text = data.totalContent -// } -// } -} - - - diff --git a/ShenYin/ShenYin/UI/Home/FieldRecording/FieldRecordingVC.swift b/ShenYin/ShenYin/UI/Home/FieldRecording/FieldRecordingVC.swift index c85d261..e1e7e83 100644 --- a/ShenYin/ShenYin/UI/Home/FieldRecording/FieldRecordingVC.swift +++ b/ShenYin/ShenYin/UI/Home/FieldRecording/FieldRecordingVC.swift @@ -8,66 +8,46 @@ import UIKit class FieldRecordingVC:BaseVC{ - let toolBar = SendToolBar() - let tableView = UITableView(frame: CGRectZero, style: .plain) - var dataList = [1,2,3] + let toolBar = FieldRecordBar() + let textView = UITextView() + let rhythView = RhythView() override func viewDidLoad() { super.viewDidLoad() } override func setupViews() { - self.navBar.title = "现场录音" - tableView.backgroundColor = .clear - tableView.delegate = self - tableView.dataSource = self - tableView.estimatedRowHeight = 60 - tableView.separatorStyle = .none - tableView.register(FieldRecordingCell.self, forCellReuseIdentifier: FieldRecordingCell.reuseID) - view.addSubview(tableView) + navBar.title = "现场录音" + navBar.rightView.setImage(UIImage(named: "help_icon"), for: .normal) + textView.do { v in + v.text = "好优美的一篇文章,山花落尽,我心犹青|||记得春日时分,山花绽放得那样热烈,鲜红的、明黄的、洁白的,仿佛将整片山野染成了一幅画。那时的心也如山花般明亮,轻快地跳跃在生活的每一个角落。然而,繁华易逝,花朵终会飘落。花落的那天,我站在同一片山坡上,听着风带走它们的碎影。那种空落感从心底涌起,像极了许多未能言说的遗憾,带着些许酸涩。" + v.font = .regular(14) + v.textColor = .hexString("#121212") + v.contentInset = UIEdgeInsets(top: 0, left: 18, bottom: 0, right: 18) + } + view.addSubviews([rhythView,textView,toolBar]) - toolBar.textField.text = "" - toolBar.delegate = self - view.addSubview(toolBar) - } override func setupLayout() { + rhythView.snp.makeConstraints { make in + make.width.centerX.equalToSuperview() + make.height.equalTo(100) + make.top.equalToSuperview().inset(kNavBtm) + } toolBar.snp.makeConstraints { make in make.width.centerX.equalToSuperview() - make.height.equalTo(52) + make.height.equalTo(120) make.bottom.equalToSuperview().inset(20) } - tableView.snp.makeConstraints { make in - make.top.equalToSuperview().inset(80) + textView.snp.makeConstraints { make in + make.top.equalTo(rhythView.snp.bottom) make.left.right.equalToSuperview() make.bottom.equalTo(toolBar.snp.top) } } - func scrollToBottom(){ - if dataList.count > 0 { - tableView.scrollToRow(at: IndexPath(row: dataList.count - 1, section: 0), at: .none, animated: true) - } - } -} -extension FieldRecordingVC:UITableViewDelegate,UITableViewDataSource { - func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { - return dataList.count - } - - func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { - let cell = FieldRecordingCell.cell(withTableView: tableView, indexPath: indexPath) -// cell.data = dataList[indexPath.row] - return cell - } - func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) { + override func navRightViewTapped() { } -} -extension FieldRecordingVC:SendToolBarDelegate{ - func sendToolBar(_ toolBar: SendToolBar, _ text: String) { - toolBar.textField.resignFirstResponder() -// list.append(ChatCellModel(isSend:true,content:text)) -// tableView.reloadData() -// scrollToBottom() -// StartburstGlassesSdk.shared().chat.fireText(text) + func scrollToBottom(){ + } } diff --git a/ShenYin/ShenYin/UI/Home/FieldRecording/RecordBar.swift b/ShenYin/ShenYin/UI/Home/FieldRecording/RecordBar.swift new file mode 100644 index 0000000..03c9012 --- /dev/null +++ b/ShenYin/ShenYin/UI/Home/FieldRecording/RecordBar.swift @@ -0,0 +1,92 @@ +// +// RecordBar.swift +// ShenYin +// +// Created by liangshi on 2025/8/27. +// + +class RecordBar: BaseView { + let recordBtn = UIButton() + let leftItem = RecordBarItem() + let rightItem = RecordBarItem() + + + override func setupViews() { + backgroundColor = .white + 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.backgroundColor = .green + } + rightItem.do {v in +// v.backgroundColor = .yellow + } + } + + override func setupLayout() { + recordBtn.snp.makeConstraints { make in + make.size.equalTo(56) + make.center.equalToSuperview() + } + leftItem.snp.makeConstraints { make in + make.size.equalTo(56) + make.centerY.equalTo(recordBtn) + make.right.equalToSuperview().offset(-(kScreenWid/2 + 60)) + } + rightItem.snp.makeConstraints { make in + make.size.equalTo(56) + make.centerY.equalTo(recordBtn) + make.left.equalToSuperview().offset(kScreenWid/2 + 60) + } + } + + @objc func recordBtnAction(){ + recordBtn.isSelected = !recordBtn.isSelected + } + + class RecordBarItem: BaseView { + let icon = UIImageView() + let titleLabel = UILabel() + let valueLabel = UILabel() + + override func setupViews() { +// backgroundColor = .red + addSubviews([titleLabel,valueLabel,icon]) + icon.do { v in + v.image = UIImage(named: "") + v.backgroundColor = .black + } + titleLabel.do { v in + v.textColor = .rgb(0x121212) + v.font = .bold(16) + v.text = "中文" + } + valueLabel.do { v in + v.textColor = .rgb(0x666666) + v.font = .regular(10) + v.text = "耳机" + } + } + + 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) + } + valueLabel.snp.makeConstraints { make in + make.right.equalTo(titleLabel) + make.top.equalTo(titleLabel.snp.bottom).offset(5) + } + } + } +} diff --git a/ShenYin/ShenYin/UI/Home/FieldRecording/RhythView.swift b/ShenYin/ShenYin/UI/Home/FieldRecording/RhythView.swift new file mode 100644 index 0000000..55b95a7 --- /dev/null +++ b/ShenYin/ShenYin/UI/Home/FieldRecording/RhythView.swift @@ -0,0 +1,20 @@ +// +// Untitled.swift +// ShenYin +// +// Created by liangshi on 2025/8/27. +// + +class RhythView: BaseView { + + + override func setupViews() { + backgroundColor = .red + + } + + override func setupLayout() { + + } + +} diff --git a/ShenYin/ShenYin/UI/Home/HistoryRecord/HistoryRecordCell.swift b/ShenYin/ShenYin/UI/Home/HistoryRecord/HistoryRecordCell.swift index da7c364..5cb7669 100644 --- a/ShenYin/ShenYin/UI/Home/HistoryRecord/HistoryRecordCell.swift +++ b/ShenYin/ShenYin/UI/Home/HistoryRecord/HistoryRecordCell.swift @@ -66,7 +66,7 @@ class HistoryRecordCell: BaseTableViewCell { } collectionIcon.image = UIImage(named: "collection_selected") playIcon.do { v in - v.backgroundColor = .lightGray + v.image = UIImage(named: "play_icon") } } @@ -79,14 +79,13 @@ class HistoryRecordCell: BaseTableViewCell { } playIcon.snp.makeConstraints { (m) in - m.width.equalTo(30) - m.height.equalTo(30) + m.width.size.equalTo(34) m.left.equalToSuperview().inset(14) m.centerY.equalToSuperview() } titleLabel.snp.makeConstraints { (m) in m.top.equalTo(16) - m.left.equalToSuperview().offset(52) + m.left.equalTo(playIcon.snp.right).offset(6) } collectionIcon.snp.makeConstraints { (m) in m.size.equalTo(16) diff --git a/ShenYin/ShenYin/UI/Home/RecordTranslateVC.swift b/ShenYin/ShenYin/UI/Home/RecordTranslateVC.swift index cd0e7e1..1d0e619 100644 --- a/ShenYin/ShenYin/UI/Home/RecordTranslateVC.swift +++ b/ShenYin/ShenYin/UI/Home/RecordTranslateVC.swift @@ -9,17 +9,59 @@ import UIKit class RecordTranslateVC:BaseVC{ - + let toolBar = RecordBar() + let tableView = UITableView(frame: CGRectZero, style: .plain) + var dataList = [1,2,3] override func viewDidLoad() { super.viewDidLoad() - - } override func setupViews() { - self.navBar.title = "同声传译" + navBar.title = "同声传译" + navBar.rightView.setImage(UIImage(named: "help_icon"), for: .normal) + + + tableView.backgroundColor = .clear + tableView.delegate = self + tableView.dataSource = self + tableView.estimatedRowHeight = 60 + tableView.separatorStyle = .none + tableView.register(TranslateCell.self, forCellReuseIdentifier: TranslateCell.reuseID) + view.addSubview(tableView) + view.addSubview(toolBar) + } override func setupLayout() { + toolBar.snp.makeConstraints { make in + make.width.centerX.equalToSuperview() + make.height.equalTo(120) + make.bottom.equalToSuperview().inset(20) + } + tableView.snp.makeConstraints { make in + make.top.equalToSuperview().inset(80) + make.left.right.equalToSuperview() + make.bottom.equalTo(toolBar.snp.top) + } + } + override func navRightViewTapped() { } + func scrollToBottom(){ + if dataList.count > 0 { + tableView.scrollToRow(at: IndexPath(row: dataList.count - 1, section: 0), at: .none, animated: true) + } + } +} +extension RecordTranslateVC:UITableViewDelegate,UITableViewDataSource { + func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { + return dataList.count + } + func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { + let cell = TranslateCell.cell(withTableView: tableView, indexPath: indexPath) + // cell.data = dataList[indexPath.row] + return cell + } + func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) { + + } } diff --git a/ShenYin/ShenYin/UI/Home/Root/HomeFunctionView.swift b/ShenYin/ShenYin/UI/Home/Root/HomeFunctionView.swift index 0c2ebb8..dde9a4a 100644 --- a/ShenYin/ShenYin/UI/Home/Root/HomeFunctionView.swift +++ b/ShenYin/ShenYin/UI/Home/Root/HomeFunctionView.swift @@ -165,7 +165,7 @@ class HomeCell: BaseView { case .recordTranslate: App.shared.goToPage(RecordTranslateVC()) case .dialogTranslate: - App.shared.goToPage(ChatVC()) + App.shared.goToPage(DialogTranlateVC()) case .textTranslate: App.shared.goToPage(TextTranlateVC()) } diff --git a/ShenYin/ShenYin/UI/Home/Root/HomeHeadView.swift b/ShenYin/ShenYin/UI/Home/Root/HomeHeadView.swift index 594526f..655a7d1 100644 --- a/ShenYin/ShenYin/UI/Home/Root/HomeHeadView.swift +++ b/ShenYin/ShenYin/UI/Home/Root/HomeHeadView.swift @@ -24,6 +24,7 @@ class HomeHeadView: BaseView { bottonView.do { v in v.backgroundColor = .rgb(0xFAFAFA) v.yc.setCornerRadius(30) + v.yc.addTap(target: self, action: #selector(chatAction)) } tipsIcon.do { v in v.image = UIImage(named: "home_chat") @@ -64,6 +65,9 @@ class HomeHeadView: BaseView { make.centerY.equalToSuperview() } } + @objc func chatAction(){ + App.shared.goToPage(ChatVC()) + } } diff --git a/ShenYin/ShenYin/UI/Home/Root/HomeVC.swift b/ShenYin/ShenYin/UI/Home/Root/HomeVC.swift index 9bb7fe2..0608d3f 100644 --- a/ShenYin/ShenYin/UI/Home/Root/HomeVC.swift +++ b/ShenYin/ShenYin/UI/Home/Root/HomeVC.swift @@ -56,13 +56,7 @@ class HomeVC:BaseVC{ // v.selectedIndex(4) // v.show(animate: true) - let v = CustomPicker(title: "tishi", list: ["2","3","4","5","6","7","8"]) - v.selectedIndex = 2 - v.show() - v.didSelected = { (index,value) in - print(index,value) - } - return + } @objc func addDeviceAction(){ diff --git a/ShenYin/ShenYin/UI/Home/textTranslateVC/TextTranslateVC.swift b/ShenYin/ShenYin/UI/Home/textTranslateVC/TextTranslateVC.swift index 86b897f..c775aae 100644 --- a/ShenYin/ShenYin/UI/Home/textTranslateVC/TextTranslateVC.swift +++ b/ShenYin/ShenYin/UI/Home/textTranslateVC/TextTranslateVC.swift @@ -16,6 +16,9 @@ class TextTranlateVC:BaseVC{ } override func setupViews() { self.navBar.title = "文本翻译" + navBar.rightView.setImage(UIImage(named: "help_icon"), for: .normal) + + tableView.backgroundColor = .clear tableView.delegate = self tableView.dataSource = self @@ -41,6 +44,9 @@ class TextTranlateVC:BaseVC{ make.left.right.equalToSuperview() make.bottom.equalTo(toolBar.snp.top) } + } + override func navRightViewTapped() { + } func scrollToBottom(){ if dataList.count > 0 { diff --git a/ShenYin/ShenYin/UI/Home/textTranslateVC/TranslateCell.swift b/ShenYin/ShenYin/UI/Home/textTranslateVC/TranslateCell.swift index 6d455c5..95c5876 100644 --- a/ShenYin/ShenYin/UI/Home/textTranslateVC/TranslateCell.swift +++ b/ShenYin/ShenYin/UI/Home/textTranslateVC/TranslateCell.swift @@ -5,6 +5,7 @@ // Created by liangshi on 2025/8/26. // + class TranslateCell:BaseTableViewCell{ let bgView = UIView() let line = BrokenLineView() diff --git a/ShenYin/ShenYin/UI/Mine/Root/MineBannerView.swift b/ShenYin/ShenYin/UI/Mine/Root/MineBannerView.swift index 1e99d12..4137a3a 100644 --- a/ShenYin/ShenYin/UI/Mine/Root/MineBannerView.swift +++ b/ShenYin/ShenYin/UI/Mine/Root/MineBannerView.swift @@ -42,7 +42,7 @@ final class MineBannerView: BaseView { pageControl.snp.makeConstraints { (m) in m.width.equalToSuperview() m.height.equalTo(25) - m.bottom.equalToSuperview().inset(10) + m.bottom.equalToSuperview().inset(5) m.centerX.equalToSuperview() } } diff --git a/ShenYin/ShenYin/UI/common/CustomPicker.swift b/ShenYin/ShenYin/UI/common/CustomPicker.swift index ba59023..b08cef7 100644 --- a/ShenYin/ShenYin/UI/common/CustomPicker.swift +++ b/ShenYin/ShenYin/UI/common/CustomPicker.swift @@ -60,7 +60,7 @@ class CustomPicker: BasePresentView { v.textColor = .rgb(0x333333) v.font = .semiBold(16) v.textAlignment = .center - v.text = "标题" + v.text = title } btn.do { v in v.setImage(UIImage(named: "close_icon"), for: .normal) -- 2.17.1