From: liangzhenying <867174124@qq.com> Date: Wed, 10 Sep 2025 10:08:26 +0000 (+0800) Subject: 完成模式模块调试 X-Git-Tag: 1.0.2~102 X-Git-Url: http://git.snicker.com.cn/Users/apple/Desktop/static/gitweb.css?a=commitdiff_plain;h=7409082c59cb9d945186326828b650072e044f66;p=mirrors%2FShenYin.git 完成模式模块调试 --- diff --git a/ShenYin/Podfile.lock b/ShenYin/Podfile.lock index 36dc905..be12f21 100644 --- a/ShenYin/Podfile.lock +++ b/ShenYin/Podfile.lock @@ -52,6 +52,8 @@ PODS: - Moya/Core (= 15.0.0) - Moya/Core (15.0.0): - Alamofire (~> 5.0) + - MultiSlider (2.2.0): + - SweeterSwift - netfox (1.21.0) - Realm (20.0.3): - Realm/Headers (= 20.0.3) @@ -63,6 +65,7 @@ PODS: - SVProgressHUD (2.3.1): - SVProgressHUD/Core (= 2.3.1) - SVProgressHUD/Core (2.3.1) + - SweeterSwift (1.2.6) - SwiftDate (7.0.0) - swiftScan (1.2.1) - TabPageViewController (0.2.8) @@ -86,6 +89,7 @@ DEPENDENCIES: - Kingfisher (~> 6.0) - MJRefresh - Moya + - MultiSlider - netfox - RealmSwift - SnapKit @@ -119,12 +123,14 @@ SPEC REPOS: - Kingfisher - MJRefresh - Moya + - MultiSlider - netfox - Realm - RealmSwift - SnapKit - SocketRocket - SVProgressHUD + - SweeterSwift - SwiftDate - swiftScan - TabPageViewController @@ -152,12 +158,14 @@ SPEC CHECKSUMS: Kingfisher: 016c8b653a35add51dd34a3aba36b580041acc74 MJRefresh: ff9e531227924c84ce459338414550a05d2aea78 Moya: 138f0573e53411fb3dc17016add0b748dfbd78ee + MultiSlider: 9667217199a051fa729bf54986d68fb9b911554c netfox: 9d5cc727fe7576c4c7688a2504618a156b7d44b7 Realm: 853e5089d6042dff807bda000277eadfe2da93d2 RealmSwift: f33c19577cefcbf681345d721fcbc7b42be4c949 SnapKit: d612e99e678a2d3b95bf60b0705ed0a35c03484a SocketRocket: d4aabe649be1e368d1318fdf28a022d714d65748 SVProgressHUD: 4837c74bdfe2e51e8821c397825996a8d7de6e22 + SweeterSwift: 1eca266517c703d7376e723a21926f5cb2ba4d0f SwiftDate: bbc26e26fc8c0c33fbee8c140c5e8a68293a148a swiftScan: 0849e7d7c1c641384767a573ee8cb90b88d1ddd9 TabPageViewController: 8bd4104909754416b35a98f3b72a5b674ab20dd5 @@ -166,6 +174,6 @@ SPEC CHECKSUMS: YYModel: 2a7fdd96aaa4b86a824e26d0c517de8928c04b30 YYText: 5c461d709e24d55a182d1441c41dc639a18a4849 -PODFILE CHECKSUM: 3ae5b0826c9764636aac77b04720df3c8e87c203 +PODFILE CHECKSUM: 826428f9bd4197f6e9759f68eaf9008f80c0563b COCOAPODS: 1.16.2 diff --git a/ShenYin/ShenYin.xcodeproj/project.pbxproj b/ShenYin/ShenYin.xcodeproj/project.pbxproj index b1173ff..de54e87 100644 --- a/ShenYin/ShenYin.xcodeproj/project.pbxproj +++ b/ShenYin/ShenYin.xcodeproj/project.pbxproj @@ -187,14 +187,10 @@ inputFileListPaths = ( "${PODS_ROOT}/Target Support Files/Pods-ShenYin/Pods-ShenYin-frameworks-${CONFIGURATION}-input-files.xcfilelist", ); - inputPaths = ( - ); name = "[CP] Embed Pods Frameworks"; outputFileListPaths = ( "${PODS_ROOT}/Target Support Files/Pods-ShenYin/Pods-ShenYin-frameworks-${CONFIGURATION}-output-files.xcfilelist", ); - outputPaths = ( - ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-ShenYin/Pods-ShenYin-frameworks.sh\"\n"; @@ -265,7 +261,7 @@ "@executable_path/Frameworks", ); MARKETING_VERSION = 1.0; - PRODUCT_BUNDLE_IDENTIFIER = demo.ShenYin; + PRODUCT_BUNDLE_IDENTIFIER = com.deepchords.app; PRODUCT_NAME = "$(TARGET_NAME)"; SUPPORTED_PLATFORMS = "iphoneos iphonesimulator"; SUPPORTS_MACCATALYST = NO; @@ -306,7 +302,7 @@ "@executable_path/Frameworks", ); MARKETING_VERSION = 1.0; - PRODUCT_BUNDLE_IDENTIFIER = demo.ShenYin; + PRODUCT_BUNDLE_IDENTIFIER = com.deepchords.app; PRODUCT_NAME = "$(TARGET_NAME)"; SUPPORTED_PLATFORMS = "iphoneos iphonesimulator"; SUPPORTS_MACCATALYST = NO; diff --git a/ShenYin/ShenYin/Assets.xcassets/chat/Contents.json b/ShenYin/ShenYin/Assets.xcassets/home/chat/Contents.json similarity index 100% rename from ShenYin/ShenYin/Assets.xcassets/chat/Contents.json rename to ShenYin/ShenYin/Assets.xcassets/home/chat/Contents.json diff --git a/ShenYin/ShenYin/Assets.xcassets/home/chat/role_ linjianvhai.imageset/Contents.json b/ShenYin/ShenYin/Assets.xcassets/home/chat/role_ linjianvhai.imageset/Contents.json new file mode 100644 index 0000000..48826de --- /dev/null +++ b/ShenYin/ShenYin/Assets.xcassets/home/chat/role_ linjianvhai.imageset/Contents.json @@ -0,0 +1,23 @@ +{ + "images" : [ + { + "filename" : "Group_2377.png", + "idiom" : "universal", + "scale" : "1x" + }, + { + "filename" : "Group_2377@2x.png", + "idiom" : "universal", + "scale" : "2x" + }, + { + "filename" : "Group_2377@3x.png", + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/ShenYin/ShenYin/Assets.xcassets/home/chat/role_ linjianvhai.imageset/Group_2377.png b/ShenYin/ShenYin/Assets.xcassets/home/chat/role_ linjianvhai.imageset/Group_2377.png new file mode 100644 index 0000000..6ccc286 Binary files /dev/null and b/ShenYin/ShenYin/Assets.xcassets/home/chat/role_ linjianvhai.imageset/Group_2377.png differ diff --git a/ShenYin/ShenYin/Assets.xcassets/home/chat/role_ linjianvhai.imageset/Group_2377@2x.png b/ShenYin/ShenYin/Assets.xcassets/home/chat/role_ linjianvhai.imageset/Group_2377@2x.png new file mode 100644 index 0000000..f0c4821 Binary files /dev/null and b/ShenYin/ShenYin/Assets.xcassets/home/chat/role_ linjianvhai.imageset/Group_2377@2x.png differ diff --git a/ShenYin/ShenYin/Assets.xcassets/home/chat/role_ linjianvhai.imageset/Group_2377@3x.png b/ShenYin/ShenYin/Assets.xcassets/home/chat/role_ linjianvhai.imageset/Group_2377@3x.png new file mode 100644 index 0000000..621b4a6 Binary files /dev/null and b/ShenYin/ShenYin/Assets.xcassets/home/chat/role_ linjianvhai.imageset/Group_2377@3x.png differ diff --git a/ShenYin/ShenYin/Assets.xcassets/home/chat/role_assistant.imageset/Contents.json b/ShenYin/ShenYin/Assets.xcassets/home/chat/role_assistant.imageset/Contents.json new file mode 100644 index 0000000..9daf4af --- /dev/null +++ b/ShenYin/ShenYin/Assets.xcassets/home/chat/role_assistant.imageset/Contents.json @@ -0,0 +1,23 @@ +{ + "images" : [ + { + "filename" : "Group_2374.png", + "idiom" : "universal", + "scale" : "1x" + }, + { + "filename" : "Group_2374@2x.png", + "idiom" : "universal", + "scale" : "2x" + }, + { + "filename" : "Group_2374@3x.png", + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/ShenYin/ShenYin/Assets.xcassets/home/chat/role_assistant.imageset/Group_2374.png b/ShenYin/ShenYin/Assets.xcassets/home/chat/role_assistant.imageset/Group_2374.png new file mode 100644 index 0000000..7854598 Binary files /dev/null and b/ShenYin/ShenYin/Assets.xcassets/home/chat/role_assistant.imageset/Group_2374.png differ diff --git a/ShenYin/ShenYin/Assets.xcassets/home/chat/role_assistant.imageset/Group_2374@2x.png b/ShenYin/ShenYin/Assets.xcassets/home/chat/role_assistant.imageset/Group_2374@2x.png new file mode 100644 index 0000000..d32d292 Binary files /dev/null and b/ShenYin/ShenYin/Assets.xcassets/home/chat/role_assistant.imageset/Group_2374@2x.png differ diff --git a/ShenYin/ShenYin/Assets.xcassets/home/chat/role_assistant.imageset/Group_2374@3x.png b/ShenYin/ShenYin/Assets.xcassets/home/chat/role_assistant.imageset/Group_2374@3x.png new file mode 100644 index 0000000..a7d2e09 Binary files /dev/null and b/ShenYin/ShenYin/Assets.xcassets/home/chat/role_assistant.imageset/Group_2374@3x.png differ diff --git a/ShenYin/ShenYin/Assets.xcassets/home/chat/role_beijingxiaoye.imageset/Contents.json b/ShenYin/ShenYin/Assets.xcassets/home/chat/role_beijingxiaoye.imageset/Contents.json new file mode 100644 index 0000000..05ca010 --- /dev/null +++ b/ShenYin/ShenYin/Assets.xcassets/home/chat/role_beijingxiaoye.imageset/Contents.json @@ -0,0 +1,23 @@ +{ + "images" : [ + { + "filename" : "Group_2378.png", + "idiom" : "universal", + "scale" : "1x" + }, + { + "filename" : "Group_2378@2x.png", + "idiom" : "universal", + "scale" : "2x" + }, + { + "filename" : "Group_2378@3x.png", + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/ShenYin/ShenYin/Assets.xcassets/home/chat/role_beijingxiaoye.imageset/Group_2378.png b/ShenYin/ShenYin/Assets.xcassets/home/chat/role_beijingxiaoye.imageset/Group_2378.png new file mode 100644 index 0000000..b7fc400 Binary files /dev/null and b/ShenYin/ShenYin/Assets.xcassets/home/chat/role_beijingxiaoye.imageset/Group_2378.png differ diff --git a/ShenYin/ShenYin/Assets.xcassets/home/chat/role_beijingxiaoye.imageset/Group_2378@2x.png b/ShenYin/ShenYin/Assets.xcassets/home/chat/role_beijingxiaoye.imageset/Group_2378@2x.png new file mode 100644 index 0000000..995cf45 Binary files /dev/null and b/ShenYin/ShenYin/Assets.xcassets/home/chat/role_beijingxiaoye.imageset/Group_2378@2x.png differ diff --git a/ShenYin/ShenYin/Assets.xcassets/home/chat/role_beijingxiaoye.imageset/Group_2378@3x.png b/ShenYin/ShenYin/Assets.xcassets/home/chat/role_beijingxiaoye.imageset/Group_2378@3x.png new file mode 100644 index 0000000..07adc44 Binary files /dev/null and b/ShenYin/ShenYin/Assets.xcassets/home/chat/role_beijingxiaoye.imageset/Group_2378@3x.png differ diff --git a/ShenYin/ShenYin/Assets.xcassets/home/chat/role_gaolengyujie.imageset/Contents.json b/ShenYin/ShenYin/Assets.xcassets/home/chat/role_gaolengyujie.imageset/Contents.json new file mode 100644 index 0000000..81f68b7 --- /dev/null +++ b/ShenYin/ShenYin/Assets.xcassets/home/chat/role_gaolengyujie.imageset/Contents.json @@ -0,0 +1,23 @@ +{ + "images" : [ + { + "filename" : "Group_2382.png", + "idiom" : "universal", + "scale" : "1x" + }, + { + "filename" : "Group_2382@2x.png", + "idiom" : "universal", + "scale" : "2x" + }, + { + "filename" : "Group_2382@3x.png", + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/ShenYin/ShenYin/Assets.xcassets/home/chat/role_gaolengyujie.imageset/Group_2382.png b/ShenYin/ShenYin/Assets.xcassets/home/chat/role_gaolengyujie.imageset/Group_2382.png new file mode 100644 index 0000000..f9f1235 Binary files /dev/null and b/ShenYin/ShenYin/Assets.xcassets/home/chat/role_gaolengyujie.imageset/Group_2382.png differ diff --git a/ShenYin/ShenYin/Assets.xcassets/home/chat/role_gaolengyujie.imageset/Group_2382@2x.png b/ShenYin/ShenYin/Assets.xcassets/home/chat/role_gaolengyujie.imageset/Group_2382@2x.png new file mode 100644 index 0000000..beb2faf Binary files /dev/null and b/ShenYin/ShenYin/Assets.xcassets/home/chat/role_gaolengyujie.imageset/Group_2382@2x.png differ diff --git a/ShenYin/ShenYin/Assets.xcassets/home/chat/role_gaolengyujie.imageset/Group_2382@3x.png b/ShenYin/ShenYin/Assets.xcassets/home/chat/role_gaolengyujie.imageset/Group_2382@3x.png new file mode 100644 index 0000000..fe776cf Binary files /dev/null and b/ShenYin/ShenYin/Assets.xcassets/home/chat/role_gaolengyujie.imageset/Group_2382@3x.png differ diff --git a/ShenYin/ShenYin/Assets.xcassets/home/chat/role_linjianvhai.imageset/Contents.json b/ShenYin/ShenYin/Assets.xcassets/home/chat/role_linjianvhai.imageset/Contents.json new file mode 100644 index 0000000..89bec6d --- /dev/null +++ b/ShenYin/ShenYin/Assets.xcassets/home/chat/role_linjianvhai.imageset/Contents.json @@ -0,0 +1,23 @@ +{ + "images" : [ + { + "filename" : "默认.png", + "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/Assets.xcassets/home/chat/role_linjianvhai.imageset/\351\273\230\350\256\244.png" "b/ShenYin/ShenYin/Assets.xcassets/home/chat/role_linjianvhai.imageset/\351\273\230\350\256\244.png" new file mode 100644 index 0000000..0e7270e Binary files /dev/null and "b/ShenYin/ShenYin/Assets.xcassets/home/chat/role_linjianvhai.imageset/\351\273\230\350\256\244.png" differ diff --git a/ShenYin/ShenYin/Assets.xcassets/chat/chat_xiaoyin.imageset/Group_2361@2x.png "b/ShenYin/ShenYin/Assets.xcassets/home/chat/role_linjianvhai.imageset/\351\273\230\350\256\244@2x.png" similarity index 100% rename from ShenYin/ShenYin/Assets.xcassets/chat/chat_xiaoyin.imageset/Group_2361@2x.png rename to "ShenYin/ShenYin/Assets.xcassets/home/chat/role_linjianvhai.imageset/\351\273\230\350\256\244@2x.png" diff --git a/ShenYin/ShenYin/Assets.xcassets/chat/chat_xiaoyin.imageset/Group_2361@3x.png "b/ShenYin/ShenYin/Assets.xcassets/home/chat/role_linjianvhai.imageset/\351\273\230\350\256\244@3x.png" similarity index 100% rename from ShenYin/ShenYin/Assets.xcassets/chat/chat_xiaoyin.imageset/Group_2361@3x.png rename to "ShenYin/ShenYin/Assets.xcassets/home/chat/role_linjianvhai.imageset/\351\273\230\350\256\244@3x.png" diff --git a/ShenYin/ShenYin/Assets.xcassets/home/chat/role_qitiandasheng.imageset/Contents.json b/ShenYin/ShenYin/Assets.xcassets/home/chat/role_qitiandasheng.imageset/Contents.json new file mode 100644 index 0000000..799f320 --- /dev/null +++ b/ShenYin/ShenYin/Assets.xcassets/home/chat/role_qitiandasheng.imageset/Contents.json @@ -0,0 +1,23 @@ +{ + "images" : [ + { + "filename" : "Group_2383.png", + "idiom" : "universal", + "scale" : "1x" + }, + { + "filename" : "Group_2383@2x.png", + "idiom" : "universal", + "scale" : "2x" + }, + { + "filename" : "Group_2383@3x.png", + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/ShenYin/ShenYin/Assets.xcassets/home/chat/role_qitiandasheng.imageset/Group_2383.png b/ShenYin/ShenYin/Assets.xcassets/home/chat/role_qitiandasheng.imageset/Group_2383.png new file mode 100644 index 0000000..a308aab Binary files /dev/null and b/ShenYin/ShenYin/Assets.xcassets/home/chat/role_qitiandasheng.imageset/Group_2383.png differ diff --git a/ShenYin/ShenYin/Assets.xcassets/home/chat/role_qitiandasheng.imageset/Group_2383@2x.png b/ShenYin/ShenYin/Assets.xcassets/home/chat/role_qitiandasheng.imageset/Group_2383@2x.png new file mode 100644 index 0000000..c66d7ab Binary files /dev/null and b/ShenYin/ShenYin/Assets.xcassets/home/chat/role_qitiandasheng.imageset/Group_2383@2x.png differ diff --git a/ShenYin/ShenYin/Assets.xcassets/home/chat/role_qitiandasheng.imageset/Group_2383@3x.png b/ShenYin/ShenYin/Assets.xcassets/home/chat/role_qitiandasheng.imageset/Group_2383@3x.png new file mode 100644 index 0000000..f0298f0 Binary files /dev/null and b/ShenYin/ShenYin/Assets.xcassets/home/chat/role_qitiandasheng.imageset/Group_2383@3x.png differ diff --git a/ShenYin/ShenYin/Assets.xcassets/home/chat/role_shaonianzixin.imageset/Contents.json b/ShenYin/ShenYin/Assets.xcassets/home/chat/role_shaonianzixin.imageset/Contents.json new file mode 100644 index 0000000..8bdc763 --- /dev/null +++ b/ShenYin/ShenYin/Assets.xcassets/home/chat/role_shaonianzixin.imageset/Contents.json @@ -0,0 +1,23 @@ +{ + "images" : [ + { + "filename" : "Group_2376.png", + "idiom" : "universal", + "scale" : "1x" + }, + { + "filename" : "Group_2376@2x.png", + "idiom" : "universal", + "scale" : "2x" + }, + { + "filename" : "Group_2376@3x.png", + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/ShenYin/ShenYin/Assets.xcassets/home/chat/role_shaonianzixin.imageset/Group_2376.png b/ShenYin/ShenYin/Assets.xcassets/home/chat/role_shaonianzixin.imageset/Group_2376.png new file mode 100644 index 0000000..4f9c30b Binary files /dev/null and b/ShenYin/ShenYin/Assets.xcassets/home/chat/role_shaonianzixin.imageset/Group_2376.png differ diff --git a/ShenYin/ShenYin/Assets.xcassets/home/chat/role_shaonianzixin.imageset/Group_2376@2x.png b/ShenYin/ShenYin/Assets.xcassets/home/chat/role_shaonianzixin.imageset/Group_2376@2x.png new file mode 100644 index 0000000..d6f8979 Binary files /dev/null and b/ShenYin/ShenYin/Assets.xcassets/home/chat/role_shaonianzixin.imageset/Group_2376@2x.png differ diff --git a/ShenYin/ShenYin/Assets.xcassets/home/chat/role_shaonianzixin.imageset/Group_2376@3x.png b/ShenYin/ShenYin/Assets.xcassets/home/chat/role_shaonianzixin.imageset/Group_2376@3x.png new file mode 100644 index 0000000..6ae260a Binary files /dev/null and b/ShenYin/ShenYin/Assets.xcassets/home/chat/role_shaonianzixin.imageset/Group_2376@3x.png differ diff --git a/ShenYin/ShenYin/Assets.xcassets/home/chat/role_sunnyboy.imageset/Contents.json b/ShenYin/ShenYin/Assets.xcassets/home/chat/role_sunnyboy.imageset/Contents.json new file mode 100644 index 0000000..2c38c77 --- /dev/null +++ b/ShenYin/ShenYin/Assets.xcassets/home/chat/role_sunnyboy.imageset/Contents.json @@ -0,0 +1,23 @@ +{ + "images" : [ + { + "filename" : "Group 2375.png", + "idiom" : "universal", + "scale" : "1x" + }, + { + "filename" : "Group 2375@2x.png", + "idiom" : "universal", + "scale" : "2x" + }, + { + "filename" : "Group 2375@3x.png", + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/ShenYin/ShenYin/Assets.xcassets/home/chat/role_sunnyboy.imageset/Group 2375.png b/ShenYin/ShenYin/Assets.xcassets/home/chat/role_sunnyboy.imageset/Group 2375.png new file mode 100644 index 0000000..dc14cb9 Binary files /dev/null and b/ShenYin/ShenYin/Assets.xcassets/home/chat/role_sunnyboy.imageset/Group 2375.png differ diff --git a/ShenYin/ShenYin/Assets.xcassets/home/chat/role_sunnyboy.imageset/Group 2375@2x.png b/ShenYin/ShenYin/Assets.xcassets/home/chat/role_sunnyboy.imageset/Group 2375@2x.png new file mode 100644 index 0000000..322b720 Binary files /dev/null and b/ShenYin/ShenYin/Assets.xcassets/home/chat/role_sunnyboy.imageset/Group 2375@2x.png differ diff --git a/ShenYin/ShenYin/Assets.xcassets/home/chat/role_sunnyboy.imageset/Group 2375@3x.png b/ShenYin/ShenYin/Assets.xcassets/home/chat/role_sunnyboy.imageset/Group 2375@3x.png new file mode 100644 index 0000000..2ebf577 Binary files /dev/null and b/ShenYin/ShenYin/Assets.xcassets/home/chat/role_sunnyboy.imageset/Group 2375@3x.png differ diff --git a/ShenYin/ShenYin/Assets.xcassets/home/chat/role_tiexinnanyou.imageset/Contents.json b/ShenYin/ShenYin/Assets.xcassets/home/chat/role_tiexinnanyou.imageset/Contents.json new file mode 100644 index 0000000..ea3f95f --- /dev/null +++ b/ShenYin/ShenYin/Assets.xcassets/home/chat/role_tiexinnanyou.imageset/Contents.json @@ -0,0 +1,23 @@ +{ + "images" : [ + { + "filename" : "Group_2379.png", + "idiom" : "universal", + "scale" : "1x" + }, + { + "filename" : "Group_2379@2x.png", + "idiom" : "universal", + "scale" : "2x" + }, + { + "filename" : "Group_2379@3x.png", + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/ShenYin/ShenYin/Assets.xcassets/home/chat/role_tiexinnanyou.imageset/Group_2379.png b/ShenYin/ShenYin/Assets.xcassets/home/chat/role_tiexinnanyou.imageset/Group_2379.png new file mode 100644 index 0000000..91bbbb1 Binary files /dev/null and b/ShenYin/ShenYin/Assets.xcassets/home/chat/role_tiexinnanyou.imageset/Group_2379.png differ diff --git a/ShenYin/ShenYin/Assets.xcassets/home/chat/role_tiexinnanyou.imageset/Group_2379@2x.png b/ShenYin/ShenYin/Assets.xcassets/home/chat/role_tiexinnanyou.imageset/Group_2379@2x.png new file mode 100644 index 0000000..c6b456c Binary files /dev/null and b/ShenYin/ShenYin/Assets.xcassets/home/chat/role_tiexinnanyou.imageset/Group_2379@2x.png differ diff --git a/ShenYin/ShenYin/Assets.xcassets/home/chat/role_tiexinnanyou.imageset/Group_2379@3x.png b/ShenYin/ShenYin/Assets.xcassets/home/chat/role_tiexinnanyou.imageset/Group_2379@3x.png new file mode 100644 index 0000000..688452c Binary files /dev/null and b/ShenYin/ShenYin/Assets.xcassets/home/chat/role_tiexinnanyou.imageset/Group_2379@3x.png differ diff --git a/ShenYin/ShenYin/Assets.xcassets/home/chat/role_wanwanxiaohe.imageset/Contents.json b/ShenYin/ShenYin/Assets.xcassets/home/chat/role_wanwanxiaohe.imageset/Contents.json new file mode 100644 index 0000000..76d6239 --- /dev/null +++ b/ShenYin/ShenYin/Assets.xcassets/home/chat/role_wanwanxiaohe.imageset/Contents.json @@ -0,0 +1,23 @@ +{ + "images" : [ + { + "filename" : "Group_2380.png", + "idiom" : "universal", + "scale" : "1x" + }, + { + "filename" : "Group_2380@2x.png", + "idiom" : "universal", + "scale" : "2x" + }, + { + "filename" : "Group_2380@3x.png", + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/ShenYin/ShenYin/Assets.xcassets/home/chat/role_wanwanxiaohe.imageset/Group_2380.png b/ShenYin/ShenYin/Assets.xcassets/home/chat/role_wanwanxiaohe.imageset/Group_2380.png new file mode 100644 index 0000000..dd13816 Binary files /dev/null and b/ShenYin/ShenYin/Assets.xcassets/home/chat/role_wanwanxiaohe.imageset/Group_2380.png differ diff --git a/ShenYin/ShenYin/Assets.xcassets/home/chat/role_wanwanxiaohe.imageset/Group_2380@2x.png b/ShenYin/ShenYin/Assets.xcassets/home/chat/role_wanwanxiaohe.imageset/Group_2380@2x.png new file mode 100644 index 0000000..3de03fd Binary files /dev/null and b/ShenYin/ShenYin/Assets.xcassets/home/chat/role_wanwanxiaohe.imageset/Group_2380@2x.png differ diff --git a/ShenYin/ShenYin/Assets.xcassets/home/chat/role_wanwanxiaohe.imageset/Group_2380@3x.png b/ShenYin/ShenYin/Assets.xcassets/home/chat/role_wanwanxiaohe.imageset/Group_2380@3x.png new file mode 100644 index 0000000..6eaa2a2 Binary files /dev/null and b/ShenYin/ShenYin/Assets.xcassets/home/chat/role_wanwanxiaohe.imageset/Group_2380@3x.png differ diff --git a/ShenYin/ShenYin/Assets.xcassets/home/chat/role_zhixinggujie.imageset/Contents.json b/ShenYin/ShenYin/Assets.xcassets/home/chat/role_zhixinggujie.imageset/Contents.json new file mode 100644 index 0000000..c0acf24 --- /dev/null +++ b/ShenYin/ShenYin/Assets.xcassets/home/chat/role_zhixinggujie.imageset/Contents.json @@ -0,0 +1,23 @@ +{ + "images" : [ + { + "filename" : "Group_2381.png", + "idiom" : "universal", + "scale" : "1x" + }, + { + "filename" : "Group_2381@2x.png", + "idiom" : "universal", + "scale" : "2x" + }, + { + "filename" : "Group_2381@3x.png", + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/ShenYin/ShenYin/Assets.xcassets/home/chat/role_zhixinggujie.imageset/Group_2381.png b/ShenYin/ShenYin/Assets.xcassets/home/chat/role_zhixinggujie.imageset/Group_2381.png new file mode 100644 index 0000000..f322b23 Binary files /dev/null and b/ShenYin/ShenYin/Assets.xcassets/home/chat/role_zhixinggujie.imageset/Group_2381.png differ diff --git a/ShenYin/ShenYin/Assets.xcassets/home/chat/role_zhixinggujie.imageset/Group_2381@2x.png b/ShenYin/ShenYin/Assets.xcassets/home/chat/role_zhixinggujie.imageset/Group_2381@2x.png new file mode 100644 index 0000000..3e698c0 Binary files /dev/null and b/ShenYin/ShenYin/Assets.xcassets/home/chat/role_zhixinggujie.imageset/Group_2381@2x.png differ diff --git a/ShenYin/ShenYin/Assets.xcassets/home/chat/role_zhixinggujie.imageset/Group_2381@3x.png b/ShenYin/ShenYin/Assets.xcassets/home/chat/role_zhixinggujie.imageset/Group_2381@3x.png new file mode 100644 index 0000000..4d7e956 Binary files /dev/null and b/ShenYin/ShenYin/Assets.xcassets/home/chat/role_zhixinggujie.imageset/Group_2381@3x.png differ diff --git a/ShenYin/ShenYin/Assets.xcassets/home/record_copy.imageset/Contents.json b/ShenYin/ShenYin/Assets.xcassets/home/record_copy.imageset/Contents.json new file mode 100644 index 0000000..7bc450c --- /dev/null +++ b/ShenYin/ShenYin/Assets.xcassets/home/record_copy.imageset/Contents.json @@ -0,0 +1,22 @@ +{ + "images" : [ + { + "idiom" : "universal", + "scale" : "1x" + }, + { + "filename" : "Frame_1938@2x(4).png", + "idiom" : "universal", + "scale" : "2x" + }, + { + "filename" : "Frame_1938@3x(4).png", + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/ShenYin/ShenYin/Assets.xcassets/home/record_copy.imageset/Frame_1938@2x(4).png b/ShenYin/ShenYin/Assets.xcassets/home/record_copy.imageset/Frame_1938@2x(4).png new file mode 100644 index 0000000..92ab540 Binary files /dev/null and b/ShenYin/ShenYin/Assets.xcassets/home/record_copy.imageset/Frame_1938@2x(4).png differ diff --git a/ShenYin/ShenYin/Assets.xcassets/home/record_copy.imageset/Frame_1938@3x(4).png b/ShenYin/ShenYin/Assets.xcassets/home/record_copy.imageset/Frame_1938@3x(4).png new file mode 100644 index 0000000..12af0e5 Binary files /dev/null and b/ShenYin/ShenYin/Assets.xcassets/home/record_copy.imageset/Frame_1938@3x(4).png differ diff --git a/ShenYin/ShenYin/Assets.xcassets/home/record_more.imageset/Contents.json b/ShenYin/ShenYin/Assets.xcassets/home/record_more.imageset/Contents.json new file mode 100644 index 0000000..511c377 --- /dev/null +++ b/ShenYin/ShenYin/Assets.xcassets/home/record_more.imageset/Contents.json @@ -0,0 +1,22 @@ +{ + "images" : [ + { + "idiom" : "universal", + "scale" : "1x" + }, + { + "filename" : "Frame_1938@2x(1).png", + "idiom" : "universal", + "scale" : "2x" + }, + { + "filename" : "Frame_1938@3x(1).png", + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/ShenYin/ShenYin/Assets.xcassets/home/record_more.imageset/Frame_1938@2x(1).png b/ShenYin/ShenYin/Assets.xcassets/home/record_more.imageset/Frame_1938@2x(1).png new file mode 100644 index 0000000..a2ce407 Binary files /dev/null and b/ShenYin/ShenYin/Assets.xcassets/home/record_more.imageset/Frame_1938@2x(1).png differ diff --git a/ShenYin/ShenYin/Assets.xcassets/home/record_more.imageset/Frame_1938@3x(1).png b/ShenYin/ShenYin/Assets.xcassets/home/record_more.imageset/Frame_1938@3x(1).png new file mode 100644 index 0000000..12c9728 Binary files /dev/null and b/ShenYin/ShenYin/Assets.xcassets/home/record_more.imageset/Frame_1938@3x(1).png differ diff --git a/ShenYin/ShenYin/Assets.xcassets/home/record_play 1.imageset/Contents.json b/ShenYin/ShenYin/Assets.xcassets/home/record_play 1.imageset/Contents.json new file mode 100644 index 0000000..c44f3e2 --- /dev/null +++ b/ShenYin/ShenYin/Assets.xcassets/home/record_play 1.imageset/Contents.json @@ -0,0 +1,22 @@ +{ + "images" : [ + { + "idiom" : "universal", + "scale" : "1x" + }, + { + "filename" : "Frame_1938@2x(2).png", + "idiom" : "universal", + "scale" : "2x" + }, + { + "filename" : "Frame_1938@3x(2).png", + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/ShenYin/ShenYin/Assets.xcassets/home/record_play 1.imageset/Frame_1938@2x(2).png b/ShenYin/ShenYin/Assets.xcassets/home/record_play 1.imageset/Frame_1938@2x(2).png new file mode 100644 index 0000000..ee8d50c Binary files /dev/null and b/ShenYin/ShenYin/Assets.xcassets/home/record_play 1.imageset/Frame_1938@2x(2).png differ diff --git a/ShenYin/ShenYin/Assets.xcassets/home/record_play 1.imageset/Frame_1938@3x(2).png b/ShenYin/ShenYin/Assets.xcassets/home/record_play 1.imageset/Frame_1938@3x(2).png new file mode 100644 index 0000000..caaa2d5 Binary files /dev/null and b/ShenYin/ShenYin/Assets.xcassets/home/record_play 1.imageset/Frame_1938@3x(2).png differ diff --git a/ShenYin/ShenYin/Assets.xcassets/chat/chat_xiaoyin.imageset/Contents.json b/ShenYin/ShenYin/Assets.xcassets/home/record_rename.imageset/Contents.json similarity index 77% rename from ShenYin/ShenYin/Assets.xcassets/chat/chat_xiaoyin.imageset/Contents.json rename to ShenYin/ShenYin/Assets.xcassets/home/record_rename.imageset/Contents.json index f1b6846..df5635c 100644 --- a/ShenYin/ShenYin/Assets.xcassets/chat/chat_xiaoyin.imageset/Contents.json +++ b/ShenYin/ShenYin/Assets.xcassets/home/record_rename.imageset/Contents.json @@ -5,12 +5,12 @@ "scale" : "1x" }, { - "filename" : "Group_2361@2x.png", + "filename" : "Frame_1938@2x.png", "idiom" : "universal", "scale" : "2x" }, { - "filename" : "Group_2361@3x.png", + "filename" : "Frame_1938@3x.png", "idiom" : "universal", "scale" : "3x" } diff --git a/ShenYin/ShenYin/Assets.xcassets/home/record_rename.imageset/Frame_1938@2x.png b/ShenYin/ShenYin/Assets.xcassets/home/record_rename.imageset/Frame_1938@2x.png new file mode 100644 index 0000000..7e992f3 Binary files /dev/null and b/ShenYin/ShenYin/Assets.xcassets/home/record_rename.imageset/Frame_1938@2x.png differ diff --git a/ShenYin/ShenYin/Assets.xcassets/home/record_rename.imageset/Frame_1938@3x.png b/ShenYin/ShenYin/Assets.xcassets/home/record_rename.imageset/Frame_1938@3x.png new file mode 100644 index 0000000..ed2ca79 Binary files /dev/null and b/ShenYin/ShenYin/Assets.xcassets/home/record_rename.imageset/Frame_1938@3x.png differ diff --git a/ShenYin/ShenYin/Assets.xcassets/home/record_translate.imageset/Contents.json b/ShenYin/ShenYin/Assets.xcassets/home/record_translate.imageset/Contents.json new file mode 100644 index 0000000..f14f62b --- /dev/null +++ b/ShenYin/ShenYin/Assets.xcassets/home/record_translate.imageset/Contents.json @@ -0,0 +1,22 @@ +{ + "images" : [ + { + "idiom" : "universal", + "scale" : "1x" + }, + { + "filename" : "Frame_1938@2x(3).png", + "idiom" : "universal", + "scale" : "2x" + }, + { + "filename" : "Frame_1938@3x(3).png", + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/ShenYin/ShenYin/Assets.xcassets/home/record_translate.imageset/Frame_1938@2x(3).png b/ShenYin/ShenYin/Assets.xcassets/home/record_translate.imageset/Frame_1938@2x(3).png new file mode 100644 index 0000000..c57ae6e Binary files /dev/null and b/ShenYin/ShenYin/Assets.xcassets/home/record_translate.imageset/Frame_1938@2x(3).png differ diff --git a/ShenYin/ShenYin/Assets.xcassets/home/record_translate.imageset/Frame_1938@3x(3).png b/ShenYin/ShenYin/Assets.xcassets/home/record_translate.imageset/Frame_1938@3x(3).png new file mode 100644 index 0000000..a179f3e Binary files /dev/null and b/ShenYin/ShenYin/Assets.xcassets/home/record_translate.imageset/Frame_1938@3x(3).png differ diff --git a/ShenYin/ShenYin/Assets.xcassets/home/tips_chinese2english.imageset/Contents.json b/ShenYin/ShenYin/Assets.xcassets/home/tips_chinese2english.imageset/Contents.json new file mode 100644 index 0000000..68bbddd --- /dev/null +++ b/ShenYin/ShenYin/Assets.xcassets/home/tips_chinese2english.imageset/Contents.json @@ -0,0 +1,22 @@ +{ + "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/Assets.xcassets/home/tips_chinese2english.imageset/\344\270\255\350\213\261\344\272\222\350\257\221@2x.png" "b/ShenYin/ShenYin/Assets.xcassets/home/tips_chinese2english.imageset/\344\270\255\350\213\261\344\272\222\350\257\221@2x.png" new file mode 100644 index 0000000..3a6c8b0 Binary files /dev/null and "b/ShenYin/ShenYin/Assets.xcassets/home/tips_chinese2english.imageset/\344\270\255\350\213\261\344\272\222\350\257\221@2x.png" differ diff --git "a/ShenYin/ShenYin/Assets.xcassets/home/tips_chinese2english.imageset/\344\270\255\350\213\261\344\272\222\350\257\221@3x.png" "b/ShenYin/ShenYin/Assets.xcassets/home/tips_chinese2english.imageset/\344\270\255\350\213\261\344\272\222\350\257\221@3x.png" new file mode 100644 index 0000000..ff5b297 Binary files /dev/null and "b/ShenYin/ShenYin/Assets.xcassets/home/tips_chinese2english.imageset/\344\270\255\350\213\261\344\272\222\350\257\221@3x.png" differ diff --git a/ShenYin/ShenYin/Assets.xcassets/home/tips_dialog.imageset/Contents.json b/ShenYin/ShenYin/Assets.xcassets/home/tips_dialog.imageset/Contents.json new file mode 100644 index 0000000..b5ef55e --- /dev/null +++ b/ShenYin/ShenYin/Assets.xcassets/home/tips_dialog.imageset/Contents.json @@ -0,0 +1,22 @@ +{ + "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/Assets.xcassets/home/tips_dialog.imageset/\345\257\271\350\257\235\347\277\273\350\257\221@2x.png" "b/ShenYin/ShenYin/Assets.xcassets/home/tips_dialog.imageset/\345\257\271\350\257\235\347\277\273\350\257\221@2x.png" new file mode 100644 index 0000000..6eb61b1 Binary files /dev/null and "b/ShenYin/ShenYin/Assets.xcassets/home/tips_dialog.imageset/\345\257\271\350\257\235\347\277\273\350\257\221@2x.png" differ diff --git "a/ShenYin/ShenYin/Assets.xcassets/home/tips_dialog.imageset/\345\257\271\350\257\235\347\277\273\350\257\221@3x.png" "b/ShenYin/ShenYin/Assets.xcassets/home/tips_dialog.imageset/\345\257\271\350\257\235\347\277\273\350\257\221@3x.png" new file mode 100644 index 0000000..009c881 Binary files /dev/null and "b/ShenYin/ShenYin/Assets.xcassets/home/tips_dialog.imageset/\345\257\271\350\257\235\347\277\273\350\257\221@3x.png" differ diff --git a/ShenYin/ShenYin/Assets.xcassets/home/tips_tongchuan.imageset/Contents.json b/ShenYin/ShenYin/Assets.xcassets/home/tips_tongchuan.imageset/Contents.json new file mode 100644 index 0000000..b14a288 --- /dev/null +++ b/ShenYin/ShenYin/Assets.xcassets/home/tips_tongchuan.imageset/Contents.json @@ -0,0 +1,22 @@ +{ + "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/Assets.xcassets/home/tips_tongchuan.imageset/\345\220\214\344\274\240\345\220\254\350\257\221@2x.png" "b/ShenYin/ShenYin/Assets.xcassets/home/tips_tongchuan.imageset/\345\220\214\344\274\240\345\220\254\350\257\221@2x.png" new file mode 100644 index 0000000..5f06735 Binary files /dev/null and "b/ShenYin/ShenYin/Assets.xcassets/home/tips_tongchuan.imageset/\345\220\214\344\274\240\345\220\254\350\257\221@2x.png" differ diff --git "a/ShenYin/ShenYin/Assets.xcassets/home/tips_tongchuan.imageset/\345\220\214\344\274\240\345\220\254\350\257\221@3x.png" "b/ShenYin/ShenYin/Assets.xcassets/home/tips_tongchuan.imageset/\345\220\214\344\274\240\345\220\254\350\257\221@3x.png" new file mode 100644 index 0000000..7e22615 Binary files /dev/null and "b/ShenYin/ShenYin/Assets.xcassets/home/tips_tongchuan.imageset/\345\220\214\344\274\240\345\220\254\350\257\221@3x.png" differ diff --git a/ShenYin/ShenYin/Assets.xcassets/launch/Contents.json b/ShenYin/ShenYin/Assets.xcassets/launch/Contents.json new file mode 100644 index 0000000..73c0059 --- /dev/null +++ b/ShenYin/ShenYin/Assets.xcassets/launch/Contents.json @@ -0,0 +1,6 @@ +{ + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/ShenYin/ShenYin/Assets.xcassets/launch/launch_1.imageset/Contents.json b/ShenYin/ShenYin/Assets.xcassets/launch/launch_1.imageset/Contents.json new file mode 100644 index 0000000..22cc82e --- /dev/null +++ b/ShenYin/ShenYin/Assets.xcassets/launch/launch_1.imageset/Contents.json @@ -0,0 +1,23 @@ +{ + "images" : [ + { + "filename" : "Frame_2259.png", + "idiom" : "universal", + "scale" : "1x" + }, + { + "filename" : "Frame_2259@2x.png", + "idiom" : "universal", + "scale" : "2x" + }, + { + "filename" : "Frame_2259@3x.png", + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/ShenYin/ShenYin/Assets.xcassets/launch/launch_1.imageset/Frame_2259.png b/ShenYin/ShenYin/Assets.xcassets/launch/launch_1.imageset/Frame_2259.png new file mode 100644 index 0000000..5dbdefc Binary files /dev/null and b/ShenYin/ShenYin/Assets.xcassets/launch/launch_1.imageset/Frame_2259.png differ diff --git a/ShenYin/ShenYin/Assets.xcassets/launch/launch_1.imageset/Frame_2259@2x.png b/ShenYin/ShenYin/Assets.xcassets/launch/launch_1.imageset/Frame_2259@2x.png new file mode 100644 index 0000000..ffbc565 Binary files /dev/null and b/ShenYin/ShenYin/Assets.xcassets/launch/launch_1.imageset/Frame_2259@2x.png differ diff --git a/ShenYin/ShenYin/Assets.xcassets/launch/launch_1.imageset/Frame_2259@3x.png b/ShenYin/ShenYin/Assets.xcassets/launch/launch_1.imageset/Frame_2259@3x.png new file mode 100644 index 0000000..044609f Binary files /dev/null and b/ShenYin/ShenYin/Assets.xcassets/launch/launch_1.imageset/Frame_2259@3x.png differ diff --git a/ShenYin/ShenYin/Assets.xcassets/launch/launch_2.imageset/Contents.json b/ShenYin/ShenYin/Assets.xcassets/launch/launch_2.imageset/Contents.json new file mode 100644 index 0000000..6948cb0 --- /dev/null +++ b/ShenYin/ShenYin/Assets.xcassets/launch/launch_2.imageset/Contents.json @@ -0,0 +1,23 @@ +{ + "images" : [ + { + "filename" : "Frame_2260.png", + "idiom" : "universal", + "scale" : "1x" + }, + { + "filename" : "Frame_2260@2x.png", + "idiom" : "universal", + "scale" : "2x" + }, + { + "filename" : "Frame_2260@3x.png", + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/ShenYin/ShenYin/Assets.xcassets/launch/launch_2.imageset/Frame_2260.png b/ShenYin/ShenYin/Assets.xcassets/launch/launch_2.imageset/Frame_2260.png new file mode 100644 index 0000000..44b6b2d Binary files /dev/null and b/ShenYin/ShenYin/Assets.xcassets/launch/launch_2.imageset/Frame_2260.png differ diff --git a/ShenYin/ShenYin/Assets.xcassets/launch/launch_2.imageset/Frame_2260@2x.png b/ShenYin/ShenYin/Assets.xcassets/launch/launch_2.imageset/Frame_2260@2x.png new file mode 100644 index 0000000..2affb43 Binary files /dev/null and b/ShenYin/ShenYin/Assets.xcassets/launch/launch_2.imageset/Frame_2260@2x.png differ diff --git a/ShenYin/ShenYin/Assets.xcassets/launch/launch_2.imageset/Frame_2260@3x.png b/ShenYin/ShenYin/Assets.xcassets/launch/launch_2.imageset/Frame_2260@3x.png new file mode 100644 index 0000000..c582a9b Binary files /dev/null and b/ShenYin/ShenYin/Assets.xcassets/launch/launch_2.imageset/Frame_2260@3x.png differ diff --git a/ShenYin/ShenYin/Assets.xcassets/mode/find_icon.imageset/Contents.json b/ShenYin/ShenYin/Assets.xcassets/mode/find_icon.imageset/Contents.json new file mode 100644 index 0000000..5c4d3b1 --- /dev/null +++ b/ShenYin/ShenYin/Assets.xcassets/mode/find_icon.imageset/Contents.json @@ -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/mode/find_icon.imageset/Frame@2x.png b/ShenYin/ShenYin/Assets.xcassets/mode/find_icon.imageset/Frame@2x.png new file mode 100644 index 0000000..e5cbbe0 Binary files /dev/null and b/ShenYin/ShenYin/Assets.xcassets/mode/find_icon.imageset/Frame@2x.png differ diff --git a/ShenYin/ShenYin/Assets.xcassets/mode/find_icon.imageset/Frame@3x.png b/ShenYin/ShenYin/Assets.xcassets/mode/find_icon.imageset/Frame@3x.png new file mode 100644 index 0000000..3ee5aa2 Binary files /dev/null and b/ShenYin/ShenYin/Assets.xcassets/mode/find_icon.imageset/Frame@3x.png differ diff --git a/ShenYin/ShenYin/Assets.xcassets/mode/mode_reset.imageset/Contents.json b/ShenYin/ShenYin/Assets.xcassets/mode/mode_reset.imageset/Contents.json new file mode 100644 index 0000000..5c4d3b1 --- /dev/null +++ b/ShenYin/ShenYin/Assets.xcassets/mode/mode_reset.imageset/Contents.json @@ -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/mode/mode_reset.imageset/Frame@2x.png b/ShenYin/ShenYin/Assets.xcassets/mode/mode_reset.imageset/Frame@2x.png new file mode 100644 index 0000000..2f77dc9 Binary files /dev/null and b/ShenYin/ShenYin/Assets.xcassets/mode/mode_reset.imageset/Frame@2x.png differ diff --git a/ShenYin/ShenYin/Assets.xcassets/mode/mode_reset.imageset/Frame@3x.png b/ShenYin/ShenYin/Assets.xcassets/mode/mode_reset.imageset/Frame@3x.png new file mode 100644 index 0000000..983a8db Binary files /dev/null and b/ShenYin/ShenYin/Assets.xcassets/mode/mode_reset.imageset/Frame@3x.png differ diff --git a/ShenYin/ShenYin/Assets.xcassets/mode/mode_selected.imageset/Contents.json b/ShenYin/ShenYin/Assets.xcassets/mode/mode_selected.imageset/Contents.json new file mode 100644 index 0000000..3404e40 --- /dev/null +++ b/ShenYin/ShenYin/Assets.xcassets/mode/mode_selected.imageset/Contents.json @@ -0,0 +1,22 @@ +{ + "images" : [ + { + "idiom" : "universal", + "scale" : "1x" + }, + { + "filename" : "Group 1390@2x.png", + "idiom" : "universal", + "scale" : "2x" + }, + { + "filename" : "Group 1390@3x.png", + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/ShenYin/ShenYin/Assets.xcassets/mode/mode_selected.imageset/Group 1390@2x.png b/ShenYin/ShenYin/Assets.xcassets/mode/mode_selected.imageset/Group 1390@2x.png new file mode 100644 index 0000000..a6fe4c9 Binary files /dev/null and b/ShenYin/ShenYin/Assets.xcassets/mode/mode_selected.imageset/Group 1390@2x.png differ diff --git a/ShenYin/ShenYin/Assets.xcassets/mode/mode_selected.imageset/Group 1390@3x.png b/ShenYin/ShenYin/Assets.xcassets/mode/mode_selected.imageset/Group 1390@3x.png new file mode 100644 index 0000000..228eb0b Binary files /dev/null and b/ShenYin/ShenYin/Assets.xcassets/mode/mode_selected.imageset/Group 1390@3x.png differ diff --git a/ShenYin/ShenYin/Assets.xcassets/mode/slider_icon.imageset/Contents.json b/ShenYin/ShenYin/Assets.xcassets/mode/slider_icon.imageset/Contents.json new file mode 100644 index 0000000..1d00de5 --- /dev/null +++ b/ShenYin/ShenYin/Assets.xcassets/mode/slider_icon.imageset/Contents.json @@ -0,0 +1,22 @@ +{ + "images" : [ + { + "idiom" : "universal", + "scale" : "1x" + }, + { + "filename" : "Frame_2257@2x.png", + "idiom" : "universal", + "scale" : "2x" + }, + { + "filename" : "Frame_2257@3x.png", + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/ShenYin/ShenYin/Assets.xcassets/mode/slider_icon.imageset/Frame_2257@2x.png b/ShenYin/ShenYin/Assets.xcassets/mode/slider_icon.imageset/Frame_2257@2x.png new file mode 100644 index 0000000..64ed42b Binary files /dev/null and b/ShenYin/ShenYin/Assets.xcassets/mode/slider_icon.imageset/Frame_2257@2x.png differ diff --git a/ShenYin/ShenYin/Assets.xcassets/mode/slider_icon.imageset/Frame_2257@3x.png b/ShenYin/ShenYin/Assets.xcassets/mode/slider_icon.imageset/Frame_2257@3x.png new file mode 100644 index 0000000..0ab51f2 Binary files /dev/null and b/ShenYin/ShenYin/Assets.xcassets/mode/slider_icon.imageset/Frame_2257@3x.png differ diff --git a/ShenYin/ShenYin/Base.lproj/LaunchScreen.storyboard b/ShenYin/ShenYin/Base.lproj/LaunchScreen.storyboard index 865e932..1e6708b 100644 --- a/ShenYin/ShenYin/Base.lproj/LaunchScreen.storyboard +++ b/ShenYin/ShenYin/Base.lproj/LaunchScreen.storyboard @@ -1,8 +1,11 @@ - - + + + - + + + @@ -11,15 +14,52 @@ - + - + + + + + + + + + + + + + + + + + + + + + + + + + + - + + + + + + + + diff --git a/ShenYin/ShenYin/Ble/BleManager.swift b/ShenYin/ShenYin/Ble/BleManager.swift index b43d0df..17c8cc3 100644 --- a/ShenYin/ShenYin/Ble/BleManager.swift +++ b/ShenYin/ShenYin/Ble/BleManager.swift @@ -106,12 +106,12 @@ extension BleManager: CBPeripheralDelegate { if (service.uuid.uuidString == kJoyGemAIServiceUUID) { let success = JoyGemAIManager.shared().configService(service) { chars in for char in chars { - debugPrint(char) + Logger.debug(char) peripheral.setNotifyValue(true, for: char) } } if (!success) { - debugPrint("初始化失败!") + Logger.debug("初始化失败!") } } } @@ -208,7 +208,7 @@ extension BleManager : JoyGemAIManagerDelegate { case .recordCall: SVProgressHUD.showInfo(withStatus: "请求开启通话录音") case .si: - SVProgressHUD.showInfo(withStatus: "请求开启同声传译") + SVProgressHUD.showInfo(withStatus: "请求开启同传听译") case .chat: SVProgressHUD.showInfo(withStatus: "通知开启了AI对话") @unknown default: diff --git a/ShenYin/ShenYin/Info.plist b/ShenYin/ShenYin/Info.plist index e31de9e..0850455 100644 --- a/ShenYin/ShenYin/Info.plist +++ b/ShenYin/ShenYin/Info.plist @@ -27,5 +27,7 @@ bluetooth-central audio + CFBundleDisplayName + 深音 diff --git a/ShenYin/ShenYin/SceneDelegate.swift b/ShenYin/ShenYin/SceneDelegate.swift index ccea0e3..a191bc1 100644 --- a/ShenYin/ShenYin/SceneDelegate.swift +++ b/ShenYin/ShenYin/SceneDelegate.swift @@ -20,7 +20,7 @@ class SceneDelegate: UIResponder, UIWindowSceneDelegate { App.shared.window = window window?.rootViewController = BaseTC() - window?.rootViewController = UINavigationController(rootViewController: FieldRecordingVC()) + window?.rootViewController = UINavigationController(rootViewController: CustomEqVC()) AppLaunch.start() } diff --git a/ShenYin/ShenYin/Tools/Date.swift b/ShenYin/ShenYin/Tools/Date.swift index 9fc933d..41598e2 100644 --- a/ShenYin/ShenYin/Tools/Date.swift +++ b/ShenYin/ShenYin/Tools/Date.swift @@ -54,6 +54,8 @@ extension Date { /// e.g. 2020å¹´01月01日 01:01:01.088 static let full1: Format = .init("yyyyå¹´MM月dd日 HH:mm:ss.SSS") + static let full2: Format = .init("yyyy-MM-ddTHH:mm") + static let full3: Format = .init("yyyy-MM-dd HH:mm") } /// 格式化成本地时间 diff --git a/ShenYin/ShenYin/UI/Base/BaseTC.swift b/ShenYin/ShenYin/UI/Base/BaseTC.swift index 06eddf7..0ef49d6 100644 --- a/ShenYin/ShenYin/UI/Base/BaseTC.swift +++ b/ShenYin/ShenYin/UI/Base/BaseTC.swift @@ -55,6 +55,6 @@ class BaseTC:UITabBarController{ self.tabBar.backgroundColor = .white view.backgroundColor = .color(.bgColor) - self.selectedIndex = 0 + self.selectedIndex = 1 } } diff --git a/ShenYin/ShenYin/UI/Base/GlobalConfig.swift b/ShenYin/ShenYin/UI/Base/GlobalConfig.swift deleted file mode 100644 index 532b7ab..0000000 --- a/ShenYin/ShenYin/UI/Base/GlobalConfig.swift +++ /dev/null @@ -1,22 +0,0 @@ -// -// GlobalConfig.swift -// ShenYin -// -// Created by liangshi on 2025/8/27. -// - -class GlobalConfig{ - static let languages = ["简体中文","English","日语","法语"] - static let tranlateLanguages = [ - "中文", - "英文", - "日文", - "韩文", - "法文", - "西班牙文", - "葡萄牙文", - "印度尼西亚", - "俄文", - "马来文", - ] -} diff --git a/ShenYin/ShenYin/UI/Home/CallingRecordVC.swift b/ShenYin/ShenYin/UI/Home/CallingRecordVC.swift index a6febb5..3a156d8 100644 --- a/ShenYin/ShenYin/UI/Home/CallingRecordVC.swift +++ b/ShenYin/ShenYin/UI/Home/CallingRecordVC.swift @@ -16,10 +16,8 @@ class CallingRecordVC:BaseVC{ } override func setupViews() { navBar.title = "通话录音" - navBar.rightView.setImage(UIImage(named: "help_icon"), for: .normal) - textView.do { v in - v.text = "好优美的一篇文章,山花落尽,我心犹青|||记得春日时分,山花绽放得那样热烈,鲜红的、明黄的、洁白的,仿佛将整片山野染成了一幅画。那时的心也如山花般明亮,轻快地跳跃在生活的每一个角落。然而,繁华易逝,花朵终会飘落。花落的那天,我站在同一片山坡上,听着风带走它们的碎影。那种空落感从心底涌起,像极了许多未能言说的遗憾,带着些许酸涩。" + v.isEditable = false v.font = .regular(14) v.textColor = .hexString("#121212") v.contentInset = UIEdgeInsets(top: 0, left: 18, bottom: 0, right: 18) @@ -43,9 +41,6 @@ class CallingRecordVC:BaseVC{ make.left.right.equalToSuperview() make.bottom.equalTo(toolBar.snp.top) } - } - override func navRightViewTapped() { - } func scrollToBottom(){ diff --git a/ShenYin/ShenYin/UI/Home/Chat/ChatCell.swift b/ShenYin/ShenYin/UI/Home/Chat/ChatCell.swift index 50eb1e3..71cb86f 100644 --- a/ShenYin/ShenYin/UI/Home/Chat/ChatCell.swift +++ b/ShenYin/ShenYin/UI/Home/Chat/ChatCell.swift @@ -6,7 +6,7 @@ // /// Ai回应模型 public class ChatCellModel { - public var type: Int = 0 + public var type: Int = 0//1发,0收 public var content: String = "" public var id:UInt = 0 } @@ -51,8 +51,9 @@ class ChatCell:BaseTableViewCell{ } originalLabel.snp.makeConstraints { make in - make.left.right.top.bottom.equalToSuperview().inset(10) - make.width.lessThanOrEqualTo(kScreenWid - 56) + make.top.bottom.equalToSuperview().inset(14) + make.left.right.equalToSuperview().inset(12) + make.width.lessThanOrEqualTo(kScreenWid - 60) } } diff --git a/ShenYin/ShenYin/UI/Home/Chat/ChatHeaderView.swift b/ShenYin/ShenYin/UI/Home/Chat/ChatHeaderView.swift index 5940056..4cafb0a 100644 --- a/ShenYin/ShenYin/UI/Home/Chat/ChatHeaderView.swift +++ b/ShenYin/ShenYin/UI/Home/Chat/ChatHeaderView.swift @@ -4,12 +4,19 @@ // // Created by liangshi on 2025/9/3. // - +import JoyGemAI +import UIKit class ChatHeaderView: BaseView { let icon = UIImageView() let titleLabel = UILabel() let desLabel = UILabel() + var role:JoyGemSpeaker!{ + didSet{ +// titleLabel.text = role.name + icon.image = UIImage(named: "role_" + role.role) + } + } override func setupViews() { // backgroundColor = .red @@ -20,14 +27,14 @@ class ChatHeaderView: BaseView { v.image = UIImage(named: "chat_xiaoyin") } titleLabel.do {v in - v.text = "嗨!我是小音" +// v.text = "嗨!我是小音" v.numberOfLines = 0 v.textAlignment = .center v.textColor = .hexString("#121212") v.font = .bold(18) } desLabel.do {v in - v.text = "我可以帮你搜索、答疑、写作,请把你的任务交给 我吧~" +// v.text = "我可以帮你搜索、答疑、写作,请把你的任务交给 我吧~" v.numberOfLines = 0 v.textAlignment = .center v.textColor = .hexString("#666666") diff --git a/ShenYin/ShenYin/UI/Home/Chat/ChatVC.swift b/ShenYin/ShenYin/UI/Home/Chat/ChatVC.swift index bc00bba..fda5200 100644 --- a/ShenYin/ShenYin/UI/Home/Chat/ChatVC.swift +++ b/ShenYin/ShenYin/UI/Home/Chat/ChatVC.swift @@ -70,16 +70,17 @@ class ChatVC:BaseVC{ } } override func setupData() { - JoyGemChatManager.shared().getSpeakerList {[weak self] speakers in - guard let self = self,speakers.count > 0 else{return} - self.roleList = speakers - self.roleItem.role = speakers.first - JoyGemChatManager.shared().setSpeaker(self.roleItem.role) - } - JoyGemChatManager.shared().delegate = self PcmSound.sharedInstance().delegate = self JoyGemChatManager.shared().addObserver(self, forKeyPath: "isActive",options: [.new, .old], context: nil); + + let model = ChatCellModel() + model.type = 0 + model.content = "我是你的新朋友,有什么我可以帮助到你的?" + model.id = 0 + dataList.append(model) + + loadRoleList() } override func viewWillDisappear(_ animated: Bool) { super.viewWillDisappear(animated) @@ -103,9 +104,14 @@ class ChatVC:BaseVC{ App.shared.goToPage(IntelligentVC()) } @objc func roleBtnAction(){ + if roleList.count == 0 { + loadRoleList() + return + } let vc = RoleListVC(list: roleList, selectedModel: roleItem.role) {[weak self] model in guard let self = self else{return} roleItem.role = model + headerView.role = model JoyGemChatManager.shared().setSpeaker(model) } App.shared.goToPage(vc) @@ -115,6 +121,15 @@ class ChatVC:BaseVC{ tableView.scrollToRow(at: IndexPath(row: dataList.count - 1, section: 0), at: .none, animated: true) } } + func loadRoleList(){ + JoyGemChatManager.shared().getSpeakerList {[weak self] speakers in + guard let self = self,speakers.count > 0 else{return} + self.roleList = speakers + self.roleItem.role = speakers.first + self.headerView.role = speakers.first + JoyGemChatManager.shared().setSpeaker(self.roleItem.role) + } + } } extension ChatVC:ChatRecordBarDelegate{ diff --git a/ShenYin/ShenYin/UI/Home/Chat/NavigationBarItem.swift b/ShenYin/ShenYin/UI/Home/Chat/NavigationBarItem.swift index abcfae9..53dc5a3 100644 --- a/ShenYin/ShenYin/UI/Home/Chat/NavigationBarItem.swift +++ b/ShenYin/ShenYin/UI/Home/Chat/NavigationBarItem.swift @@ -44,6 +44,7 @@ class ChatRoleItem: BaseView { var role:JoyGemSpeaker!{ didSet{ titleLabel.text = role.name + icon.image = UIImage(named: "role_" + role.role) } } diff --git a/ShenYin/ShenYin/UI/Home/Chat/RoleListVC.swift b/ShenYin/ShenYin/UI/Home/Chat/RoleListVC.swift index f2ccf61..752faa2 100644 --- a/ShenYin/ShenYin/UI/Home/Chat/RoleListVC.swift +++ b/ShenYin/ShenYin/UI/Home/Chat/RoleListVC.swift @@ -89,6 +89,7 @@ class RoleListCell: BaseTableViewCell { var data:JoyGemSpeaker!{ didSet{ titleLabel.text = data.name + icon.image = UIImage(named: "role_" + data.role) } } diff --git a/ShenYin/ShenYin/UI/Home/Chinese2EnglishVC.swift b/ShenYin/ShenYin/UI/Home/Chinese2EnglishVC.swift index e9f183b..063792c 100644 --- a/ShenYin/ShenYin/UI/Home/Chinese2EnglishVC.swift +++ b/ShenYin/ShenYin/UI/Home/Chinese2EnglishVC.swift @@ -42,7 +42,8 @@ class Chinese2EnglishVC:BaseVC{ } } override func navRightViewTapped() { - + let tip = RecordTipsView(type: .chinese2english) + tip.show() } func scrollToBottom(){ if dataList.count > 0 { diff --git a/ShenYin/ShenYin/UI/Home/DialogTranlateVC.swift b/ShenYin/ShenYin/UI/Home/DialogTranlateVC.swift index 4871fde..88da2cc 100644 --- a/ShenYin/ShenYin/UI/Home/DialogTranlateVC.swift +++ b/ShenYin/ShenYin/UI/Home/DialogTranlateVC.swift @@ -42,7 +42,8 @@ class DialogTranlateVC:BaseVC{ } } override func navRightViewTapped() { - + let tip = RecordTipsView(type: .dialog) + tip.show() } func scrollToBottom(){ if dataList.count > 0 { diff --git a/ShenYin/ShenYin/UI/Home/FieldRecording/FieldRecordBar.swift b/ShenYin/ShenYin/UI/Home/FieldRecording/FieldRecordBar.swift index 7d51ca8..575baca 100644 --- a/ShenYin/ShenYin/UI/Home/FieldRecording/FieldRecordBar.swift +++ b/ShenYin/ShenYin/UI/Home/FieldRecording/FieldRecordBar.swift @@ -13,7 +13,7 @@ enum RecordSate:Int{ } protocol FieldRecordBarDelegate { - func fieldRecordBar(_ bar:FieldRecordBar,languageChange language:String) + func fieldRecordBar(_ bar:FieldRecordBar,languageChange language:AiSupportLanguage) func fieldRecordBar(_ bar:FieldRecordBar,stateChange state:RecordSate) } @@ -23,9 +23,6 @@ class FieldRecordBar: BaseView { let leftItem = RecordBarItem() let rightItem = RecordBarButton() var state:RecordSate = .stop - -// var languageDidChange:((String)->Void)? -// var recordStateDidChange:((RecordSate)->Void)? var delegate:FieldRecordBarDelegate? override func setupViews() { @@ -39,6 +36,7 @@ class FieldRecordBar: BaseView { } leftItem.do {v in v.yc.addTap(target: self, action: #selector(leftAction)) + v.language = .chinse } rightItem.do {v in v.state = .stop @@ -66,13 +64,15 @@ class FieldRecordBar: BaseView { if recordBtn.isSelected { return } - let v = CustomPicker(title: "请选择语言", list: GlobalConfig.languages) - v.selectedIndex = 0 + let list = AiSupportLanguage.record.map{$0.title} + + let v = CustomPicker(title: "请选择语言", 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.titleLabel.text = value - delegate?.fieldRecordBar(self, languageChange:value) + leftItem.language = AiSupportLanguage.record.first(where: {$0.title == value})! + delegate?.fieldRecordBar(self, languageChange:leftItem.language) } return } @@ -108,8 +108,13 @@ class FieldRecordBar: BaseView { } class RecordBarItem: BaseView { - let icon = UIImageView() - let titleLabel = UILabel() + private let icon = UIImageView() + private let titleLabel = UILabel() + var language:AiSupportLanguage = .chinse{ + didSet{ + titleLabel.text = language.title + } + } override func setupViews() { addSubviews([titleLabel,icon]) icon.do { v in @@ -118,7 +123,6 @@ class FieldRecordBar: BaseView { titleLabel.do { v in v.textColor = .rgb(0x121212) v.font = .regular(10) - v.text = "中文" } } diff --git a/ShenYin/ShenYin/UI/Home/FieldRecording/FieldRecordingVC.swift b/ShenYin/ShenYin/UI/Home/FieldRecording/FieldRecordingVC.swift index 709dd22..b7cc559 100644 --- a/ShenYin/ShenYin/UI/Home/FieldRecording/FieldRecordingVC.swift +++ b/ShenYin/ShenYin/UI/Home/FieldRecording/FieldRecordingVC.swift @@ -21,10 +21,10 @@ class FieldRecordingVC:BaseVC{ } override func setupViews() { navBar.title = "现场录音" - navBar.rightView.setImage(UIImage(named: "help_icon"), for: .normal) toolBar.delegate = self textView.do { v in + v.isEditable = false v.font = .regular(14) v.text = "" v.textColor = .hexString("#121212") @@ -61,9 +61,6 @@ class FieldRecordingVC:BaseVC{ } catch { print(error) } - } - override func navRightViewTapped() { - } func scrollToBottom(){ @@ -71,15 +68,14 @@ class FieldRecordingVC:BaseVC{ } extension FieldRecordingVC:FieldRecordBarDelegate{ - func fieldRecordBar(_ bar: FieldRecordBar, languageChange language: String) { - + func fieldRecordBar(_ bar: FieldRecordBar, languageChange language: AiSupportLanguage) { + JoyGemRecordManager.shared().originalLanguage = language.value } func fieldRecordBar(_ bar: FieldRecordBar, stateChange state: RecordSate) { if state == .start { textView.text = "" messageList.removeAll() - JoyGemRecordManager.shared().originalLanguage = kJoyGemAILocalizationZH JoyGemRecordManager.shared().start() } if state == .resume{ @@ -114,7 +110,7 @@ extension FieldRecordingVC : JoyGemRecordManagerDelegate { } func recordManager(_ manager: JoyGemRecordManager, didUpdateAsr model: JoyGemAsrModel) { - debugPrint("text: \(model.text),index: \(model.index)") + Logger.debug("text: \(model.text),index: \(model.index)") let msg = messageList.firstIndex (where: { (str,idx) in return idx == model.index; }) @@ -134,26 +130,26 @@ extension FieldRecordingVC : JoyGemRecordManagerDelegate { func recordManager(_ manager: JoyGemRecordManager, update mode: JoyGemRecordMode) { - debugPrint("mode: \(mode)") + Logger.debug("mode: \(mode)") } func recordManager(_ manager: JoyGemRecordManager, saveFile path: String) { - debugPrint("path: \(path)") + Logger.debug("path: \(path)") recordFilePath = path } func recordManager(_ manager: JoyGemRecordManager, stateChange code: JoyGemStateCode) { - debugPrint("code: \(code)") + Logger.debug("code: \(code)") } func recordManagerStopped(_ manager: JoyGemRecordManager, reason code: JoyGemRecordStopCode) { - if (code == .actively) { - YLprogressHUD.showAutoHiden("用户主动结束") - } else { - YLprogressHUD.showAutoHiden("自动结束") - ///判断当前蓝牙是否连接从而确定是否因为蓝牙断开造成的录音断开 - } +// if (code == .actively) { +// YLprogressHUD.showAutoHiden("用户主动结束") +// } else { +// YLprogressHUD.showAutoHiden("自动结束") +// ///判断当前蓝牙是否连接从而确定是否因为蓝牙断开造成的录音断开 +// } } func recordManager(_ manager: JoyGemRecordManager, onError code: JoyGemErrorCode) { @@ -164,6 +160,6 @@ extension FieldRecordingVC : JoyGemRecordManagerDelegate { extension FieldRecordingVC : PcmSoundDelegate { func remaining(_ frames: UInt) { - debugPrint("[frame:\(frames)]"); + Logger.debug("[frame:\(frames)]"); } } diff --git a/ShenYin/ShenYin/UI/Home/RecordDetail/RecordDetailBar.swift b/ShenYin/ShenYin/UI/Home/RecordDetail/RecordDetailBar.swift new file mode 100644 index 0000000..005526e --- /dev/null +++ b/ShenYin/ShenYin/UI/Home/RecordDetail/RecordDetailBar.swift @@ -0,0 +1,123 @@ +// +// RecordDetailBar.swift +// ShenYin +// +// Created by liangshi on 2025/9/5. +// + +protocol RecordDetailBarDelegate { + func recordDetailBarTranstlateAction(_ bar:RecordDetailBar) + func recordDetailBarRenameAction(_ bar:RecordDetailBar) + func recordDetailBarPlayAction(_ bar:RecordDetailBar) + func recordDetailBarMoreAction(_ bar:RecordDetailBar) +} + +class RecordDetailBar: BaseView { + let tranlateItem = RecordDetailBarButton() + let renameItem = RecordDetailBarButton() + let playItem = RecordDetailBarButton() + let moreItem = RecordDetailBarButton() + + var delegate:RecordDetailBarDelegate? + + override func setupViews() { + backgroundColor = .white + addSubviews([tranlateItem,renameItem,playItem,moreItem]) + + tranlateItem.do {v in + v.yc.addTap(target: self, action: #selector(tralateAction)) + v.image = UIImage(named: "record_translate") + v.title = "翻译" + } + renameItem.do {v in + v.yc.addTap(target: self, action: #selector(renameAction)) + v.image = UIImage(named: "record_rename") + v.title = "重命名" + } + playItem.do {v in + v.yc.addTap(target: self, action: #selector(playAction)) + v.image = UIImage(named: "record_play 1") + v.title = "播放录音" + } + moreItem.do {v in + v.yc.addTap(target: self, action: #selector(moreAction)) + v.image = UIImage(named: "record_more") + v.title = "更多" + } + } + + override func setupLayout() { + let w = (kScreenWid - 40)/4 + tranlateItem.snp.makeConstraints { make in + make.width.equalTo(w) + make.top.equalToSuperview() + make.height.equalTo(95) + make.left.equalToSuperview().inset(20) + } + renameItem.snp.makeConstraints { make in + make.width.equalTo(w) + make.top.height.equalTo(tranlateItem) + make.left.equalTo(tranlateItem.snp.right) + } + playItem.snp.makeConstraints { make in + make.width.equalTo(w) + make.top.height.equalTo(tranlateItem) + make.left.equalTo(renameItem.snp.right) + } + moreItem.snp.makeConstraints { make in + make.width.equalTo(w) + make.top.height.equalTo(tranlateItem) + make.left.equalTo(playItem.snp.right) + } + } + @objc func tralateAction(){ + delegate?.recordDetailBarTranstlateAction(self) + } + @objc func renameAction(){ + delegate?.recordDetailBarRenameAction(self) + } + @objc func playAction(){ + delegate?.recordDetailBarPlayAction(self) + } + @objc func moreAction(){ + delegate?.recordDetailBarMoreAction(self) + } + + class RecordDetailBarButton: BaseView { + let icon = UIImageView() + let titleLabel = UILabel() + var image:UIImage!{ + didSet{ + icon.image = image + } + } + var title:String!{ + didSet{ + titleLabel.text = title + } + } + + override func setupViews() { +// backgroundColor = .red + addSubviews([titleLabel,icon]) + icon.do { v in + } + titleLabel.do { v in + v.textColor = .rgb(0x232323) + v.font = .regular(10) + } + } + + override func setupLayout() { + icon.snp.makeConstraints { make in + make.size.equalTo(30) + make.top.equalToSuperview().inset(16) + 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/RecordDetail/RecordDetailTopBar.swift b/ShenYin/ShenYin/UI/Home/RecordDetail/RecordDetailTopBar.swift new file mode 100644 index 0000000..7a196f4 --- /dev/null +++ b/ShenYin/ShenYin/UI/Home/RecordDetail/RecordDetailTopBar.swift @@ -0,0 +1,91 @@ +// +// Untitled.swift +// ShenYin +// +// Created by liangshi on 2025/9/5. +// + +protocol RecordDetailTopBarDelegate { + func recordDetailBarTranstlateAction(_ bar:RecordDetailTopBar) + func recordDetailTopBarOgrinAction(_ bar:RecordDetailTopBar) +} + +class RecordDetailTopBar: BaseView { + let tranlateItem = LanguageItem() + let originItem = LanguageItem() + + + var delegate:RecordDetailTopBarDelegate? + + override func setupViews() { + backgroundColor = .clear + addSubviews([tranlateItem,originItem]) + + 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 + } + } + + override func setupLayout() { + originItem.snp.makeConstraints { make in + make.width.equalTo(100) + make.top.equalToSuperview() + make.height.equalTo(36) + make.right.equalToSuperview().inset(kScreenWid/2 + 15) + } + tranlateItem.snp.makeConstraints { make in + make.width.equalTo(100) + make.top.equalToSuperview() + make.height.equalTo(36) + make.left.equalToSuperview().offset(kScreenWid/2 + 15) + } + } + @objc func tralateAction(){ + tranlateItem.isSelected = !tranlateItem.isSelected + delegate?.recordDetailBarTranstlateAction(self) + } + @objc func originAction(){ + originItem.isSelected = !originItem.isSelected + delegate?.recordDetailTopBarOgrinAction(self) + } + + + class LanguageItem: BaseView { + let label = UILabel() + var isSelected:Bool = false{ + didSet{ + if isSelected { + label.textColor = .hexString("#0092E1") + label.yc.setBorder(width: 2, color: .hexString("#0092E1"), radius: 8) + } + else{ + label.textColor = .hexString("#121212") + label.yc.setBorder(width: 0, color: .hexString("#121212"), radius: 8) + } + } + } + + override func setupViews() { + addSubviews([label]) + label.do { (v) in + v.font = .medium(14) + v.textAlignment = .center + v.backgroundColor = .white + v.textColor = .hexString("#0092E1") + } + } + + override func setupLayout() { + label.snp.makeConstraints { (m) in + m.edges.equalToSuperview() + } + } + } +} diff --git a/ShenYin/ShenYin/UI/Home/RecordDetail/RecordDetailVC.swift b/ShenYin/ShenYin/UI/Home/RecordDetail/RecordDetailVC.swift new file mode 100644 index 0000000..867562c --- /dev/null +++ b/ShenYin/ShenYin/UI/Home/RecordDetail/RecordDetailVC.swift @@ -0,0 +1,116 @@ +// +// RecordDetailVC.swift +// ShenYin +// +// Created by liangshi on 2025/9/5. +// + +import UIKit +import JoyGemAI +import AVFAudio +class RecordDetailVC:BaseVC{ + let timeLabel = UILabel() + let topBar = RecordDetailTopBar() + let toolBar = RecordDetailBar() + let textView = UITextView() + var messageList : [(String,UInt)] = [] + var recordFilePath : String? + + + override func viewDidLoad() { + super.viewDidLoad() + } + override func setupViews() { + navBar.title = "现场录音" + navBar.rightView.setImage(UIImage(named: "help_icon"), for: .normal) + toolBar.delegate = self + topBar.delegate = self + + timeLabel.do { (v) in + v.font = .regular(14) + v.textAlignment = .center + 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) + } + view.addSubviews([timeLabel,topBar,textView,toolBar]) + + } + override func setupLayout() { + timeLabel.snp.makeConstraints { make in + make.width.centerX.equalToSuperview() + make.height.equalTo(36) + make.top.equalToSuperview().inset(kNavBtm ) + } + topBar.snp.makeConstraints { make in + make.width.centerX.equalToSuperview() + make.height.equalTo(36) + make.top.equalTo(timeLabel.snp.bottom).offset(5) + } + 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) + } + } + 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 { + print(error) + } + } + override func navRightViewTapped() { + + } + func scrollToBottom(){ + + } +} +extension RecordDetailVC:RecordDetailTopBarDelegate{ + func recordDetailBarTranstlateAction(_ bar: RecordDetailTopBar) { + + } + + func recordDetailTopBarOgrinAction(_ bar: RecordDetailTopBar) { + + } +} +extension RecordDetailVC:RecordDetailBarDelegate{ + func recordDetailBarTranstlateAction(_ bar: RecordDetailBar) { + + } + + func recordDetailBarRenameAction(_ bar: RecordDetailBar) { + + } + + func recordDetailBarPlayAction(_ bar: RecordDetailBar) { + + } + + func recordDetailBarMoreAction(_ bar: RecordDetailBar) { + + } +} + +extension RecordDetailVC : PcmSoundDelegate { + + func remaining(_ frames: UInt) { + Logger.debug("[frame:\(frames)]"); + } +} diff --git a/ShenYin/ShenYin/UI/Home/RecordTranslateVC.swift b/ShenYin/ShenYin/UI/Home/RecordTranslateVC.swift index 1d0e619..52b2cc2 100644 --- a/ShenYin/ShenYin/UI/Home/RecordTranslateVC.swift +++ b/ShenYin/ShenYin/UI/Home/RecordTranslateVC.swift @@ -16,7 +16,7 @@ class RecordTranslateVC:BaseVC{ super.viewDidLoad() } override func setupViews() { - navBar.title = "同声传译" + navBar.title = "同传听译" navBar.rightView.setImage(UIImage(named: "help_icon"), for: .normal) @@ -43,7 +43,8 @@ class RecordTranslateVC:BaseVC{ } } override func navRightViewTapped() { - + let tip = RecordTipsView(type: .tongchuan) + tip.show() } func scrollToBottom(){ if dataList.count > 0 { diff --git a/ShenYin/ShenYin/UI/Home/Root/HomeFunctionView.swift b/ShenYin/ShenYin/UI/Home/Root/HomeFunctionView.swift index dde9a4a..69513b0 100644 --- a/ShenYin/ShenYin/UI/Home/Root/HomeFunctionView.swift +++ b/ShenYin/ShenYin/UI/Home/Root/HomeFunctionView.swift @@ -25,7 +25,7 @@ public enum HomeCellType: Int { case .chinese2English: return "中英互译" case .recordTranslate: - return "同声传译" + return "同传听译" case .dialogTranslate: return "对话翻译" case .textTranslate: diff --git a/ShenYin/ShenYin/UI/Home/textTranslateVC/TextTranslateVC.swift b/ShenYin/ShenYin/UI/Home/textTranslateVC/TextTranslateVC.swift index 0ff7faa..e478c32 100644 --- a/ShenYin/ShenYin/UI/Home/textTranslateVC/TextTranslateVC.swift +++ b/ShenYin/ShenYin/UI/Home/textTranslateVC/TextTranslateVC.swift @@ -17,9 +17,8 @@ class TextTranlateVC:BaseVC{ } override func setupViews() { self.navBar.title = "文本翻译" - navBar.rightView.setImage(UIImage(named: "help_icon"), for: .normal) - + tableView.keyboardDismissMode = .onDrag tableView.backgroundColor = .clear tableView.delegate = self tableView.dataSource = self @@ -48,9 +47,6 @@ class TextTranlateVC:BaseVC{ make.left.right.equalToSuperview() make.bottom.equalTo(toolBar.snp.top) } - } - override func navRightViewTapped() { - } func scrollToBottom(){ if dataList.count > 0 { @@ -79,14 +75,15 @@ extension TextTranlateVC:SendToolBarDelegate{ tableView.reloadData() scrollToBottom() - let from = kJoyGemAILocalizationZH - let to = kJoyGemAILocalizationEN + let from = languageItem.leftLabel.language.value + let to = languageItem.rightLabel.language.value JoyGemAIManager.shared().translate(text, from: from, to: to) {[weak self] result, finish in guard let self = self else{return} if !finish{ dataList.last!.response = dataList.last!.response + result tableView.reloadData() + scrollToBottom() } } error: { error in diff --git a/ShenYin/ShenYin/UI/Mode/CustomEqVC.swift b/ShenYin/ShenYin/UI/Mode/CustomEqVC.swift new file mode 100644 index 0000000..184680f --- /dev/null +++ b/ShenYin/ShenYin/UI/Mode/CustomEqVC.swift @@ -0,0 +1,240 @@ +// +// CustomEqVC.swift +// ShenYin +// +// Created by liangshi on 2025/9/9. +// + +import UIKit +import JoyGemAI +import MultiSlider +class CustomEqVC:BaseVC{ + private let bgView = UIView() + private let sliderBgView = UIView() + private let resetBtn = UIButton(type: .custom) + private let titleLabel = UILabel() + private let unitLabel = UILabel() + private let valueLabel1 = UILabel() + private let valueLabel2 = UILabel() + private let valueLabel3 = UILabel() + private var list:[EqSlider] = [] + + override func viewDidLoad() { + super.viewDidLoad() + } + + override func setupViews() { + self.navBar.title = "自定义音效" + navBar.backgroundColor = .white + view.addSubview(bgView) + bgView.addSubviews([sliderBgView]) + bgView.addSubviews([resetBtn,titleLabel,unitLabel,valueLabel1,valueLabel2,valueLabel3]) + + bgView.do { v in + v.backgroundColor = .white + v.yc.setCornerRadius(12) + } + sliderBgView.do { v in +// v.backgroundColor = .yellow + v.transform = CGAffineTransform(rotationAngle: -CGFloat.pi / 2) + } + titleLabel.do { v in + v.text = "音效风格" + v.textColor = .hexString("#121212") + v.textAlignment = .left + v.font = .regular(14) + } + unitLabel.do { v in + v.text = "dp" + v.textColor = .hexString("#999999") + v.textAlignment = .left + v.font = .regular(12) + } + valueLabel1.do { v in + v.text = "+12" + v.textColor = .hexString("#999999") + v.textAlignment = .left + v.font = .regular(12) + } + valueLabel2.do { v in + v.text = "0" + v.textColor = .hexString("#999999") + v.textAlignment = .left + v.font = .regular(12) + } + valueLabel3.do { v in + v.text = "-12" + v.textColor = .hexString("#999999") + v.textAlignment = .left + v.font = .regular(12) + } + resetBtn.do { v in + v.contentMode = .center + v.setImage(UIImage(named: "mode_reset"), for: .normal) + v.addTarget(self, action: #selector(resetAction), for: .touchUpInside) + } + } + override func setupLayout() { + + bgView.snp.makeConstraints { make in + make.width.equalTo(kScreenWid - 36) + make.height.equalTo(330) + make.centerX.equalToSuperview() + make.top.equalToSuperview().inset(kNavBtm + 30) + } + resetBtn.snp.makeConstraints { make in + make.top.equalToSuperview() + make.right.equalToSuperview() + make.size.equalTo(40) + } + titleLabel.snp.makeConstraints { make in + make.top.equalToSuperview().inset(12) + make.left.equalToSuperview().inset(12) + } + unitLabel.snp.makeConstraints { make in + make.top.equalToSuperview().inset(65) + make.left.equalToSuperview().inset(12) + } + valueLabel1.snp.makeConstraints { make in + make.top.equalToSuperview().inset(100) + make.left.equalToSuperview().inset(10) + } + valueLabel2.snp.makeConstraints { make in + make.top.equalToSuperview().inset(190) + make.left.equalTo(valueLabel1) + } + valueLabel3.snp.makeConstraints { make in + make.top.equalToSuperview().inset(280) + make.left.equalTo(valueLabel1) + } + sliderBgView.snp.makeConstraints { make in + make.left.equalToSuperview().inset(0) + make.right.equalToSuperview().inset(10) + make.top.equalToSuperview().inset(0) + make.bottom.equalToSuperview().inset(0) + } + + let values = ["32","64","125","250","500","1k","2k","4k","8k","16k"] + let start = 30 + let w = (Int(kScreenWid) - 36 - start)/10 + for i in 0...9 { + let slider = EqSlider() + slider.index = i + slider.valueChange = { [weak self] (index,value) in + self?.sliderValueChange(index: index, value: value) + } + slider.titleLabel.text = values[i] + sliderBgView.addSubview(slider) + list.append(slider) + slider.snp.makeConstraints { make in + make.width.equalTo(300) + make.height.equalTo(30) + make.top.equalTo(i*w + start) + make.left.equalToSuperview() + } + } + } + + override func setupData() { + JoyGemAIManager.shared().device.getCustomEQ {[weak self] eq in + Logger.debug("getCustomEQ:\(eq)"); + self?.resetSlider(eq.bands) + } error: { err in + Logger.debug("getCustomEQ:\(err)"); + } + } + + @objc func resetAction(){ + for item in list { + item.slider.setValue(0, animated: false) + } + JoyGemAIManager.shared().device.resetCustomEQ { err in + Logger.debug("setEQMode:\(err)"); + } + } + @objc func sliderValueChange(index:Int,value:Int){ + JoyGemAIManager.shared().device.setCustomEQ(UInt(index), withGain: value) { err in + debugPrint("setCustomEQ:\(err)"); + } + } + func resetSlider(_ eqs:[NSNumber]){ + for i in 0..Void)? + + var index:Int = 0 + var value:Int = 0{ + didSet{ + slider.value = Float(value) + valueLabel.text = "\(value)" + } + } + + override func setupViews() { +// backgroundColor = .green + slider.do { v in +// v.backgroundColor = .red + v.minimumValue = -12 + v.maximumValue = 12 + v.value = 0 + v.minimumTrackTintColor = .hexString("#0092E1") + v.setThumbImage(UIImage(named: "slider_icon"), for: .normal) + v.addTarget(self, action: #selector(sliderChanged(_:)), for: .valueChanged) // continuous changes + + } + titleLabel.do { v in + v.textColor = .hexString("#999999") + v.textAlignment = .center + v.font = .regular(12) + v.transform = CGAffineTransform(rotationAngle: CGFloat.pi / 2) + } + valueLabel.do { v in + v.text = "0" + v.textColor = .hexString("#999999") + v.textAlignment = .center + v.font = .regular(12) + v.transform = CGAffineTransform(rotationAngle: CGFloat.pi / 2) + } + + addSubviews([titleLabel,slider,valueLabel]) + } + + override func setupLayout() { + slider.snp.makeConstraints { make in + make.width.equalTo(200) + make.height.equalTo(30) + make.centerY.equalToSuperview() + make.left.equalToSuperview().inset(40) + } + titleLabel.snp.makeConstraints { make in + make.centerY.equalToSuperview() + make.left.equalToSuperview() + make.width.equalTo(50) + } + valueLabel.snp.makeConstraints { make in + make.centerY.equalToSuperview() + make.right.equalToSuperview().inset(10) + make.width.equalTo(50) + } + } + @objc func sliderChanged(_ slider:UISlider){ + let value = "\(Int(slider.value))" + Logger.debug(slider.value) + if let text = valueLabel.text, text != value { + valueLabel.text = value + valueChange?(index,Int(slider.value)) + } + } +} + + + + diff --git a/ShenYin/ShenYin/UI/Mode/File.swift b/ShenYin/ShenYin/UI/Mode/File.swift new file mode 100644 index 0000000..97b11b6 --- /dev/null +++ b/ShenYin/ShenYin/UI/Mode/File.swift @@ -0,0 +1,9 @@ +// +// File.swift +// ShenYin +// +// Created by liangshi on 2025/9/9. +// + + + diff --git a/ShenYin/ShenYin/UI/Mode/FindVC.swift b/ShenYin/ShenYin/UI/Mode/FindVC.swift new file mode 100644 index 0000000..5159316 --- /dev/null +++ b/ShenYin/ShenYin/UI/Mode/FindVC.swift @@ -0,0 +1,237 @@ +//// +//// FindVC.swift +//// ShenYin +//// +//// Created by liangshi on 2025/9/9. +//// +// + +import UIKit +import JoyGemAI +import DGActivityIndicatorView + +class FindVC:BaseVC{ + private let titleLabel = UILabel() + private let desLabel = UILabel() + private let leftRadar = RadarView() + private let rightRadar = RadarView() + private let leftBtn = ButtonItem() + private let rightBtn = ButtonItem() + + override func viewDidLoad() { + super.viewDidLoad() + + } + + override func setupViews() { + self.navBar.title = "查找耳机" + navBar.backgroundColor = .white + view.backgroundColor = .color(.bgColor) + view.addSubviews([titleLabel,desLabel,leftRadar,rightRadar,leftBtn,rightBtn]) + + leftRadar.do { v in + v.start = false + v.value = "L" + } + rightRadar.do { v in + v.start = false + v.value = "R" + } + titleLabel.do { v in + v.text = "Deep Gen2 Max" + v.font = .regular(20) + v.textColor = .hexString("#121212") + + } + desLabel.do { v in + v.text = "耳机在附近,可通过响铃进行查找。" + v.font = .regular(14) + v.textColor = .hexString("#666666") + + } + leftBtn.do { v in + v.titleLabel.text = "左耳机响铃" + v.valueLabel.text = "L" + v.selected = false + v.yc.addTap(target: self, action: #selector(leftAction)) + } + rightBtn.do { v in + v.titleLabel.text = "右耳机响铃" + v.valueLabel.text = "R" + v.selected = false + v.yc.addTap(target: self, action: #selector(rightAction)) + } + } + override func setupLayout() { + titleLabel.snp.makeConstraints { make in + make.bottom.equalToSuperview().inset(184) + make.centerX.equalToSuperview() + } + desLabel.snp.makeConstraints { make in + make.bottom.equalToSuperview().inset(147) + make.centerX.equalToSuperview() + } + leftRadar.snp.makeConstraints { make in + make.centerY.equalToSuperview().offset(-80) + make.left.equalToSuperview().inset(60) + make.size.equalTo(100) + } + rightRadar.snp.makeConstraints { make in + make.centerY.equalTo(leftRadar) + make.right.equalToSuperview().inset(60) + make.size.equalTo(100) + } + leftBtn.snp.makeConstraints { make in + make.width.equalTo(160) + make.height.equalTo(46) + make.bottom.equalToSuperview().inset(81) + make.left.equalToSuperview().inset(18) + } + rightBtn.snp.makeConstraints { make in + make.width.equalTo(160) + make.height.equalTo(46) + make.bottom.equalToSuperview().inset(81) + make.right.equalToSuperview().inset(18) + } + } + override func setupData() { + + } + @objc func leftAction(){ + leftBtn.selected = !leftBtn.selected + if leftBtn.selected { + CustomAlert.showWith(title: "音量警告", messgage: "为保护听力,请勿在佩戴耳机时使用此功能。", cancel: "取消", cancelCallback: {[weak self] in + self?.leftBtn.selected = false + } ,okCallback: { [weak self] in + self?.leftRadar.start = true + self?.findAction() + }) + } + else{ + leftRadar.start = false + findAction() + } + } + @objc func rightAction(){ + rightBtn.selected = !rightBtn.selected + if rightBtn.selected { + CustomAlert.showWith(title: "音量警告", messgage: "为保护听力,请勿在佩戴耳机时使用此功能。", cancel: "取消", cancelCallback: {[weak self] in + self?.rightBtn.selected = false + } ,okCallback: { [weak self] in + self?.rightRadar.start = true + self?.findAction() + }) + } + else{ + rightRadar.start = false + findAction() + } + } + func findAction(){ + var mode:JoyGemFindHeadphoneMode = .cancel + if leftRadar.start && rightRadar.start{ + mode = .all + } + else if leftRadar.start{ + mode = .left + } + else if rightRadar.start{ + mode = .right + } + + JoyGemAIManager.shared().device.findHeadphone(mode) { err in + Logger.debug("findHeadphone:\(err)"); + } + } +} + +fileprivate class ButtonItem: BaseView { + let valueLabel = UILabel() + let titleLabel = UILabel() + var selected:Bool = false{ + didSet{ + if selected{ + backgroundColor = .hexString("#0092E1") + titleLabel.textColor = .white + valueLabel.backgroundColor = .white + valueLabel.textColor = backgroundColor + } + else{ + backgroundColor = .white + titleLabel.textColor = .hexString("#121212") + valueLabel.backgroundColor = .hexString("#0092E1") + valueLabel.textColor = .white + } + } + } + + override func setupViews() { + addSubviews([titleLabel,valueLabel]) + yc.setCornerRadius(12) + titleLabel.do { v in + v.font = .regular(14) + } + valueLabel.do { v in + v.font = .regular(14) + v.yc.setCornerRadius(9) + v.textAlignment = .center + } + } + + override func setupLayout() { + titleLabel.snp.makeConstraints { make in + make.left.equalToSuperview().inset(14) + make.centerY.equalToSuperview() + } + valueLabel.snp.makeConstraints { make in + make.size.equalTo(18) + make.right.equalToSuperview().inset(14) + make.centerY.equalToSuperview() + } + } +} + +fileprivate class RadarView: BaseView { + private let rippleView = DGActivityIndicatorView(type: .triplePulse,tintColor: UIColor.hexString("#0092E1"),size: 100)! + private var valueLabel = UILabel() + override func setupViews() { + yc.setCornerRadius(50) + addSubviews([rippleView,valueLabel]) + + valueLabel.do { v in + v.font = .regular(18) + v.yc.setCornerRadius(15) + v.textAlignment = .center + v.backgroundColor = UIColor.hexString("#0092E1") + v.textColor = .white + } + } + override func setupLayout() { + valueLabel.snp.makeConstraints { make in + make.width.equalTo(30) + make.height.equalTo(30) + make.center.equalToSuperview() + } + rippleView.snp.makeConstraints { make in + make.size.equalTo(100) + make.center.equalToSuperview() + } + } + var value:String = ""{ + didSet{ + valueLabel.text = value + } + } + var start:Bool = false{ + didSet{ + if start { + rippleView.startAnimating() + backgroundColor = .clear + } + else{ + rippleView.stopAnimating() + backgroundColor = UIColor.hexString("#0092E1").withAlphaComponent(0.1) + } + } + } +} diff --git a/ShenYin/ShenYin/UI/Mode/ModeEffectsView.swift b/ShenYin/ShenYin/UI/Mode/ModeEffectsView.swift index 1720e1d..f75f486 100644 --- a/ShenYin/ShenYin/UI/Mode/ModeEffectsView.swift +++ b/ShenYin/ShenYin/UI/Mode/ModeEffectsView.swift @@ -5,6 +5,9 @@ // Created by liangshi on 2025/8/12. // +import UIKit +import JoyGemAI + enum ModeEffectsType:Int{ case normal case fashion @@ -45,16 +48,50 @@ enum ModeEffectsType:Int{ return "mode_custom" } } + var value:JoyGemEQMode{ + switch self { + case .normal: + return .normal + case .fashion: + return .pop + case .classic: + return .classic + case .rock: + return .rock + case .jazz: + return .jazz + case .custom: + return .custom + } + } + + static var all:[ModeEffectsType]{ + return [.normal,.fashion,.classic,.rock,.jazz,.custom] + } } class ModeEffectsView: BaseView { let titleLabel = UILabel() - var list:[ModeEffectsType] = [.normal,.fashion,.classic,.rock,.jazz,.custom] + var list:[ModeEffectsType] = ModeEffectsType.all var itemViews = [ItemView]() + var selectedMode:((_ mode:JoyGemEQMode)->Void)? + + var mode:JoyGemEQMode = .normal{ + didSet{ + for item in itemViews { + if mode == item.type.value { + item.isSelected = true + } + else{ + item.isSelected = false + } + } + } + } + override func setupViews() { backgroundColor = .white - yc.setCornerRadius(12) addSubviews([titleLabel]) @@ -71,7 +108,9 @@ class ModeEffectsView: BaseView { var y = 47.0 for (index, value) in list.enumerated() { let view = ItemView() + view.yc.addTap(target: self, action: #selector(tapAction)) addSubview(view) + itemViews.append(view) view.type = value x = Double(index%2)*w + Double(index%2 + 1)*13 @@ -83,7 +122,7 @@ class ModeEffectsView: BaseView { make.left.equalToSuperview().inset(x) make.top.equalToSuperview().inset(y) if index == list.count - 1 { - make.bottom.equalToSuperview() + make.bottom.equalToSuperview().inset(14) } } } @@ -97,12 +136,21 @@ class ModeEffectsView: BaseView { @objc func tapAction(_ tap:UITapGestureRecognizer){ let view = tap.view as! ItemView - + for item in itemViews { + if view == item { + view.isSelected = true + } + else{ + item.isSelected = false + } + } + selectedMode?(view.type.value) } class ItemView: BaseView { let icon = UIImageView() let titleLabel = UILabel() + let selectedIcon = UIImageView() var type = ModeEffectsType.fashion{ didSet{ titleLabel.text = type.title @@ -110,9 +158,14 @@ class ModeEffectsView: BaseView { } } + var isSelected:Bool = false{ + didSet{ + selectedIcon.isHidden = !isSelected + } + } override func setupViews() { - addSubviews([icon,titleLabel]) + addSubviews([icon,titleLabel,selectedIcon]) icon.do { v in v.yc.setCornerRadius(8) } @@ -120,6 +173,8 @@ class ModeEffectsView: BaseView { v.textColor = .white v.font = .regular(14) } + selectedIcon.image = UIImage(named: "mode_selected") + selectedIcon.isHidden = true } override func setupLayout() { @@ -129,6 +184,10 @@ class ModeEffectsView: BaseView { titleLabel.snp.makeConstraints { make in make.center.equalToSuperview() } + selectedIcon.snp.makeConstraints { make in + make.size.equalTo(20) + make.right.top.equalToSuperview().inset(6) + } } } diff --git a/ShenYin/ShenYin/UI/Mode/ModeFindView.swift b/ShenYin/ShenYin/UI/Mode/ModeFindView.swift index 2b538e1..0bd71ed 100644 --- a/ShenYin/ShenYin/UI/Mode/ModeFindView.swift +++ b/ShenYin/ShenYin/UI/Mode/ModeFindView.swift @@ -7,115 +7,32 @@ -enum ModeFindType:Int{ - case left - case right - - var title:String{ - switch self { - case .left: - return "L" - case .right: - return "R" - } - } -} - class ModeFindView: BaseView { + let icon = UIImageView() let titleLabel = UILabel() - var list:[ModeFindType] = [.left,.right] - var itemViews = [ItemView]() - + override func setupViews() { backgroundColor = .white - yc.setCornerRadius(12) + addSubviews([icon,titleLabel]) - addSubviews([titleLabel]) - titleLabel.do { (v) in - v.textColor = .rgb(0x121212) - v.font = .bold(14) + icon.image = UIImage(named: "find_icon") + titleLabel.do { v in v.text = "查找耳机" - } - - let w = 66.0 - let h = 66 - let y = 38 - for (index, value) in list.enumerated() { - let view = ItemView() - view.yc.setCornerRadius(w/2) - addSubview(view) - itemViews.append(view) - view.yc.addTap(target: self, action: #selector(tapAction)) + v.font = .bold(16) + v.textColor = .hexString("#121212") - view.type = value - view.snp.makeConstraints { make in - make.width.equalTo(w) - make.height.equalTo(h) - make.top.equalToSuperview().inset(y) - if index == list.count - 1 { - make.right.equalToSuperview().inset(68) - } - else if( index == 0){ - view.isSelected = true - make.left.equalToSuperview().inset(68) - } - else{ - make.centerX.equalToSuperview() - } - } } } - override func setupLayout() { - titleLabel.snp.makeConstraints { make in - make.top.left.equalToSuperview().inset(14) + icon.snp.makeConstraints { make in + make.size.equalTo(26) + make.centerY.equalToSuperview() + make.left.equalToSuperview().inset(14) } - } - - @objc func tapAction(_ tap:UITapGestureRecognizer){ - let view = tap.view as! ItemView - } - - class ItemView: BaseView { - let icon = UIImageView() - let titleLabel = UILabel() - var type = ModeFindType.left{ - didSet{ - titleLabel.text = type.title - } - } - var isSelected:Bool = false{ - didSet{ - if isSelected { - titleLabel.textColor = .color(.theme) - } - else{ - titleLabel.textColor = .rgb(0x666666) - } - } - } - - override func setupViews() { - addSubviews([icon,titleLabel]) - icon.do { v in - v.backgroundColor = .gray - v.yc.setCornerRadius(8) - } - titleLabel.do { (v) in - v.textColor = .color(.theme) - v.font = .regular(12) - } - } - - override func setupLayout() { - icon.snp.makeConstraints { make in - make.edges.equalToSuperview() - } - titleLabel.snp.makeConstraints { make in - make.center.equalToSuperview() - } + titleLabel.snp.makeConstraints { make in + make.centerY.equalToSuperview() + make.left.equalTo(icon.snp.right).offset(10) } } - } diff --git a/ShenYin/ShenYin/UI/Mode/ModeVC.swift b/ShenYin/ShenYin/UI/Mode/ModeVC.swift index aefd216..e169aba 100644 --- a/ShenYin/ShenYin/UI/Mode/ModeVC.swift +++ b/ShenYin/ShenYin/UI/Mode/ModeVC.swift @@ -5,7 +5,7 @@ // Created by liangshi on 2025/8/5. // import UIKit - +import JoyGemAI class ModeVC:BaseVC{ let bgView = UIScrollView() let headerView = CurrentDeviceView() @@ -21,15 +21,24 @@ class ModeVC:BaseVC{ override func setupViews() { self.navBar.title = "模式" navBar.backgroundColor = .white - view.backgroundColor = .color(.bgColor) - navBar.rightView.setImage(UIImage(named: "add_icon"), for: .normal) +// navBar.rightView.setImage(UIImage(named: "add_icon"), for: .normal) + view.addSubview(bgView) bgView.addSubviews([headerView,controlView,effectsView,findView]) + +// bgView.backgroundColor = .red + effectsView.do { v in + v.selectedMode = {[weak self] mode in + self?.selectedModeAction(mode) + } + } + findView.yc.addTap(target: self, action: #selector(findAction)) } override func setupLayout() { bgView.snp.makeConstraints { make in make.top.equalTo(kNavBtm) - make.left.right.bottom.equalToSuperview() + make.left.right.equalToSuperview() + make.height.equalTo(kScreenHei - kNavBtm - kTabbarHei) } headerView.snp.makeConstraints { make in make.top.equalToSuperview() @@ -44,20 +53,41 @@ class ModeVC:BaseVC{ } effectsView.snp.makeConstraints { make in make.top.equalTo(controlView.snp.bottom).offset(10) - make.centerX.equalToSuperview() - make.width.equalTo(controlView) + make.left.width.equalTo(controlView) + make.height.equalTo(325) } findView.snp.makeConstraints { make in make.top.equalTo(effectsView.snp.bottom).offset(10) - make.centerX.equalToSuperview() - make.width.equalTo(effectsView) - make.height.equalTo(115) + make.left.width.equalTo(effectsView) + make.height.equalTo(62) make.bottom.equalToSuperview().inset(20) } } + override func setupData() { + JoyGemAIManager.shared().device.getEQMode {[weak self] mode in + guard let self = self else{return} + effectsView.mode = mode + } error: { err in + Logger.debug("getEQMode:\(err)"); + } + } override func navRightViewTapped() { } } +extension ModeVC{ + func selectedModeAction(_ mode:JoyGemEQMode){ + JoyGemAIManager.shared().device.setEQMode(mode) { err in + Logger.debug("setEQMode:\(err)"); + } + if mode == .custom { + App.shared.goToPage(CustomEqVC()) + } + } + @objc func findAction(){ + App.shared.goToPage(FindVC()) + } +} + diff --git a/ShenYin/ShenYin/UI/Scan/BleScanVC.swift b/ShenYin/ShenYin/UI/Scan/BleScanVC.swift index a7b3c7d..37dc8ea 100644 --- a/ShenYin/ShenYin/UI/Scan/BleScanVC.swift +++ b/ShenYin/ShenYin/UI/Scan/BleScanVC.swift @@ -113,7 +113,7 @@ class BleScanCell: BaseTableViewCell { var model:CBPeripheral!{ didSet{ titleLabel.text = model.name - titleLabel.text = titleLabel.text! + "\n" + model.identifier.uuidString +// titleLabel.text = titleLabel.text! + "\n" + model.identifier.uuidString titleLabel.adjustsFontSizeToFitWidth = true } } diff --git a/ShenYin/ShenYin/UI/common/AiSupportLanguage.swift b/ShenYin/ShenYin/UI/common/AiSupportLanguage.swift new file mode 100644 index 0000000..4796cf6 --- /dev/null +++ b/ShenYin/ShenYin/UI/common/AiSupportLanguage.swift @@ -0,0 +1,92 @@ +// +// GlobalConfig.swift +// ShenYin +// +// Created by liangshi on 2025/8/27. +// + +import Foundation +import JoyGemAI + +enum AiSupportLanguage{ + case chinse + case english + case japanese + case korean + case french + case spanish + case portuguese + case indonesian + case russian + case malay + + /// 现场录音,通话录音,同声传译 + static var record:[AiSupportLanguage]{ + return [.chinse,.english,.japanese,.korean] + } + static var chinse2english:[AiSupportLanguage]{ + return [.chinse,.english] + } + static var dialog:[AiSupportLanguage]{ + return [.chinse,.english,.japanese] + } + static var translate:[AiSupportLanguage]{ + return [.chinse,.english,.japanese,.korean,.french,.spanish,.portuguese,.indonesian,.russian,.malay] + } + var title:String{ + switch self { + case .chinse: + return "中文" + case .english: + return "英文" + case .japanese: + return "日文" + case .korean: + return "韩文" + case .french: + return "法语" + case .spanish: + return "西班牙文" + case .portuguese: + return "葡萄牙文" + case .indonesian: + return "印度尼西亚文" + case .russian: + return "俄文" + case .malay: + return "马来文" + } + } + var value:String{ + switch self { + case .chinse: + return kJoyGemAILocalizationZH + case .english: + return kJoyGemAILocalizationEN + case .japanese: + return kJoyGemAILocalizationJA + case .korean: + return kJoyGemAILocalizationKO + case .french: + return kJoyGemAILocalizationFR + case .spanish: + return kJoyGemAILocalizationES + case .portuguese: + return kJoyGemAILocalizationPT + case .indonesian: + return kJoyGemAILocalizationID + case .russian: + return kJoyGemAILocalizationRU + case .malay: + return kJoyGemAILocalizationMS + } + } + +} +//现场录音 中,英,日,韩 +//通话录音 中,英,日,韩 +//双耳互译 中英 +//同声传译 中,英,日,韩 +//面对面翻译 中,英,日 +//文本翻译 中、英、日、韩、法、西班牙、葡萄牙、印度尼西亚、俄文、马来文 + diff --git a/ShenYin/ShenYin/UI/Base/AppManager.swift b/ShenYin/ShenYin/UI/common/AppManager.swift similarity index 100% rename from ShenYin/ShenYin/UI/Base/AppManager.swift rename to ShenYin/ShenYin/UI/common/AppManager.swift diff --git a/ShenYin/ShenYin/UI/common/CustomAlert.swift b/ShenYin/ShenYin/UI/common/CustomAlert.swift new file mode 100644 index 0000000..6054d7e --- /dev/null +++ b/ShenYin/ShenYin/UI/common/CustomAlert.swift @@ -0,0 +1,24 @@ +// +// CustomAlert.swift +// ShenYin +// +// Created by liangshi on 2025/9/9. +// + + +class CustomAlert { + + static func showWith(title:String,messgage:String,cancel:String = "取消",ok:String = "确定",cancelCallback: (()->Void)?,okCallback: (()->Void)?){ + let vc = UIAlertController(title: "音量警告", message: "为保护听力,请勿在佩戴耳机时使用此功能。", preferredStyle: .alert) + let action0 = UIAlertAction(title: "取消", style: .cancel) { action in + cancelCallback?() + } + let action1 = UIAlertAction(title: "播放", style: .default) { action in + okCallback?() + } + vc.addAction(action0) + vc.addAction(action1) + App.shared.topVC()?.present(vc, animated: true) + } + +} diff --git a/ShenYin/ShenYin/UI/Base/LogVC.swift b/ShenYin/ShenYin/UI/common/LogVC.swift similarity index 100% rename from ShenYin/ShenYin/UI/Base/LogVC.swift rename to ShenYin/ShenYin/UI/common/LogVC.swift diff --git a/ShenYin/ShenYin/UI/common/RecordTranslateTipsView.swift b/ShenYin/ShenYin/UI/common/RecordTranslateTipsView.swift deleted file mode 100644 index 74fe6f8..0000000 --- a/ShenYin/ShenYin/UI/common/RecordTranslateTipsView.swift +++ /dev/null @@ -1,76 +0,0 @@ -// -// Untitled.swift -// ShenYin -// -// Created by liangshi on 2025/8/14. -// - -import UIKit -class RecordTranslateTipsView: BasePresentView { - let titleLabel = UILabel() - let btn = UIButton(type: .custom) - let tipsIcon = UIImageView() - let desLabel1 = UILabel() - let desLabel2 = UILabel() - let actionbtn = UIButton(type: .custom) - var didSelected: ((Int,String)->Void)? - - init() { - let h = 595.0 - super.init(contentHeight:h) - } - - required init?(coder: NSCoder) { - fatalError("init(coder:) has not been implemented") - } - - override func setupSubView() { - super.setupSubView() - contentView.addSubviews([titleLabel,btn,tipsIcon,desLabel1,desLabel2,actionbtn]) - } - override func setupLayout() { - super.setupLayout() - titleLabel.snp.makeConstraints { (m) in - m.top.equalToSuperview() - m.left.right.equalToSuperview().inset(60) - m.height.equalTo(50) - } - btn.snp.makeConstraints { (m) in - m.centerY.equalTo(titleLabel) - m.right.equalToSuperview() - m.size.equalTo(60) - } - tipsIcon.snp.makeConstraints { make in - make.left.right.equalTo(18) - make.top.equalToSuperview().inset(64) - make.height.equalTo(234) - } - titleLabel.snp.makeConstraints { (m) in - m.top.equalToSuperview() - m.left.right.equalToSuperview().inset(60) - m.height.equalTo(50) - } - } - - override func setupStyle() { - super.setupStyle() - contentView.backgroundColor = .white - titleLabel.do { (v) in - v.textColor = .rgb(0x333333) - v.font = .semiBold(16) - v.textAlignment = .center - v.text = "同传听译模式使用介绍" - } - btn.do { v in - v.setImage(UIImage(named: "close_icon"), for: .normal) - v.addTarget(self, action: #selector(closeAction), for: .touchUpInside) - } - tipsIcon.do { v in - v.image = UIImage(named: "") - } - - } - @objc func closeAction(){ - hide() - } -} diff --git a/ShenYin/ShenYin/UI/Base/YLprogressHUD.swift b/ShenYin/ShenYin/UI/common/YLprogressHUD.swift similarity index 100% rename from ShenYin/ShenYin/UI/Base/YLprogressHUD.swift rename to ShenYin/ShenYin/UI/common/YLprogressHUD.swift diff --git a/ShenYin/ShenYin/UI/common/AgreeMentPopView.swift b/ShenYin/ShenYin/UI/common/pop/AgreeMentPopView.swift similarity index 100% rename from ShenYin/ShenYin/UI/common/AgreeMentPopView.swift rename to ShenYin/ShenYin/UI/common/pop/AgreeMentPopView.swift diff --git a/ShenYin/ShenYin/UI/common/CustomPicker.swift b/ShenYin/ShenYin/UI/common/pop/CustomPicker.swift similarity index 100% rename from ShenYin/ShenYin/UI/common/CustomPicker.swift rename to ShenYin/ShenYin/UI/common/pop/CustomPicker.swift diff --git a/ShenYin/ShenYin/UI/Home/textTranslateVC/LanguagePicker/LanguagePickerTitle.swift b/ShenYin/ShenYin/UI/common/pop/LanguagePicker/LanguagePickerTitle.swift similarity index 83% rename from ShenYin/ShenYin/UI/Home/textTranslateVC/LanguagePicker/LanguagePickerTitle.swift rename to ShenYin/ShenYin/UI/common/pop/LanguagePicker/LanguagePickerTitle.swift index 4cee923..c2a2dc9 100644 --- a/ShenYin/ShenYin/UI/Home/textTranslateVC/LanguagePicker/LanguagePickerTitle.swift +++ b/ShenYin/ShenYin/UI/common/pop/LanguagePicker/LanguagePickerTitle.swift @@ -11,6 +11,14 @@ class LanguagePickerTitle: BaseView { let leftLabel = LanguageItem() let rightLabel = LanguageItem() let switcIcon = UIImageView() + var valueChange:(()->Void)? + + var currentLanguage:AiSupportLanguage{ + if isRight { + return rightLabel.language + } + return leftLabel.language + } var isRight:Bool{ if rightLabel.isSelected{ @@ -38,14 +46,17 @@ class LanguagePickerTitle: BaseView { switcIcon.do { v in v.image = UIImage(named: "language_switch_gray") v.contentMode = .center + v.yc.addTap(target: self, action: #selector(swictAction)) } leftLabel.do { (v) in v.yc.addTap(target: self, action: #selector(leftAction)) v.isSelected = true + v.language = .chinse } rightLabel.do { (v) in v.yc.addTap(target: self, action: #selector(rightAction)) v.isSelected = false + v.language = .english } } @@ -78,17 +89,31 @@ class LanguagePickerTitle: BaseView { make.centerY.equalToSuperview() } } + @objc func swictAction(){ + let lan1 = leftLabel.language + let lan2 = rightLabel.language + rightLabel.language = lan1 + leftLabel.language = lan2 + valueChange?() + } @objc func leftAction(){ leftLabel.isSelected = true rightLabel.isSelected = false + valueChange?() } @objc func rightAction(){ leftLabel.isSelected = false rightLabel.isSelected = true + valueChange?() } class LanguageItem: BaseView { - let label = UILabel() + private let label = UILabel() + var language:AiSupportLanguage = .chinse{ + didSet{ + label.text = language.title + } + } var isSelected:Bool = false{ didSet{ if isSelected { @@ -106,7 +131,6 @@ class LanguagePickerTitle: BaseView { addSubviews([label]) label.do { (v) in v.font = .medium(14) - v.text = "中文" v.textAlignment = .center v.backgroundColor = .white v.textColor = .hexString("#0092E1") diff --git a/ShenYin/ShenYin/UI/Home/textTranslateVC/LanguagePicker/LanguagePickerView.swift b/ShenYin/ShenYin/UI/common/pop/LanguagePicker/LanguagePickerView.swift similarity index 81% rename from ShenYin/ShenYin/UI/Home/textTranslateVC/LanguagePicker/LanguagePickerView.swift rename to ShenYin/ShenYin/UI/common/pop/LanguagePicker/LanguagePickerView.swift index 1358488..589a3f0 100644 --- a/ShenYin/ShenYin/UI/Home/textTranslateVC/LanguagePicker/LanguagePickerView.swift +++ b/ShenYin/ShenYin/UI/common/pop/LanguagePicker/LanguagePickerView.swift @@ -7,51 +7,55 @@ import UIKit class LanguagePickerView: BasePresentView { - private let titleLabel = LanguagePickerTitle() + private let segView = LanguagePickerTitle() private let btn = UIButton(type: .custom) private let tableView = UITableView(frame: .zero, style: .plain) - var list:[String] = GlobalConfig.tranlateLanguages + var list:[AiSupportLanguage] = [] var selectedIndex = 0{ didSet{ tableView.reloadData() } } - var didSelected: ((Int,String)->Void)? + + + var didSelected: ((Int,AiSupportLanguage)->Void)? private var title:String = "请选择语言" - init(isLeft:Bool = true) { + init(languages:[AiSupportLanguage],isLeft:Bool,left:AiSupportLanguage,right:AiSupportLanguage) { + list = languages + segView.leftLabel.language = left + segView.rightLabel.language = right if isLeft { - titleLabel.leftAction() + segView.leftAction() } else{ - titleLabel.rightAction() + segView.rightAction() } - let h = CGFloat(50 + list.count*52) + kSafeBtm + let h = CGFloat(85 + list.count*52) + kSafeBtm super.init(contentHeight:h) } required init?(coder: NSCoder) { fatalError("init(coder:) has not been implemented") } -// LanguagePickerView(title: "", list: ) override func setupSubView() { super.setupSubView() - contentView.addSubviews([titleLabel,btn,tableView]) + contentView.addSubviews([segView,btn,tableView]) } override func setupLayout() { super.setupLayout() - titleLabel.snp.makeConstraints { (m) in + segView.snp.makeConstraints { (m) in m.top.equalToSuperview() m.left.right.equalToSuperview() } btn.snp.makeConstraints { (m) in - m.centerY.equalTo(titleLabel) + m.centerY.equalTo(segView) m.right.equalToSuperview() m.size.equalTo(60) } tableView.snp.makeConstraints { make in make.left.right.bottom.equalToSuperview() - make.top.equalTo(titleLabel.snp.bottom) + make.top.equalTo(segView.snp.bottom) make.bottom.equalToSuperview() } } @@ -60,6 +64,11 @@ class LanguagePickerView: BasePresentView { super.setupStyle() contentView.backgroundColor = .white + segView.do { v in + v.valueChange = { [weak self] in + self?.selectedBtnChange() + } + } btn.do { v in v.isHidden = true v.setImage(UIImage(named: "close_icon"), for: .normal) @@ -78,6 +87,11 @@ class LanguagePickerView: BasePresentView { @objc func closeAction(){ hide() } + func selectedBtnChange(){ + let language = segView.currentLanguage + selectedIndex = list.firstIndex(where: {$0 == language})! + tableView.reloadData() + } } extension LanguagePickerView:UITableViewDelegate,UITableViewDataSource { func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { @@ -86,14 +100,14 @@ extension LanguagePickerView:UITableViewDelegate,UITableViewDataSource { func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { let cell = LanguagePickerView.SelectCell.cell(withTableView: tableView, indexPath: indexPath) - cell.titleLabel.text = list[indexPath.row] + cell.titleLabel.text = list[indexPath.row].title cell.selectedIcon.isHidden = selectedIndex != indexPath.row return cell } func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) { selectedIndex = indexPath.row tableView.reloadData() - didSelected?(titleLabel.isRight ? 1:0 ,list[selectedIndex]) + didSelected?(segView.isRight ? 1:0 ,list[selectedIndex]) hide() } } diff --git a/ShenYin/ShenYin/UI/Home/textTranslateVC/LanguagePicker/LanguageSelectItem.swift b/ShenYin/ShenYin/UI/common/pop/LanguagePicker/LanguageSelectItem.swift similarity index 73% rename from ShenYin/ShenYin/UI/Home/textTranslateVC/LanguagePicker/LanguageSelectItem.swift rename to ShenYin/ShenYin/UI/common/pop/LanguagePicker/LanguageSelectItem.swift index 25e6f24..7eb87a3 100644 --- a/ShenYin/ShenYin/UI/Home/textTranslateVC/LanguagePicker/LanguageSelectItem.swift +++ b/ShenYin/ShenYin/UI/common/pop/LanguagePicker/LanguageSelectItem.swift @@ -10,7 +10,6 @@ class LanguageSelectItem: BaseView { let leftLabel = LanguageItem() let rightLabel = LanguageItem() let switcIcon = UIImageView() - override func setupViews() { addSubviews([bottonView]) @@ -27,11 +26,11 @@ class LanguageSelectItem: BaseView { v.yc.addTap(target: self, action: #selector(switchAction)) } leftLabel.do { (v) in - v.label.text = "中文" + v.language = AiSupportLanguage.chinse v.yc.addTap(target: self, action: #selector(leftAction)) } rightLabel.do { (v) in - v.label.text = "英文" + v.language = AiSupportLanguage.english v.yc.addTap(target: self, action: #selector(rightAction)) } } @@ -58,42 +57,47 @@ class LanguageSelectItem: BaseView { } } @objc func switchAction(){ - let text1 = leftLabel.label.text - let text2 = rightLabel.label.text - leftLabel.label.text = text2 - rightLabel.label.text = text1 + let text1 = leftLabel.language + let text2 = rightLabel.language + leftLabel.language = text2 + rightLabel.language = text1 } @objc func leftAction(){ - let v = LanguagePickerView(isLeft: true) - v.selectedIndex = v.list.firstIndex(where: {$0 == leftLabel.label.text}) ?? 0 + let v = LanguagePickerView(languages: AiSupportLanguage.translate,isLeft: true,left: leftLabel.language,right: rightLabel.language) + v.selectedIndex = v.list.firstIndex(where: {$0.title == leftLabel.language.title}) ?? 0 v.show() v.didSelected = {[weak self] (index,value) in guard let self = self else { return } if index == 0 { - leftLabel.label.text = value + leftLabel.language = value } else{ - rightLabel.label.text = value + rightLabel.language = value } } } @objc func rightAction(){ - let v = LanguagePickerView(isLeft: false) - v.selectedIndex = v.list.firstIndex(where: {$0 == rightLabel.label.text}) ?? 0 + let v = LanguagePickerView(languages: AiSupportLanguage.translate,isLeft: false,left: leftLabel.language,right: rightLabel.language) + v.selectedIndex = v.list.firstIndex(where: {$0.title == rightLabel.language.title}) ?? 0 v.show() v.didSelected = {[weak self] (index,value) in guard let self = self else { return } if index == 0 { - leftLabel.label.text = value + leftLabel.language = value } else{ - rightLabel.label.text = value + rightLabel.language = value } } } class LanguageItem: BaseView { - let label = UILabel() + private let label = UILabel() + var language:AiSupportLanguage = AiSupportLanguage.chinse{ + didSet{ + label.text = language.title + } + } override func setupViews() { // backgroundColor = .yellow diff --git a/ShenYin/ShenYin/UI/Home/FieldRecording/PopTextField.swift b/ShenYin/ShenYin/UI/common/pop/PopTextField.swift similarity index 98% rename from ShenYin/ShenYin/UI/Home/FieldRecording/PopTextField.swift rename to ShenYin/ShenYin/UI/common/pop/PopTextField.swift index 20fa380..07d9e51 100644 --- a/ShenYin/ShenYin/UI/Home/FieldRecording/PopTextField.swift +++ b/ShenYin/ShenYin/UI/common/pop/PopTextField.swift @@ -80,7 +80,7 @@ class PopTextField: BasePresentView2 { } textFiled.do { v in - v.text = "7月17日 9点23分" + v.text = Date().format(.full2) v.font = .bold(16) v.textColor = .hexString("#121212") } diff --git a/ShenYin/ShenYin/UI/common/pop/RecordTipsView.swift b/ShenYin/ShenYin/UI/common/pop/RecordTipsView.swift new file mode 100644 index 0000000..dbdf37d --- /dev/null +++ b/ShenYin/ShenYin/UI/common/pop/RecordTipsView.swift @@ -0,0 +1,174 @@ +// +// Untitled.swift +// ShenYin +// +// Created by liangshi on 2025/8/14. +// + +import UIKit + + +enum RecordTipsType:Int{ + case dialog + case chinese2english + case tongchuan + + var title:String{ + switch self { + case .dialog: + return "对话模式使用介绍" + case .chinese2english: + return "中英互译模式使用介绍" + case .tongchuan: + return "同传听译模式使用介绍" + } + } + var icon:String{ + switch self { + case .dialog: + return "tips_dialog" + case .chinese2english: + return "tips_chinese2english" + case .tongchuan: + return "tips_tongchuan" + } + } + var des1:String{ + switch self { + case .dialog: + return "靠近手机讲母语,手机外放译文" + case .chinese2english: + return "两人各佩戴一只耳机,选择源语言语种, 双方耳机中播放目标语言" + case .tongchuan: + return "手机靠近音源收音,佩戴耳机收听译文" + } + } + var des2:String{ + switch self { + case .dialog: + return "- 情景示例 -\n张张靠近手机讲中文,手机外放英语" + case .chinese2english: + return "- 情景示例 -\n张张戴一只耳机讲中文,双方耳机播放英文翻译 Lucy切换为英语发言后,双方耳机中播报中文翻译" + case .tongchuan: + return "- 情景示例 -\nLisa对着手机讲英语,小徐耳机中播放中文" + } + } +} + + +class RecordTipsView: BasePresentView { + let titleLabel = UILabel() + let btn = UIButton(type: .custom) + let tipsIcon = UIImageView() + let desLabel1 = UILabel() + let desLabel2 = UILabel() + let actionbtn = UIButton(type: .custom) + var didSelected: ((Int,String)->Void)? + var tipsType:RecordTipsType = .dialog + + init(type:RecordTipsType) { + tipsType = type + let h = 595.0 + super.init(contentHeight:h) + } + + required init?(coder: NSCoder) { + fatalError("init(coder:) has not been implemented") + } + + override func setupSubView() { + super.setupSubView() + contentView.addSubviews([titleLabel,btn,tipsIcon,desLabel1,desLabel2,actionbtn]) + } + override func setupLayout() { + super.setupLayout() + titleLabel.snp.makeConstraints { (m) in + m.top.equalToSuperview() + m.left.right.equalToSuperview().inset(36) + m.height.equalTo(60) + } + btn.snp.makeConstraints { (m) in + m.centerY.equalTo(titleLabel) + m.right.equalToSuperview() + m.size.equalTo(60) + } + tipsIcon.snp.makeConstraints { make in + make.left.right.equalToSuperview().inset(18) + make.top.equalToSuperview().inset(64) + make.height.equalTo(234) + } + desLabel1.snp.makeConstraints { (m) in + m.top.equalTo(tipsIcon.snp.bottom).offset(20) + m.left.right.equalToSuperview().inset(40) + } + desLabel2.snp.makeConstraints { (m) in + m.top.equalTo(desLabel1.snp.bottom).offset(30) + m.left.right.equalToSuperview().inset(30) + } + actionbtn.snp.makeConstraints { (m) in + m.top.equalTo(desLabel2.snp.bottom).offset(40) + m.left.right.equalToSuperview().inset(52) + m.height.equalTo(46) + } + + } + + override func setupStyle() { + super.setupStyle() + contentView.backgroundColor = .white + titleLabel.do { (v) in + v.textColor = .rgb(0x121212) + v.font = .semiBold(16) + v.textAlignment = .center + v.text = tipsType.title + } + btn.do { v in + v.setImage(UIImage(named: "close_icon"), for: .normal) + v.addTarget(self, action: #selector(closeAction), for: .touchUpInside) + } + tipsIcon.do { v in + v.image = UIImage(named: tipsType.icon) + v.backgroundColor = .lightGray + v.yc.setCornerRadius(20) + } + desLabel1.do { v in + let text = tipsType.des1 + let attributedString = NSMutableAttributedString(string: text) + let paragraphStyle = NSMutableParagraphStyle() + paragraphStyle.lineSpacing = 10 + attributedString.addAttribute(NSAttributedString.Key.paragraphStyle, value: paragraphStyle, range: NSRange(location: 0, length: text.count)) + v.attributedText = attributedString + + v.textColor = .rgb(0x121212) + v.font = .semiBold(16) + v.textAlignment = .center + v.numberOfLines = 0 + } + desLabel2.do { v in + let text = tipsType.des2 + let attributedString = NSMutableAttributedString(string: text) + let paragraphStyle = NSMutableParagraphStyle() + paragraphStyle.lineSpacing = 10 + attributedString.addAttribute(NSAttributedString.Key.paragraphStyle, value: paragraphStyle, range: NSRange(location: 0, length: text.count)) + v.attributedText = attributedString + v.textColor = .rgb(0x919191) + v.font = .semiBold(14) + v.textAlignment = .center + v.numberOfLines = 0 + } + actionbtn.do { v in + v.backgroundColor = .hexString("#0092E1") + v.setTitle("开始体验", for: .normal) + v.titleLabel?.font = .regular(14) + v.yc.setCornerRadius(12) + v.setTitleColor(.white, for: .normal) + v.addTarget(self, action: #selector(btnAction), for: .touchUpInside) + } + } + @objc func closeAction(){ + hide() + } + @objc func btnAction(){ + + } +} diff --git a/ShenYin/podfile b/ShenYin/podfile index b4e008a..55c4a07 100644 --- a/ShenYin/podfile +++ b/ShenYin/podfile @@ -32,6 +32,7 @@ target 'ShenYin' do pod 'SocketRocket'#socket,AI用到 pod 'DGActivityIndicatorView'#扫描雷达 + pod 'MultiSlider' # pod 'NVActivityIndicatorView', '~> 5.1.1' # 最新稳定版 # pod 'EZAudio', '~> 1.1.0' end diff --git a/document/JOYGEM_AI_IOS_V1.0.19/JoyGemAIDemo-swift/JoyGemAIDemo/MainViewController.swift b/document/JOYGEM_AI_IOS_V1.0.19/JoyGemAIDemo-swift/JoyGemAIDemo/MainViewController.swift index d9e9717..6f0761b 100644 --- a/document/JOYGEM_AI_IOS_V1.0.19/JoyGemAIDemo-swift/JoyGemAIDemo/MainViewController.swift +++ b/document/JOYGEM_AI_IOS_V1.0.19/JoyGemAIDemo-swift/JoyGemAIDemo/MainViewController.swift @@ -143,10 +143,30 @@ extension MainViewController: UITableViewDataSource,UITableViewDelegate { } @objc func scan() { +// cbInfomations.removeAll() +// tableView.reloadData() +// cbManager.scanForPeripherals(withServices: [CBUUID(string: kJoyGemAIServiceUUID)],options: [CBCentralManagerScanOptionAllowDuplicatesKey : false]) +// //cbManager.scanForPeripherals(withServices: [],options: [CBCentralManagerScanOptionAllowDuplicatesKey : false]) + + + print(" === \(kJoyGemAIServiceUUID)") cbInfomations.removeAll() tableView.reloadData() cbManager.scanForPeripherals(withServices: [CBUUID(string: kJoyGemAIServiceUUID)],options: [CBCentralManagerScanOptionAllowDuplicatesKey : false]) - //cbManager.scanForPeripherals(withServices: [],options: [CBCentralManagerScanOptionAllowDuplicatesKey : false]) + + + let devices = cbManager.retrieveConnectedPeripherals(withServices: [CBUUID(string: kJoyGemAIServiceUUID)]) + for item in devices { + print(item) + // DB209A55-DD0E-5031-29FA-40D734C34971 + // "edr:21140DE4C3D9" + // "ble:21140D2CC682" + let vc = PeripheralViewController() + vc.cbManager = cbManager + vc.currentPeripheral = item + self.navigationController?.pushViewController(vc, animated: true) + break + } } }