11 Commits

Author SHA1 Message Date
liyuhua
f776893134 商店包版本修改 此commit置顶 1.0.3 2024-03-25 12:12:03 +08:00
liyuhua
60dcf38ea2 商店包版本修改 此commit置顶 1.0.3 2024-03-25 11:47:10 +08:00
liyuhua
7e299b9212 商店包版本修改 此commit置顶 1.0.3 2024-03-23 21:08:26 +08:00
liyuhua
cf2eeb9a00 商店包版本修改 此commit置顶 1.0.3 2024-03-23 20:47:19 +08:00
liyuhua
c971ac589e 商店包版本修改 此commit置顶 1.0.3 2024-03-23 18:37:20 +08:00
liyuhua
a65270f974 修复优化bug 2024-03-23 18:21:47 +08:00
liyuhua
43e5f14a83 修复优化bug 2024-03-23 18:21:29 +08:00
liyuhua
2b5a1eb2a5 礼物 2024-03-23 16:28:10 +08:00
liyuhua
aeb26daad6 接入声网 2024-03-22 15:46:25 +08:00
liyuhua
88512c6a48 房间排名和首页搜索房间 2024-03-22 11:54:36 +08:00
liyuhua
6c2c5d586a 房间排名和首页搜索房间 2024-03-22 11:54:23 +08:00
146 changed files with 4553 additions and 340 deletions

View File

@@ -10,6 +10,10 @@ target 'yinmeng-ios' do
pod 'Moya'
pod 'MBProgressHUD'
pod 'SVGAPlayer'
pod 'YYText'
# 滑动标签栏
pod 'JXCategoryView'
pod 'JXPagingView/Pager'
#加载图片
pod 'Kingfisher'
#cell
@@ -32,6 +36,9 @@ target 'yinmeng-ios' do
pod 'FFPopup'
pod 'TXLiteAVSDK_TRTC', '~> 11.4.14530'
pod 'MJExtension'
pod 'QGVAPlayer'
#声网
pod 'AgoraRtcEngine_iOS', '~> 4.2.2'
# Pods for yinmeng-ios
end

View File

@@ -37,7 +37,6 @@
233E515B2B8C849600582F9C /* PlanetStarClickItemView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 233E515A2B8C849600582F9C /* PlanetStarClickItemView.swift */; };
234E2DF02B98425800433CF7 /* RoomVC.swift in Sources */ = {isa = PBXBuildFile; fileRef = 234E2DEF2B98425800433CF7 /* RoomVC.swift */; };
234E2DF42B9847A700433CF7 /* RoomBackgroundView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 234E2DF32B9847A700433CF7 /* RoomBackgroundView.swift */; };
234E2DF72B984FB200433CF7 /* RoomTopView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 234E2DF62B984FB200433CF7 /* RoomTopView.swift */; };
234E2DFA2B9851F000433CF7 /* UIButton+.swift in Sources */ = {isa = PBXBuildFile; fileRef = 234E2DF92B9851F000433CF7 /* UIButton+.swift */; };
234E2DFD2B985A7300433CF7 /* UILabel+.swift in Sources */ = {isa = PBXBuildFile; fileRef = 234E2DFC2B985A7300433CF7 /* UILabel+.swift */; };
234E2E022B986D7600433CF7 /* RoomQuitView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 234E2E012B986D7600433CF7 /* RoomQuitView.swift */; };
@@ -57,6 +56,39 @@
234E2E312B9B001A00433CF7 /* RoomChatScreenView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 234E2E302B9B001A00433CF7 /* RoomChatScreenView.swift */; };
234E2E332B9B019B00433CF7 /* RoomChatScreenHeaderView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 234E2E322B9B019B00433CF7 /* RoomChatScreenHeaderView.swift */; };
234E2E352B9B06E800433CF7 /* RoomChatScreenUserChatCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 234E2E342B9B06E800433CF7 /* RoomChatScreenUserChatCell.swift */; };
23630B992BABCE52003AD25D /* HomeSearchVC.swift in Sources */ = {isa = PBXBuildFile; fileRef = 23630B982BABCE52003AD25D /* HomeSearchVC.swift */; };
23630B9B2BABCEA5003AD25D /* HomeSearchNavView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 23630B9A2BABCEA5003AD25D /* HomeSearchNavView.swift */; };
23630B9D2BAC0DEA003AD25D /* HomeSearchRoomVC.swift in Sources */ = {isa = PBXBuildFile; fileRef = 23630B9C2BAC0DEA003AD25D /* HomeSearchRoomVC.swift */; };
23630BA12BAC12F9003AD25D /* HomeSearchRoomCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 23630BA02BAC12F9003AD25D /* HomeSearchRoomCell.swift */; };
23630BA32BAC23BA003AD25D /* HomeSearchRoomModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 23630BA22BAC23BA003AD25D /* HomeSearchRoomModel.swift */; };
23630BB02BAD2708003AD25D /* YinRoomRankModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 23630BAF2BAD2708003AD25D /* YinRoomRankModel.swift */; };
23630BB52BAD2725003AD25D /* YinRoomRankView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 23630BB22BAD2725003AD25D /* YinRoomRankView.swift */; };
23630BB62BAD2725003AD25D /* RoomTopView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 23630BB32BAD2725003AD25D /* RoomTopView.swift */; };
23630BB72BAD2725003AD25D /* YinRoomRankItemView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 23630BB42BAD2725003AD25D /* YinRoomRankItemView.swift */; };
23630BB92BAD2CB8003AD25D /* YinRankH5UrlModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 23630BB82BAD2CB8003AD25D /* YinRankH5UrlModel.swift */; };
23630BBB2BAD2EBB003AD25D /* YinClientInfoModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 23630BBA2BAD2EBB003AD25D /* YinClientInfoModel.swift */; };
23630BBD2BAD379C003AD25D /* YinRoomAudioManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = 23630BBC2BAD379C003AD25D /* YinRoomAudioManager.swift */; };
23630BBF2BAD37B7003AD25D /* YinRoomTRTCManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = 23630BBE2BAD37B7003AD25D /* YinRoomTRTCManager.swift */; };
23630BC12BAD5537003AD25D /* YinRoomAgoraManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = 23630BC02BAD5537003AD25D /* YinRoomAgoraManager.swift */; };
23630BC32BAD7868003AD25D /* SendGiftVC.swift in Sources */ = {isa = PBXBuildFile; fileRef = 23630BC22BAD7868003AD25D /* SendGiftVC.swift */; };
23630BC72BAD7A94003AD25D /* SendGiftView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 23630BC62BAD7A94003AD25D /* SendGiftView.swift */; };
23630BC92BAD7BCB003AD25D /* SendGiftCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 23630BC82BAD7BCB003AD25D /* SendGiftCell.swift */; };
23630BCB2BAD84B0003AD25D /* SendGiftModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 23630BCA2BAD84B0003AD25D /* SendGiftModel.swift */; };
23630BCD2BAD908D003AD25D /* SendGiftSendView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 23630BCC2BAD908D003AD25D /* SendGiftSendView.swift */; };
23630BCF2BADA7D9003AD25D /* SendGiftSendNumView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 23630BCE2BADA7D9003AD25D /* SendGiftSendNumView.swift */; };
23630BD12BADA900003AD25D /* SendGiftSendNumCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 23630BD02BADA900003AD25D /* SendGiftSendNumCell.swift */; };
23630BD32BADA9FF003AD25D /* SendGiftSendNumModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 23630BD22BADA9FF003AD25D /* SendGiftSendNumModel.swift */; };
238A900C2BAAC6C600828123 /* HomeVoiceSearchView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 238A900B2BAAC6C600828123 /* HomeVoiceSearchView.swift */; };
239EA6442BAE898300570127 /* RectiveGiftModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 239EA6432BAE898300570127 /* RectiveGiftModel.swift */; };
239EA6462BAE8A6600570127 /* RectiveGiftUserModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 239EA6452BAE8A6600570127 /* RectiveGiftUserModel.swift */; };
239EA6482BAE8D5E00570127 /* ChatCustomMsgModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 239EA6472BAE8D5E00570127 /* ChatCustomMsgModel.swift */; };
239EA64C2BAE90B700570127 /* ChatMsgRemoteModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 239EA64B2BAE90B700570127 /* ChatMsgRemoteModel.swift */; };
239EA64E2BAE949200570127 /* RoomChatScreenManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = 239EA64D2BAE949200570127 /* RoomChatScreenManager.swift */; };
239EA6512BAE998E00570127 /* YYTextAsyncLayer+YinTextAsyncLayer.m in Sources */ = {isa = PBXBuildFile; fileRef = 239EA6502BAE998E00570127 /* YYTextAsyncLayer+YinTextAsyncLayer.m */; };
239EA6532BAEA73100570127 /* RoomChatScreenContentCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 239EA6522BAEA73100570127 /* RoomChatScreenContentCell.swift */; };
239EA65A2BAEB48A00570127 /* RoomDynamicEffectView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 239EA6592BAEB48A00570127 /* RoomDynamicEffectView.swift */; };
239EA65F2BAED9B900570127 /* YinCustomAttachmentCoding.swift in Sources */ = {isa = PBXBuildFile; fileRef = 239EA65E2BAED9B900570127 /* YinCustomAttachmentCoding.swift */; };
239EA6642BAF03B400570127 /* YinGetPointGroup.m in Sources */ = {isa = PBXBuildFile; fileRef = 239EA6632BAF03B400570127 /* YinGetPointGroup.m */; };
23EE96E02B9EB22100475D69 /* RoomMenuView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 23EE96DF2B9EB22100475D69 /* RoomMenuView.swift */; };
23EE96E22B9EB22F00475D69 /* RoomSendTextView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 23EE96E12B9EB22F00475D69 /* RoomSendTextView.swift */; };
23EE96E62B9EE79A00475D69 /* RoomVCViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 23EE96E52B9EE79A00475D69 /* RoomVCViewModel.swift */; };
@@ -67,6 +99,10 @@
23EE96F42BA048F100475D69 /* MicSeatGiftValueModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 23EE96F32BA048F100475D69 /* MicSeatGiftValueModel.swift */; };
23EE96F62BA061DE00475D69 /* RoomMsgListModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 23EE96F52BA061DE00475D69 /* RoomMsgListModel.swift */; };
23EE96FA2BA1A3A300475D69 /* YinSpeak.svga in Resources */ = {isa = PBXBuildFile; fileRef = 23EE96F92BA1A3A200475D69 /* YinSpeak.svga */; };
23EE97032BA29F1E00475D69 /* SendGiftTopView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 23EE97022BA29F1E00475D69 /* SendGiftTopView.swift */; };
23EE97052BA2A67300475D69 /* SendGiftUserView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 23EE97042BA2A67300475D69 /* SendGiftUserView.swift */; };
23EE97072BA2AC8300475D69 /* SendGiftUserCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 23EE97062BA2AC8300475D69 /* SendGiftUserCell.swift */; };
23EE970F2BA3006800475D69 /* SendGiftUserModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 23EE970E2BA3006800475D69 /* SendGiftUserModel.swift */; };
25C63BC8F805551E8754E409 /* Pods_yinmeng_ios.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = B2F175918AD0811681497739 /* Pods_yinmeng_ios.framework */; };
E81A7BAE2B885B20009E736E /* Base64.m in Sources */ = {isa = PBXBuildFile; fileRef = E81A7BAA2B885B20009E736E /* Base64.m */; };
E81A7BAF2B885B20009E736E /* MAIDESEncryptTool.m in Sources */ = {isa = PBXBuildFile; fileRef = E81A7BAB2B885B20009E736E /* MAIDESEncryptTool.m */; };
@@ -169,7 +205,6 @@
233E515A2B8C849600582F9C /* PlanetStarClickItemView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PlanetStarClickItemView.swift; sourceTree = "<group>"; };
234E2DEF2B98425800433CF7 /* RoomVC.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RoomVC.swift; sourceTree = "<group>"; };
234E2DF32B9847A700433CF7 /* RoomBackgroundView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RoomBackgroundView.swift; sourceTree = "<group>"; };
234E2DF62B984FB200433CF7 /* RoomTopView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RoomTopView.swift; sourceTree = "<group>"; };
234E2DF92B9851F000433CF7 /* UIButton+.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "UIButton+.swift"; sourceTree = "<group>"; };
234E2DFC2B985A7300433CF7 /* UILabel+.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "UILabel+.swift"; sourceTree = "<group>"; };
234E2E012B986D7600433CF7 /* RoomQuitView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RoomQuitView.swift; sourceTree = "<group>"; };
@@ -189,6 +224,41 @@
234E2E302B9B001A00433CF7 /* RoomChatScreenView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RoomChatScreenView.swift; sourceTree = "<group>"; };
234E2E322B9B019B00433CF7 /* RoomChatScreenHeaderView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RoomChatScreenHeaderView.swift; sourceTree = "<group>"; };
234E2E342B9B06E800433CF7 /* RoomChatScreenUserChatCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RoomChatScreenUserChatCell.swift; sourceTree = "<group>"; };
23630B982BABCE52003AD25D /* HomeSearchVC.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = HomeSearchVC.swift; sourceTree = "<group>"; };
23630B9A2BABCEA5003AD25D /* HomeSearchNavView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = HomeSearchNavView.swift; sourceTree = "<group>"; };
23630B9C2BAC0DEA003AD25D /* HomeSearchRoomVC.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = HomeSearchRoomVC.swift; sourceTree = "<group>"; };
23630BA02BAC12F9003AD25D /* HomeSearchRoomCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = HomeSearchRoomCell.swift; sourceTree = "<group>"; };
23630BA22BAC23BA003AD25D /* HomeSearchRoomModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = HomeSearchRoomModel.swift; sourceTree = "<group>"; };
23630BAF2BAD2708003AD25D /* YinRoomRankModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = YinRoomRankModel.swift; sourceTree = "<group>"; };
23630BB22BAD2725003AD25D /* YinRoomRankView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = YinRoomRankView.swift; sourceTree = "<group>"; };
23630BB32BAD2725003AD25D /* RoomTopView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = RoomTopView.swift; sourceTree = "<group>"; };
23630BB42BAD2725003AD25D /* YinRoomRankItemView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = YinRoomRankItemView.swift; sourceTree = "<group>"; };
23630BB82BAD2CB8003AD25D /* YinRankH5UrlModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = YinRankH5UrlModel.swift; sourceTree = "<group>"; };
23630BBA2BAD2EBB003AD25D /* YinClientInfoModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = YinClientInfoModel.swift; sourceTree = "<group>"; };
23630BBC2BAD379C003AD25D /* YinRoomAudioManager.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = YinRoomAudioManager.swift; sourceTree = "<group>"; };
23630BBE2BAD37B7003AD25D /* YinRoomTRTCManager.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = YinRoomTRTCManager.swift; sourceTree = "<group>"; };
23630BC02BAD5537003AD25D /* YinRoomAgoraManager.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = YinRoomAgoraManager.swift; sourceTree = "<group>"; };
23630BC22BAD7868003AD25D /* SendGiftVC.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SendGiftVC.swift; sourceTree = "<group>"; };
23630BC62BAD7A94003AD25D /* SendGiftView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SendGiftView.swift; sourceTree = "<group>"; };
23630BC82BAD7BCB003AD25D /* SendGiftCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SendGiftCell.swift; sourceTree = "<group>"; };
23630BCA2BAD84B0003AD25D /* SendGiftModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SendGiftModel.swift; sourceTree = "<group>"; };
23630BCC2BAD908D003AD25D /* SendGiftSendView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SendGiftSendView.swift; sourceTree = "<group>"; };
23630BCE2BADA7D9003AD25D /* SendGiftSendNumView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SendGiftSendNumView.swift; sourceTree = "<group>"; };
23630BD02BADA900003AD25D /* SendGiftSendNumCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SendGiftSendNumCell.swift; sourceTree = "<group>"; };
23630BD22BADA9FF003AD25D /* SendGiftSendNumModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SendGiftSendNumModel.swift; sourceTree = "<group>"; };
238A900B2BAAC6C600828123 /* HomeVoiceSearchView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = HomeVoiceSearchView.swift; sourceTree = "<group>"; };
239EA6432BAE898300570127 /* RectiveGiftModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RectiveGiftModel.swift; sourceTree = "<group>"; };
239EA6452BAE8A6600570127 /* RectiveGiftUserModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RectiveGiftUserModel.swift; sourceTree = "<group>"; };
239EA6472BAE8D5E00570127 /* ChatCustomMsgModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ChatCustomMsgModel.swift; sourceTree = "<group>"; };
239EA64B2BAE90B700570127 /* ChatMsgRemoteModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ChatMsgRemoteModel.swift; sourceTree = "<group>"; };
239EA64D2BAE949200570127 /* RoomChatScreenManager.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RoomChatScreenManager.swift; sourceTree = "<group>"; };
239EA64F2BAE998E00570127 /* YYTextAsyncLayer+YinTextAsyncLayer.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "YYTextAsyncLayer+YinTextAsyncLayer.h"; sourceTree = "<group>"; };
239EA6502BAE998E00570127 /* YYTextAsyncLayer+YinTextAsyncLayer.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "YYTextAsyncLayer+YinTextAsyncLayer.m"; sourceTree = "<group>"; };
239EA6522BAEA73100570127 /* RoomChatScreenContentCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RoomChatScreenContentCell.swift; sourceTree = "<group>"; };
239EA6592BAEB48A00570127 /* RoomDynamicEffectView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RoomDynamicEffectView.swift; sourceTree = "<group>"; };
239EA65E2BAED9B900570127 /* YinCustomAttachmentCoding.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = YinCustomAttachmentCoding.swift; sourceTree = "<group>"; };
239EA6622BAF03B400570127 /* YinGetPointGroup.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = YinGetPointGroup.h; sourceTree = "<group>"; };
239EA6632BAF03B400570127 /* YinGetPointGroup.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = YinGetPointGroup.m; sourceTree = "<group>"; };
23EE96DF2B9EB22100475D69 /* RoomMenuView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RoomMenuView.swift; sourceTree = "<group>"; };
23EE96E12B9EB22F00475D69 /* RoomSendTextView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RoomSendTextView.swift; sourceTree = "<group>"; };
23EE96E52B9EE79A00475D69 /* RoomVCViewModel.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = RoomVCViewModel.swift; sourceTree = "<group>"; };
@@ -199,6 +269,10 @@
23EE96F32BA048F100475D69 /* MicSeatGiftValueModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MicSeatGiftValueModel.swift; sourceTree = "<group>"; };
23EE96F52BA061DE00475D69 /* RoomMsgListModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RoomMsgListModel.swift; sourceTree = "<group>"; };
23EE96F92BA1A3A200475D69 /* YinSpeak.svga */ = {isa = PBXFileReference; lastKnownFileType = file; path = YinSpeak.svga; sourceTree = "<group>"; };
23EE97022BA29F1E00475D69 /* SendGiftTopView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SendGiftTopView.swift; sourceTree = "<group>"; };
23EE97042BA2A67300475D69 /* SendGiftUserView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SendGiftUserView.swift; sourceTree = "<group>"; };
23EE97062BA2AC8300475D69 /* SendGiftUserCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SendGiftUserCell.swift; sourceTree = "<group>"; };
23EE970E2BA3006800475D69 /* SendGiftUserModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SendGiftUserModel.swift; sourceTree = "<group>"; };
A9FB906EB4D17C552C15A2B3 /* Pods-yinmeng-ios.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-yinmeng-ios.debug.xcconfig"; path = "Target Support Files/Pods-yinmeng-ios/Pods-yinmeng-ios.debug.xcconfig"; sourceTree = "<group>"; };
B2F175918AD0811681497739 /* Pods_yinmeng_ios.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_yinmeng_ios.framework; sourceTree = BUILT_PRODUCTS_DIR; };
CB0AC98C54C1D41FA4CA102B /* Pods-yinmeng-ios.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-yinmeng-ios.release.xcconfig"; path = "Target Support Files/Pods-yinmeng-ios/Pods-yinmeng-ios.release.xcconfig"; sourceTree = "<group>"; };
@@ -341,6 +415,8 @@
234E2DED2B98411800433CF7 /* View */ = {
isa = PBXGroup;
children = (
239EA6542BAEB47900570127 /* RoomDynamicEffectView */,
23EE96FB2BA29AFF00475D69 /* SendGift */,
23EE96DA2B9EB17D00475D69 /* RoomMenuView */,
234E2E2B2B9AFCDB00433CF7 /* RoomChatScreenView */,
234E2E122B99F21600433CF7 /* MicSeatView */,
@@ -355,6 +431,9 @@
234E2DEE2B98411800433CF7 /* Tool */ = {
isa = PBXGroup;
children = (
23630BBC2BAD379C003AD25D /* YinRoomAudioManager.swift */,
23630BBE2BAD37B7003AD25D /* YinRoomTRTCManager.swift */,
23630BC02BAD5537003AD25D /* YinRoomAgoraManager.swift */,
);
path = Tool;
sourceTree = "<group>";
@@ -377,7 +456,8 @@
234E2DF52B984FA800433CF7 /* RoomTopView */ = {
isa = PBXGroup;
children = (
234E2DF62B984FB200433CF7 /* RoomTopView.swift */,
23630BB12BAD2725003AD25D /* View */,
23630BAE2BAD26F7003AD25D /* Model */,
);
path = RoomTopView;
sourceTree = "<group>";
@@ -530,6 +610,7 @@
234E2E2C2B9AFCDB00433CF7 /* ViewModel */ = {
isa = PBXGroup;
children = (
239EA64D2BAE949200570127 /* RoomChatScreenManager.swift */,
);
path = ViewModel;
sourceTree = "<group>";
@@ -548,6 +629,7 @@
234E2E302B9B001A00433CF7 /* RoomChatScreenView.swift */,
234E2E322B9B019B00433CF7 /* RoomChatScreenHeaderView.swift */,
234E2E342B9B06E800433CF7 /* RoomChatScreenUserChatCell.swift */,
239EA6522BAEA73100570127 /* RoomChatScreenContentCell.swift */,
);
path = View;
sourceTree = "<group>";
@@ -559,6 +641,64 @@
path = Tool;
sourceTree = "<group>";
};
23630BAE2BAD26F7003AD25D /* Model */ = {
isa = PBXGroup;
children = (
23630BAF2BAD2708003AD25D /* YinRoomRankModel.swift */,
);
path = Model;
sourceTree = "<group>";
};
23630BB12BAD2725003AD25D /* View */ = {
isa = PBXGroup;
children = (
23630BB32BAD2725003AD25D /* RoomTopView.swift */,
23630BB42BAD2725003AD25D /* YinRoomRankItemView.swift */,
23630BB22BAD2725003AD25D /* YinRoomRankView.swift */,
);
path = View;
sourceTree = "<group>";
};
239EA6542BAEB47900570127 /* RoomDynamicEffectView */ = {
isa = PBXGroup;
children = (
239EA6552BAEB47900570127 /* ViewModel */,
239EA6562BAEB47900570127 /* Model */,
239EA6572BAEB47900570127 /* View */,
239EA6582BAEB47900570127 /* Tool */,
);
path = RoomDynamicEffectView;
sourceTree = "<group>";
};
239EA6552BAEB47900570127 /* ViewModel */ = {
isa = PBXGroup;
children = (
);
path = ViewModel;
sourceTree = "<group>";
};
239EA6562BAEB47900570127 /* Model */ = {
isa = PBXGroup;
children = (
);
path = Model;
sourceTree = "<group>";
};
239EA6572BAEB47900570127 /* View */ = {
isa = PBXGroup;
children = (
239EA6592BAEB48A00570127 /* RoomDynamicEffectView.swift */,
);
path = View;
sourceTree = "<group>";
};
239EA6582BAEB47900570127 /* Tool */ = {
isa = PBXGroup;
children = (
);
path = Tool;
sourceTree = "<group>";
};
23EE96DA2B9EB17D00475D69 /* RoomMenuView */ = {
isa = PBXGroup;
children = (
@@ -600,6 +740,59 @@
path = Tool;
sourceTree = "<group>";
};
23EE96FB2BA29AFF00475D69 /* SendGift */ = {
isa = PBXGroup;
children = (
23EE96FC2BA29AFF00475D69 /* ViewModel */,
23EE96FD2BA29AFF00475D69 /* Model */,
23EE96FE2BA29AFF00475D69 /* View */,
23EE96FF2BA29AFF00475D69 /* Tool */,
);
path = SendGift;
sourceTree = "<group>";
};
23EE96FC2BA29AFF00475D69 /* ViewModel */ = {
isa = PBXGroup;
children = (
);
path = ViewModel;
sourceTree = "<group>";
};
23EE96FD2BA29AFF00475D69 /* Model */ = {
isa = PBXGroup;
children = (
23EE970E2BA3006800475D69 /* SendGiftUserModel.swift */,
23630BCA2BAD84B0003AD25D /* SendGiftModel.swift */,
23630BD22BADA9FF003AD25D /* SendGiftSendNumModel.swift */,
239EA6432BAE898300570127 /* RectiveGiftModel.swift */,
239EA6452BAE8A6600570127 /* RectiveGiftUserModel.swift */,
);
path = Model;
sourceTree = "<group>";
};
23EE96FE2BA29AFF00475D69 /* View */ = {
isa = PBXGroup;
children = (
23630BC22BAD7868003AD25D /* SendGiftVC.swift */,
23EE97022BA29F1E00475D69 /* SendGiftTopView.swift */,
23EE97042BA2A67300475D69 /* SendGiftUserView.swift */,
23EE97062BA2AC8300475D69 /* SendGiftUserCell.swift */,
23630BC62BAD7A94003AD25D /* SendGiftView.swift */,
23630BC82BAD7BCB003AD25D /* SendGiftCell.swift */,
23630BCC2BAD908D003AD25D /* SendGiftSendView.swift */,
23630BCE2BADA7D9003AD25D /* SendGiftSendNumView.swift */,
23630BD02BADA900003AD25D /* SendGiftSendNumCell.swift */,
);
path = View;
sourceTree = "<group>";
};
23EE96FF2BA29AFF00475D69 /* Tool */ = {
isa = PBXGroup;
children = (
);
path = Tool;
sourceTree = "<group>";
};
4B36689ACEFDA475774E1FD5 /* Pods */ = {
isa = PBXGroup;
children = (
@@ -653,6 +846,8 @@
children = (
E8479E402B8DC6BC009AF878 /* ChatBaseObject.swift */,
E8479E422B8DD077009AF878 /* ChatUIConfig.swift */,
239EA6472BAE8D5E00570127 /* ChatCustomMsgModel.swift */,
239EA64B2BAE90B700570127 /* ChatMsgRemoteModel.swift */,
);
path = Model;
sourceTree = "<group>";
@@ -669,6 +864,7 @@
isa = PBXGroup;
children = (
E8479E4C2B8DDBC5009AF878 /* ChatAttributeTool.swift */,
239EA65E2BAED9B900570127 /* YinCustomAttachmentCoding.swift */,
);
path = Tool;
sourceTree = "<group>";
@@ -760,6 +956,8 @@
isa = PBXGroup;
children = (
E86A43D42B8774B70084C04D /* AuthViewModel.swift */,
23630BB82BAD2CB8003AD25D /* YinRankH5UrlModel.swift */,
23630BBA2BAD2EBB003AD25D /* YinClientInfoModel.swift */,
E8D15A9E2B89AED500369467 /* AuthManager.swift */,
E8D15AA02B89AF4F00369467 /* UserTokenObject.swift */,
E8E4AAB62B8F95CA0096D77C /* AuthAppleManager.swift */,
@@ -877,6 +1075,12 @@
isa = PBXGroup;
children = (
E8D15AAF2B8AFFCE00369467 /* HomeVoiceVC.swift */,
238A900B2BAAC6C600828123 /* HomeVoiceSearchView.swift */,
23630B982BABCE52003AD25D /* HomeSearchVC.swift */,
23630B9C2BAC0DEA003AD25D /* HomeSearchRoomVC.swift */,
23630BA02BAC12F9003AD25D /* HomeSearchRoomCell.swift */,
23630BA22BAC23BA003AD25D /* HomeSearchRoomModel.swift */,
23630B9A2BABCEA5003AD25D /* HomeSearchNavView.swift */,
2311D6AC2B9058AA001C70AB /* HomeVoiceModel.swift */,
2311D6A62B8F2CFA001C70AB /* HomeVoiceChooseItemVeiw.swift */,
2311D6A82B8F405F001C70AB /* HomeVoiceChooseTypeView.swift */,
@@ -1005,6 +1209,10 @@
E81A7BA92B885B1F009E736E /* yinmeng-ios-Bridging-Header.h */,
2311D6C92B91BBF2001C70AB /* RecordVoiceManager.h */,
2311D6CA2B91BBF2001C70AB /* RecordVoiceManager.m */,
239EA6622BAF03B400570127 /* YinGetPointGroup.h */,
239EA6632BAF03B400570127 /* YinGetPointGroup.m */,
239EA64F2BAE998E00570127 /* YYTextAsyncLayer+YinTextAsyncLayer.h */,
239EA6502BAE998E00570127 /* YYTextAsyncLayer+YinTextAsyncLayer.m */,
);
path = Security;
sourceTree = "<group>";
@@ -1137,12 +1345,17 @@
E86A43AE2B85DFEA0084C04D /* Color+.swift in Sources */,
E8479E482B8DD6E1009AF878 /* ChatTextCell.swift in Sources */,
E8D15A9F2B89AED600369467 /* AuthManager.swift in Sources */,
23630BB02BAD2708003AD25D /* YinRoomRankModel.swift in Sources */,
E8479E382B8DC5CD009AF878 /* ChatListVC.swift in Sources */,
239EA6482BAE8D5E00570127 /* ChatCustomMsgModel.swift in Sources */,
E89F19AF2B91C00F0098E797 /* BindMobileVC.swift in Sources */,
23EE970F2BA3006800475D69 /* SendGiftUserModel.swift in Sources */,
234E2DFA2B9851F000433CF7 /* UIButton+.swift in Sources */,
E86A43B02B85E11B0084C04D /* BaseNavigationViewController.swift in Sources */,
E86A43E82B884C5E0084C04D /* String+.swift in Sources */,
23630BBD2BAD379C003AD25D /* YinRoomAudioManager.swift in Sources */,
2311D6D12B91DDDF001C70AB /* UserPayViewModel.swift in Sources */,
239EA6532BAEA73100570127 /* RoomChatScreenContentCell.swift in Sources */,
2311D6B12B9062A3001C70AB /* HomeVoiceFollowCell.swift in Sources */,
234E2E312B9B001A00433CF7 /* RoomChatScreenView.swift in Sources */,
E8D15AA32B89B03D00369467 /* Deserialized.swift in Sources */,
@@ -1150,31 +1363,41 @@
E8E4AAB72B8F95CA0096D77C /* AuthAppleManager.swift in Sources */,
E89F19452B917DBA0098E797 /* ChatSendVoiceView.swift in Sources */,
23EE96EE2B9F27E200475D69 /* MicSequenceModel.swift in Sources */,
23630BBB2BAD2EBB003AD25D /* YinClientInfoModel.swift in Sources */,
E8D15AC22B8C703C00369467 /* UserFunctionView.swift in Sources */,
234E2E1E2B9AB43700433CF7 /* RoomNormalMicSeatView.swift in Sources */,
2311D6AF2B906148001C70AB /* HomeVoiceFollowView.swift in Sources */,
23630B9D2BAC0DEA003AD25D /* HomeSearchRoomVC.swift in Sources */,
239EA64E2BAE949200570127 /* RoomChatScreenManager.swift in Sources */,
E86A43DA2B877A840084C04D /* AppConfigObject.swift in Sources */,
2311D6BC2B909A4F001C70AB /* HomeVoicePublishView.swift in Sources */,
23630BB52BAD2725003AD25D /* YinRoomRankView.swift in Sources */,
2311D6AD2B9058AA001C70AB /* HomeVoiceModel.swift in Sources */,
2311D6AB2B9024A9001C70AB /* HomeVoicePlayMusicItemView.swift in Sources */,
239EA6442BAE898300570127 /* RectiveGiftModel.swift in Sources */,
E8D15AA62B89B0C600369467 /* List+.swift in Sources */,
234E2E042B986D8400433CF7 /* RoomQuitModel.swift in Sources */,
234E2E0A2B98779900433CF7 /* RoomQuitUserInfoEmptyCell.swift in Sources */,
238A900C2BAAC6C600828123 /* HomeVoiceSearchView.swift in Sources */,
E81A7BAE2B885B20009E736E /* Base64.m in Sources */,
2311D6D72B91EF62001C70AB /* PlanetStarPopUpView.swift in Sources */,
23630BB92BAD2CB8003AD25D /* YinRankH5UrlModel.swift in Sources */,
234E2E352B9B06E800433CF7 /* RoomChatScreenUserChatCell.swift in Sources */,
E8479E462B8DD5BF009AF878 /* Date+.swift in Sources */,
E81A7BB22B886299009E736E /* HUDTool.swift in Sources */,
234E2E082B98738D00433CF7 /* RoomQuitUserInfoCell.swift in Sources */,
E8E4AAB52B8F8E3A0096D77C /* AuthItmeButton.swift in Sources */,
234E2E112B99B50400433CF7 /* RoomQuitViewModel.swift in Sources */,
239EA65A2BAEB48A00570127 /* RoomDynamicEffectView.swift in Sources */,
E86A43BC2B85FA640084C04D /* AuthForgetVC.swift in Sources */,
E86A43C32B8628AF0084C04D /* BaseTabBarViewController.swift in Sources */,
234E2E022B986D7600433CF7 /* RoomQuitView.swift in Sources */,
E8479E3B2B8DC5FA009AF878 /* ChatViewModel.swift in Sources */,
E8479E412B8DC6BC009AF878 /* ChatBaseObject.swift in Sources */,
239EA64C2BAE90B700570127 /* ChatMsgRemoteModel.swift in Sources */,
E86A43AA2B85DFA90084C04D /* BaseViewController.swift in Sources */,
23EE96E22B9EB22F00475D69 /* RoomSendTextView.swift in Sources */,
23630BCD2BAD908D003AD25D /* SendGiftSendView.swift in Sources */,
23EE96F62BA061DE00475D69 /* RoomMsgListModel.swift in Sources */,
E8E4AB1F2B901BFC0096D77C /* ChatGrowingTextView.swift in Sources */,
E884E85F2B6900C500ADE6EE /* AppDelegate.swift in Sources */,
@@ -1183,36 +1406,46 @@
E8D15AEA2B8CD77800369467 /* H5Utils.swift in Sources */,
E8D15AAA2B8ACC6B00369467 /* YMNetworkFun.swift in Sources */,
234E2E202B9AB44800433CF7 /* MicSeatSuperView.swift in Sources */,
23630BCF2BADA7D9003AD25D /* SendGiftSendNumView.swift in Sources */,
E8D15AB82B8B003C00369467 /* UserInfoVC.swift in Sources */,
234E2DF72B984FB200433CF7 /* RoomTopView.swift in Sources */,
E86A43B82B85F0B80084C04D /* AuthLaunchVC.swift in Sources */,
E8E4AB252B901E400096D77C /* ChatMoreMenuCell.swift in Sources */,
2311D6BA2B908D01001C70AB /* UserPayViewController.swift in Sources */,
E86A43C82B8743EA0084C04D /* AuthFillDataVC.swift in Sources */,
23EE96F42BA048F100475D69 /* MicSeatGiftValueModel.swift in Sources */,
E86A43CD2B874C8E0084C04D /* BaseView.swift in Sources */,
23630BCB2BAD84B0003AD25D /* SendGiftModel.swift in Sources */,
E8D15AE82B8CD47100369467 /* WebViewController.swift in Sources */,
E89F194B2B919ECB0098E797 /* ChatImageCell.swift in Sources */,
234E2E2A2B9AC07B00433CF7 /* MicSeatGiftValueView.swift in Sources */,
239EA6642BAF03B400570127 /* YinGetPointGroup.m in Sources */,
23EE96EA2B9F01F900475D69 /* RoomChatData.swift in Sources */,
E8D15AA12B89AF4F00369467 /* UserTokenObject.swift in Sources */,
234E2E0E2B99A24F00433CF7 /* RoomQuitItemModel.swift in Sources */,
233E515B2B8C849600582F9C /* PlanetStarClickItemView.swift in Sources */,
E8FF28B42B90ADBE005D2BE7 /* AppKeys.swift in Sources */,
2311D6A92B8F405F001C70AB /* HomeVoiceChooseTypeView.swift in Sources */,
239EA6462BAE8A6600570127 /* RectiveGiftUserModel.swift in Sources */,
234E2DF42B9847A700433CF7 /* RoomBackgroundView.swift in Sources */,
E89F19B52B91E3A50098E797 /* PasswordSetView.swift in Sources */,
23630BC32BAD7868003AD25D /* SendGiftVC.swift in Sources */,
E89F19492B919EB80098E797 /* ChatVoiceCell.swift in Sources */,
234E2E062B986E2100433CF7 /* Enum.swift in Sources */,
23EE96EC2B9F273A00475D69 /* MicSeatModel.swift in Sources */,
23630BB72BAD2725003AD25D /* YinRoomRankItemView.swift in Sources */,
23630BA12BAC12F9003AD25D /* HomeSearchRoomCell.swift in Sources */,
E8D15AB62B8B002700369467 /* ChatVC.swift in Sources */,
E8E4AB182B9019E50096D77C /* ChatKeyboardView.swift in Sources */,
23630BBF2BAD37B7003AD25D /* YinRoomTRTCManager.swift in Sources */,
23630BA32BAC23BA003AD25D /* HomeSearchRoomModel.swift in Sources */,
E8E4AB232B901E0C0096D77C /* ChatMoreMnueConfig.swift in Sources */,
E86A43C62B862CC70084C04D /* UIImage+.swift in Sources */,
E8E4AB212B901CD50096D77C /* ChatMoreMenuView.swift in Sources */,
E86A43D32B8773C90084C04D /* APPUtils.swift in Sources */,
23EE96E62B9EE79A00475D69 /* RoomVCViewModel.swift in Sources */,
239EA65F2BAED9B900570127 /* YinCustomAttachmentCoding.swift in Sources */,
E86A43CB2B874C6F0084C04D /* AuthPrivacyView.swift in Sources */,
23630BB62BAD2725003AD25D /* RoomTopView.swift in Sources */,
234E2E0C2B9879D400433CF7 /* RoomQuitClickCell.swift in Sources */,
234E2DFD2B985A7300433CF7 /* UILabel+.swift in Sources */,
E8D15AC52B8C90D400369467 /* AboutUsVC.swift in Sources */,
@@ -1220,16 +1453,23 @@
2311D6B32B906EDA001C70AB /* HomeVoiceGuideView.swift in Sources */,
E8D15ABF2B8B885700369467 /* UserObject.swift in Sources */,
2311D6B52B907053001C70AB /* HomeVoiceUserInfoView.swift in Sources */,
23630BC12BAD5537003AD25D /* YinRoomAgoraManager.swift in Sources */,
E86A43BF2B8620C40084C04D /* Utils.swift in Sources */,
E86A43BA2B85F1360084C04D /* AuthLoginVC.swift in Sources */,
E8D15ABC2B8B87BA00369467 /* UserViewModel.swift in Sources */,
239EA6512BAE998E00570127 /* YYTextAsyncLayer+YinTextAsyncLayer.m in Sources */,
E8479E432B8DD077009AF878 /* ChatUIConfig.swift in Sources */,
23630BC92BAD7BCB003AD25D /* SendGiftCell.swift in Sources */,
23EE97032BA29F1E00475D69 /* SendGiftTopView.swift in Sources */,
234E2E252B9AB64700433CF7 /* NormalMicSeatCell.swift in Sources */,
E8479E4D2B8DDBC5009AF878 /* ChatAttributeTool.swift in Sources */,
E81A7BAF2B885B20009E736E /* MAIDESEncryptTool.m in Sources */,
23630B9B2BABCEA5003AD25D /* HomeSearchNavView.swift in Sources */,
E8D15AA82B89B74700369467 /* YMRequestX.swift in Sources */,
23630BD32BADA9FF003AD25D /* SendGiftSendNumModel.swift in Sources */,
E8E4AB1D2B901B9D0096D77C /* ChatKeyboard+.swift in Sources */,
2311D6C62B917949001C70AB /* HomeVoiceRecordBtnView.swift in Sources */,
23EE97072BA2AC8300475D69 /* SendGiftUserCell.swift in Sources */,
234E2DF02B98425800433CF7 /* RoomVC.swift in Sources */,
2311D6A72B8F2CFA001C70AB /* HomeVoiceChooseItemVeiw.swift in Sources */,
E8D15AB02B8AFFCE00369467 /* HomeVoiceVC.swift in Sources */,
@@ -1242,12 +1482,16 @@
E8D15AB32B8B000400369467 /* PlanetStarVC.swift in Sources */,
E8FF28B62B90ED6C005D2BE7 /* ChatNavView.swift in Sources */,
234E2E332B9B019B00433CF7 /* RoomChatScreenHeaderView.swift in Sources */,
23630BD12BADA900003AD25D /* SendGiftSendNumCell.swift in Sources */,
E8D15A9D2B899E1500369467 /* YMNetworkHelper.swift in Sources */,
E8E4AB1B2B901AF50096D77C /* UIView+.swift in Sources */,
2311D69D2B8DC311001C70AB /* PlanetStarModel.swift in Sources */,
E89F19B32B91E2C00098E797 /* PasswordSetVC.swift in Sources */,
2311D6CB2B91BBF2001C70AB /* RecordVoiceManager.m in Sources */,
23630B992BABCE52003AD25D /* HomeSearchVC.swift in Sources */,
2311D6C42B917619001C70AB /* HomeVoiceRecordView.swift in Sources */,
23630BC72BAD7A94003AD25D /* SendGiftView.swift in Sources */,
23EE97052BA2A67300475D69 /* SendGiftUserView.swift in Sources */,
);
runOnlyForDeploymentPostprocessing = 0;
};
@@ -1423,7 +1667,7 @@
"$(inherited)",
"@executable_path/Frameworks",
);
MARKETING_VERSION = 1.0.2;
MARKETING_VERSION = 1.0.3;
PRODUCT_BUNDLE_IDENTIFIER = "linyudan.yinmeng-ios";
PRODUCT_NAME = "$(TARGET_NAME)";
SUPPORTED_PLATFORMS = "iphoneos iphonesimulator";
@@ -1467,7 +1711,7 @@
"$(inherited)",
"@executable_path/Frameworks",
);
MARKETING_VERSION = 1.0.2;
MARKETING_VERSION = 1.0.3;
PRODUCT_BUNDLE_IDENTIFIER = "linyudan.yinmeng-ios";
PRODUCT_NAME = "$(TARGET_NAME)";
SUPPORTED_PLATFORMS = "iphoneos iphonesimulator";

View File

@@ -68,6 +68,7 @@ var window: UIWindow?
let opt = NIMSDKOption(appKey: AppKeys.nimAppid)
opt.apnsCername = "yinmeng_anps"
NIMSDK.shared().register(with: opt)
NIMCustomObject.registerCustomDecoder(YinCustomAttachmentCoding())
}
}

View File

@@ -0,0 +1,22 @@
{
"images" : [
{
"idiom" : "universal",
"scale" : "1x"
},
{
"filename" : "home_search_online_icon@2x.png",
"idiom" : "universal",
"scale" : "2x"
},
{
"filename" : "home_search_online_icon@3x.png",
"idiom" : "universal",
"scale" : "3x"
}
],
"info" : {
"author" : "xcode",
"version" : 1
}
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 187 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 222 B

View File

@@ -0,0 +1,22 @@
{
"images" : [
{
"idiom" : "universal",
"scale" : "1x"
},
{
"filename" : "yin_home_voice_search_bg@2x.png",
"idiom" : "universal",
"scale" : "2x"
},
{
"filename" : "yin_home_voice_search_bg@3x.png",
"idiom" : "universal",
"scale" : "3x"
}
],
"info" : {
"author" : "xcode",
"version" : 1
}
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 515 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 881 B

View File

@@ -0,0 +1,22 @@
{
"images" : [
{
"idiom" : "universal",
"scale" : "1x"
},
{
"filename" : "yin_home_voice_search_icon@2x.png",
"idiom" : "universal",
"scale" : "2x"
},
{
"filename" : "yin_home_voice_search_icon@3x.png",
"idiom" : "universal",
"scale" : "3x"
}
],
"info" : {
"author" : "xcode",
"version" : 1
}
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 830 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.4 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.2 KiB

After

Width:  |  Height:  |  Size: 3.0 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 5.6 KiB

After

Width:  |  Height:  |  Size: 5.0 KiB

View File

@@ -0,0 +1,22 @@
{
"images" : [
{
"idiom" : "universal",
"scale" : "1x"
},
{
"filename" : "yin_left_black_arrow@2x.png",
"idiom" : "universal",
"scale" : "2x"
},
{
"filename" : "yin_left_black_arrow@3x.png",
"idiom" : "universal",
"scale" : "3x"
}
],
"info" : {
"author" : "xcode",
"version" : 1
}
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 363 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 468 B

View File

@@ -0,0 +1,22 @@
{
"images" : [
{
"idiom" : "universal",
"scale" : "1x"
},
{
"filename" : "yin_plane_star_send_gift_icon@2x.png",
"idiom" : "universal",
"scale" : "2x"
},
{
"filename" : "yin_plane_star_send_gift_icon@3x.png",
"idiom" : "universal",
"scale" : "3x"
}
],
"info" : {
"author" : "xcode",
"version" : 1
}
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.9 KiB

View File

@@ -0,0 +1,22 @@
{
"images" : [
{
"idiom" : "universal",
"scale" : "1x"
},
{
"filename" : "yin_search_vc_iocn@2x.png",
"idiom" : "universal",
"scale" : "2x"
},
{
"filename" : "yin_search_vc_iocn@3x.png",
"idiom" : "universal",
"scale" : "3x"
}
],
"info" : {
"author" : "xcode",
"version" : 1
}
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 570 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 703 B

View File

@@ -0,0 +1,6 @@
{
"info" : {
"author" : "xcode",
"version" : 1
}
}

View File

@@ -0,0 +1,22 @@
{
"images" : [
{
"idiom" : "universal",
"scale" : "1x"
},
{
"filename" : "room_gift_slect_bg@2x.png",
"idiom" : "universal",
"scale" : "2x"
},
{
"filename" : "room_gift_slect_bg@3x.png",
"idiom" : "universal",
"scale" : "3x"
}
],
"info" : {
"author" : "xcode",
"version" : 1
}
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 643 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 997 B

View File

@@ -0,0 +1,22 @@
{
"images" : [
{
"idiom" : "universal",
"scale" : "1x"
},
{
"filename" : "yin_room_gift_arrow@2x.png",
"idiom" : "universal",
"scale" : "2x"
},
{
"filename" : "yin_room_gift_arrow@3x.png",
"idiom" : "universal",
"scale" : "3x"
}
],
"info" : {
"author" : "xcode",
"version" : 1
}
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 181 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 254 B

View File

@@ -0,0 +1,22 @@
{
"images" : [
{
"idiom" : "universal",
"scale" : "1x"
},
{
"filename" : "yin_room_gift_diamond@2x.png",
"idiom" : "universal",
"scale" : "2x"
},
{
"filename" : "yin_room_gift_diamond@3x.png",
"idiom" : "universal",
"scale" : "3x"
}
],
"info" : {
"author" : "xcode",
"version" : 1
}
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.5 KiB

View File

@@ -0,0 +1,22 @@
{
"images" : [
{
"idiom" : "universal",
"scale" : "1x"
},
{
"filename" : "yin_room_gift_select@2x.png",
"idiom" : "universal",
"scale" : "2x"
},
{
"filename" : "yin_room_gift_select@3x.png",
"idiom" : "universal",
"scale" : "3x"
}
],
"info" : {
"author" : "xcode",
"version" : 1
}
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 643 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 997 B

View File

@@ -0,0 +1,22 @@
{
"images" : [
{
"idiom" : "universal",
"scale" : "1x"
},
{
"filename" : "yin_room_gift_tag_dedicated@2x.png",
"idiom" : "universal",
"scale" : "2x"
},
{
"filename" : "yin_room_gift_tag_dedicated@3x.png",
"idiom" : "universal",
"scale" : "3x"
}
],
"info" : {
"author" : "xcode",
"version" : 1
}
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 666 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.1 KiB

View File

@@ -0,0 +1,22 @@
{
"images" : [
{
"idiom" : "universal",
"scale" : "1x"
},
{
"filename" : "yin_room_gift_tag_effect@2x.png",
"idiom" : "universal",
"scale" : "2x"
},
{
"filename" : "yin_room_gift_tag_effect@3x.png",
"idiom" : "universal",
"scale" : "3x"
}
],
"info" : {
"author" : "xcode",
"version" : 1
}
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 748 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.1 KiB

View File

@@ -0,0 +1,22 @@
{
"images" : [
{
"idiom" : "universal",
"scale" : "1x"
},
{
"filename" : "yin_room_gift_tag_latest@2x.png",
"idiom" : "universal",
"scale" : "2x"
},
{
"filename" : "yin_room_gift_tag_latest@3x.png",
"idiom" : "universal",
"scale" : "3x"
}
],
"info" : {
"author" : "xcode",
"version" : 1
}
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.7 KiB

View File

@@ -0,0 +1,22 @@
{
"images" : [
{
"idiom" : "universal",
"scale" : "1x"
},
{
"filename" : "yin_room_gift_tag_limit@2x.png",
"idiom" : "universal",
"scale" : "2x"
},
{
"filename" : "yin_room_gift_tag_limit@3x.png",
"idiom" : "universal",
"scale" : "3x"
}
],
"info" : {
"author" : "xcode",
"version" : 1
}
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.7 KiB

View File

@@ -0,0 +1,22 @@
{
"images" : [
{
"idiom" : "universal",
"scale" : "1x"
},
{
"filename" : "yin_room_gift_up_arrow@2x.png",
"idiom" : "universal",
"scale" : "2x"
},
{
"filename" : "yin_room_gift_up_arrow@3x.png",
"idiom" : "universal",
"scale" : "3x"
}
],
"info" : {
"author" : "xcode",
"version" : 1
}
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 222 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 292 B

View File

@@ -0,0 +1,22 @@
{
"images" : [
{
"idiom" : "universal",
"scale" : "1x"
},
{
"filename" : "room_send_gift_icon@2x.png",
"idiom" : "universal",
"scale" : "2x"
},
{
"filename" : "room_send_gift_icon@3x.png",
"idiom" : "universal",
"scale" : "3x"
}
],
"info" : {
"author" : "xcode",
"version" : 1
}
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.9 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.3 KiB

View File

@@ -0,0 +1,6 @@
{
"info" : {
"author" : "xcode",
"version" : 1
}
}

View File

@@ -0,0 +1,22 @@
{
"images" : [
{
"idiom" : "universal",
"scale" : "1x"
},
{
"filename" : "yin_room_rank_first@2x.png",
"idiom" : "universal",
"scale" : "2x"
},
{
"filename" : "yin_room_rank_first@3x.png",
"idiom" : "universal",
"scale" : "3x"
}
],
"info" : {
"author" : "xcode",
"version" : 1
}
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.0 KiB

View File

@@ -0,0 +1,22 @@
{
"images" : [
{
"idiom" : "universal",
"scale" : "1x"
},
{
"filename" : "yin_room_rank_second@2x.png",
"idiom" : "universal",
"scale" : "2x"
},
{
"filename" : "yin_room_rank_second@3x.png",
"idiom" : "universal",
"scale" : "3x"
}
],
"info" : {
"author" : "xcode",
"version" : 1
}
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.9 KiB

View File

@@ -0,0 +1,22 @@
{
"images" : [
{
"idiom" : "universal",
"scale" : "1x"
},
{
"filename" : "yin_room_rank_third@2x.png",
"idiom" : "universal",
"scale" : "2x"
},
{
"filename" : "yin_room_rank_third@3x.png",
"idiom" : "universal",
"scale" : "3x"
}
],
"info" : {
"author" : "xcode",
"version" : 1
}
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.0 KiB

View File

@@ -23,6 +23,7 @@ NS_ASSUME_NONNULL_BEGIN
- (void)initWithRecord;
-(void)stopRecord;
- (void)playFilePathVoice;
@end
NS_ASSUME_NONNULL_END

View File

@@ -0,0 +1,16 @@
//
// YYTextAsyncLayer+XPTextAsyncLayer.h
// xplan-ios
//
// Created by yinmeng on 2023/10/28.
//
#import <YYText/YYTextAsyncLayer.h>
NS_ASSUME_NONNULL_BEGIN
@interface YYTextAsyncLayer (YinTextAsyncLayer)
@end
NS_ASSUME_NONNULL_END

View File

@@ -0,0 +1,27 @@
//
// YYTextAsyncLayer+XPTextAsyncLayer.m
// xplan-ios
//
// Created by yinmeng on 2023/10/28.
//
#import "YYTextAsyncLayer+YinTextAsyncLayer.h"
#import <objc/runtime.h>
@implementation YYTextAsyncLayer (YinTextAsyncLayer)
+(void)load {
Method yin_displayMethod = class_getInstanceMethod(self, @selector(display));
Method yin_swizzingMethod = class_getInstanceMethod(self, @selector(yin_swizzing_display));
method_exchangeImplementations(yin_displayMethod, yin_swizzingMethod);
}
-(void)yin_swizzing_display{
if (self.bounds.size.width <= 0 || self.bounds.size.height <= 0) {
self.contents = nil;
return;
} else {
[self yin_swizzing_display];
}
}
@end

View File

@@ -0,0 +1,16 @@
//
// YinGetPointGroup.h
// yinmeng-ios
//
// Created by yinmeng on 2024/3/23.
//
#import <Foundation/Foundation.h>
#import <UIKit/UIKit.h>
NS_ASSUME_NONNULL_BEGIN
@interface YinGetPointGroup : NSObject
+ (CAAnimationGroup *)getGroupPoint:(CGPoint)startPoint endPoint:(CGPoint)endPoint centerPoint:(CGPoint)centerPoint;
@end
NS_ASSUME_NONNULL_END

View File

@@ -0,0 +1,68 @@
//
// YinGetPointGroup.m
// yinmeng-ios
//
// Created by yinmeng on 2024/3/23.
//
#import "YinGetPointGroup.h"
@implementation YinGetPointGroup
+ (CAAnimationGroup *)getGroupPoint:(CGPoint)startPoint endPoint:(CGPoint)endPoint centerPoint:(CGPoint)centerPoint{
CAKeyframeAnimation *animation0 = [CAKeyframeAnimation animation];
animation0.duration = 0.8;
animation0.keyPath = @"transform.scale";
animation0.values = @[@1.0,@1.5,@2.0,@1.5];
animation0.repeatCount = 1;
animation0.calculationMode = kCAAnimationCubic;
animation0.removedOnCompletion = NO;
animation0.fillMode = kCAFillModeForwards;
CAKeyframeAnimation *animation1 = [CAKeyframeAnimation animation];
animation1.duration = 0.8;
animation1.beginTime = 0.8;
animation1.keyPath = @"transform.scale";
animation1.values = @[@1.5,@2.0,@2.5,@3.0];
animation1.repeatCount = 1;
animation1.calculationMode = kCAAnimationCubic;
animation1.removedOnCompletion = NO;
animation1.fillMode = kCAFillModeForwards;
CAKeyframeAnimation *animation2 = [CAKeyframeAnimation animation];
animation2.duration = 0.8;
animation2.beginTime = 0.8;
animation2.keyPath = @"position";
animation2.timingFunction = [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseOut];;
animation2.values = @[[NSValue valueWithCGPoint:startPoint],[NSValue valueWithCGPoint:CGPointMake(centerPoint.x ,centerPoint.y)]];
animation2.repeatCount = 1;
animation2.removedOnCompletion = NO;
animation2.fillMode = kCAFillModeForwards;
CAKeyframeAnimation *animation3 = [CAKeyframeAnimation animation];
animation3.duration = 0.8;
animation3.beginTime = 2.6;
animation3.keyPath = @"transform.scale";
animation3.values = @[@3,@2.5,@2,@1.5,@1];
animation3.repeatCount = 1;
CAKeyframeAnimation *animation4 = [CAKeyframeAnimation animation];
animation4.duration = 0.8;
animation4.beginTime = 2.6;
animation4.keyPath = @"position";
animation4.timingFunction = [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseOut];
animation4.values = @[[NSValue valueWithCGPoint:CGPointMake(centerPoint.x ,centerPoint.y)],[NSValue valueWithCGPoint:endPoint]];
animation4.repeatCount = 1;
CAAnimationGroup *group = [CAAnimationGroup animation];
group.duration = 3.2;
group.animations = @[animation0,animation1,animation2, animation3,animation4];
group.repeatCount = 1;
group.removedOnCompletion = NO;
group.fillMode = kCAFillModeForwards;
return group;
}
@end

View File

@@ -10,3 +10,10 @@
#import <FFPopup/FFPopup.h>
#import <MJExtension/MJExtension.h>
#import <TXLiteAVSDK_TRTC/TRTCCloud.h>
#import <JXCategoryView/JXCategoryView.h>
#import <JXCategoryView/JXCategoryListContainerView.h>
#import <AgoraRtcKit/AgoraRtcEngineKit.h>
#import <NIMSDK/NIMSDK.h>
#import <YYText/YYText.h>
#import "UIView+VAP.h"
#import "YinGetPointGroup.h"

View File

@@ -10,8 +10,10 @@ enum AppKeys {
#if DEBUG
static let nimAppid = "5d5a833a2d0ff1304a5d8bed53d2af5b"
static let api = "http://beta.api.ymlive.fun/"
static let agoraKey = "5b4d929b6c4e4af190550c4a2ec5cd4c"
#else
static let nimAppid = "5e76ec47632d86c30ce18eabfa332b6a"
static let api = "https://api.ymlive.fun/"
static let agoraKey = "5b4d929b6c4e4af190550c4a2ec5cd4c"
#endif
}

View File

@@ -2,7 +2,7 @@
// Enum.swift
// yinmeng-ios
//
// Created by duoban on 2024/3/6.
// Created by yinmeng on 2024/3/6.
//
import Foundation

View File

@@ -12,4 +12,5 @@ enum H5Utils:String {
case user = "modules/rule/protocol.html"
case logoff = "modules/logout/index.html"
case pay = "mew/modules/rule/rechargeAgreement.html"
case rank = "modules/roomRank/index.html"
}

View File

@@ -25,6 +25,7 @@ let H5_URL = "http://beta.h5.ymlive.fun"
extension UIFont{
static func getScaleFont(ofSize:CGFloat,weight:Weight)->UIFont{
return UIFont.systemFont(ofSize: UIDevice.scaleWidth(width: ofSize), weight: weight)

View File

@@ -37,13 +37,14 @@ class WebViewController: BaseViewController {
private(set) weak var navigationDelegate: WKNavigationDelegate?
private(set) var url: String?
var isHalf:Bool = false
convenience init(
url: String?,
navigationDelegate: WKNavigationDelegate? = nil
navigationDelegate: WKNavigationDelegate? = nil,isHalf:Bool = false
) {
self.init(nibName: nil, bundle: nil)
self.url = url
self.isHalf = isHalf
if var url = url {
if !url.hasPrefix("http") {
url = "\(H5_URL)/\(url)"
@@ -76,23 +77,51 @@ class WebViewController: BaseViewController {
}
private func loadSubViews() {
view.addSubview(webview)
view.addSubview(progressView)
progressView.snp.makeConstraints { make in
make.top.equalTo(view).offset(0)
make.left.right.equalTo(view).offset(0)
make.height.equalTo(1)
}
webview.snp.makeConstraints { make in
make.top.equalTo(view).offset(1)
make.left.right.bottom.equalTo(view)
}
if self.isHalf{
let bakcBtn = UIButton()
bakcBtn.addTarget(self, action: #selector(dissViewAction), for: .touchUpInside)
view.addSubview(bakcBtn)
bakcBtn.snp.makeConstraints { make in
make.edges.equalTo(view)
}
view.addSubview(webview)
view.addSubview(progressView)
progressView.snp.makeConstraints { make in
make.top.equalTo(view).offset(0)
make.left.right.equalTo(view).offset(0)
make.height.equalTo(1)
}
view.backgroundColor = .clear
webview.snp.makeConstraints { make in
make.left.bottom.right.equalTo(view)
make.height.equalTo(ScreenHeight * 0.65)
}
}else{
view.addSubview(webview)
view.addSubview(progressView)
progressView.snp.makeConstraints { make in
make.top.equalTo(view).offset(0)
make.left.right.equalTo(view).offset(0)
make.height.equalTo(1)
}
webview.snp.makeConstraints { make in
make.top.equalTo(view).offset(1)
make.left.right.bottom.equalTo(view)
}
}
progressView.trackTintColor = .clear
progressView.transform = .init(scaleX: 1, y: 1.5)
progressView.alpha = 0
}
@objc func dissViewAction(){
self.dismiss(animated: true)
}
override func observeValue(forKeyPath keyPath: String?, of object: Any?, change: [NSKeyValueChangeKey : Any]?, context: UnsafeMutableRawPointer?) {
if let object = object as? WKWebView, object == webview {
if keyPath == "estimatedProgress" {
@@ -164,7 +193,7 @@ class WebViewController: BaseViewController {
let str = String(data: data!,encoding:String.Encoding.utf8)
return str
}
}
extension WebViewController: WKScriptMessageHandler {

View File

@@ -106,5 +106,76 @@ extension Date {
dateformatter.dateFormat = dateFormat
return dateformatter.string(from: self)
}
private enum ConstellationType:String {
case , , , , , ,
, , , , ,
}
private static let constellationDict:[ConstellationType :String] = [.: "3.21-4.19",
.: "4.20-5.20",
.: "5.21-6.21",
.: "6.22-7.22",
.: "7.23-8.22",
.: "8.23-9.22",
.: "9.23-10.23",
.: "10.24-11.22",
.: "11.23-12.21",
.: "12.22-1.19",
.: "1.20-2.18",
.: "2.19-3.20"]
/// ->
/// - parameter date:
/// - returns:
public static func getCalculateWithDate(date: Date) -> String? {
let timeInterval = date.timeIntervalSince1970
let OneDay:Double = 86400
let currConstellation = constellationDict.filter {
let timeRange = getTimeRange(date: date, timeRange: $1)
let startTime = timeRange.0
let endTime = timeRange.1 + OneDay
return timeInterval > startTime && timeInterval < endTime
} //
return currConstellation.first?.key.rawValue ?? "摩羯座"
}
/// f.
private static func getTimeRange(date:Date, timeRange: String) -> (TimeInterval, TimeInterval) {
/// f.1
func getCurrYear(date:Date) -> String {
let dm = DateFormatter()
dm.dateFormat = "yyyy."
let currYear = dm.string(from: date)
return currYear
}
/// f.2
func toTimeInterval(dateStr: String) -> TimeInterval? {
let dm = DateFormatter()
dm.dateFormat = "yyyy.MM.dd"
let date = dm.date(from: dateStr)
let interval = date?.timeIntervalSince1970
return interval
}
let timeStrArr = timeRange.components(separatedBy: "-")
let dateYear = getCurrYear(date: date)
let startTimeStr = dateYear + timeStrArr.first!
let endTimeStr = dateYear + timeStrArr.last!
let startTime = toTimeInterval(dateStr: startTimeStr)!
let endTime = toTimeInterval(dateStr: endTimeStr)!
return (startTime, endTime)
}
}

View File

@@ -2,7 +2,7 @@
// UIButtom+.swift
// yinmeng-ios
//
// Created by duoban on 2024/3/6.
// Created by yinmeng on 2024/3/6.
//
import UIKit
@@ -35,22 +35,34 @@ extension UIButton {
return bounds.contains(point)
}
static func getCustomBtn(text:String? = nil,selectedText:String? = nil,font:UIFont? = nil,color:UIColor? = nil,selectedColor:UIColor? = nil,image:UIImage? = nil,selectedImage:UIImage? = nil,bgImage:UIImage? = nil) -> UIButton{
let customBtn = UIButton()
static func getCustomBtn(type:UIButton.ButtonType = .custom, text:String? = nil,selectedText:String? = nil,disabledText:String? = nil,font:UIFont? = nil,color:UIColor? = nil,selectedColor:UIColor? = nil,disabledColor:UIColor? = nil,image:UIImage? = nil,selectedImage:UIImage? = nil,bgImage:UIImage? = nil,selectedBgImage:UIImage? = nil,disabledBgImage:UIImage? = nil,masksToBounds:Bool = false,cornerRadius:CGFloat = 0,borderWidth:CGFloat = 0,borderColor:UIColor? = nil) -> UIButton{
let customBtn = UIButton(type: type)
customBtn.layer.masksToBounds = masksToBounds
customBtn.layer.cornerRadius = cornerRadius
customBtn.layer.borderWidth = borderWidth
if let _borderColor = borderColor{
customBtn.layer.borderColor = _borderColor.cgColor
}
if let _text = text{
customBtn.setTitle(text, for: .normal)
customBtn.setTitle(_text, for: .normal)
}
if let _selectedText = selectedText{
customBtn.setTitle(selectedText, for: .selected)
customBtn.setTitle(_selectedText, for: .selected)
}
if let _disabledText = disabledText{
customBtn.setTitle(_disabledText, for: .disabled)
}
if let _font = font{
customBtn.titleLabel?.font = font
customBtn.titleLabel?.font = _font
}
if let _color = color{
customBtn.setTitleColor(color, for: .normal)
customBtn.setTitleColor(_color, for: .normal)
}
if let _selectedColor = selectedColor{
customBtn.setTitleColor(selectedColor, for: .selected)
customBtn.setTitleColor(_selectedColor, for: .selected)
}
if let _disabledColor = disabledColor{
customBtn.setTitleColor(_disabledColor, for: .disabled)
}
if let _image = image{
customBtn.setImage(_image, for: .normal)
@@ -61,6 +73,12 @@ extension UIButton {
if let _bgImage = bgImage{
customBtn.setBackgroundImage(_bgImage, for: .normal)
}
if let _selectedBgImage = selectedBgImage{
customBtn.setBackgroundImage(_selectedBgImage, for: .selected)
}
if let _disabledBgImage = disabledBgImage{
customBtn.setBackgroundImage(_disabledBgImage, for: .disabled)
}
return customBtn
}

View File

@@ -2,15 +2,22 @@
// UILabel+.swift
// yinmeng-ios
//
// Created by duoban on 2024/3/6.
// Created by yinmeng on 2024/3/6.
//
import Foundation
extension UILabel{
static func getCustomLabel(text:String? = "",font:UIFont? = nil,color:UIColor? = nil,textAlignment:NSTextAlignment? = .left,numberOfLines:Int? = 1)->UILabel{
static func getCustomLabel(text:String? = "",font:UIFont? = nil,color:UIColor? = nil,textAlignment:NSTextAlignment? = .left,numberOfLines:Int? = 1,backgroundColor:UIColor? = nil,masksToBounds:Bool = false,cornerRadius:CGFloat = 0,borderWidth:CGFloat = 0,borderColor:UIColor? = nil)->UILabel{
let customView = UILabel()
customView.layer.masksToBounds = masksToBounds
customView.layer.cornerRadius = cornerRadius
customView.layer.borderWidth = borderWidth
if let _borderColor = borderColor{
customView.layer.borderColor = _borderColor.cgColor
}
if let _text = text {
customView.text = text
customView.text = _text
}
if let _font = font {
customView.font = _font
@@ -24,6 +31,9 @@ extension UILabel{
if let _numberOfLines = numberOfLines{
customView.numberOfLines = _numberOfLines
}
if let _backgroundColor = backgroundColor{
customView.backgroundColor = _backgroundColor
}
return customView
}
static func getLabelHeigth(text:String,width:CGFloat,font:UIFont)-> CGFloat{

View File

@@ -16,10 +16,13 @@ class AuthViewModel: NSObject {
var appId = ""
let loginSuccess = BehaviorSubject(value: false)
let resetPwd = PublishSubject<Bool>()
var clientInfoModel:YinClientInfoModel?
func appClientConfig() {
RequestGet(path: "client/init", parma: [:]) { data in
if let account = Deserialized<YinClientInfoModel>.toModel(with: data) {
self.clientInfoModel = account
}
if let _data = data as? [String:Any],let appId = _data["trtcAppId"] {
AuthViewModel.authVM.appId = "\(appId)"
}

View File

@@ -0,0 +1,12 @@
//
// YinClientInfoModel.swift
// yinmeng-ios
//
// Created by yinmeng on 2024/3/22.
//
import UIKit
import HandyJSON
struct YinClientInfoModel: HandyJSON {
var h5Uris:[YinRankH5UrlModel] = []
}

View File

@@ -0,0 +1,13 @@
//
// YinRankH5UrlModel.swift
// yinmeng-ios
//
// Created by yinmeng on 2024/3/22.
//
import UIKit
import HandyJSON
struct YinRankH5UrlModel: HandyJSON {
var code = ""
var uri = ""
}

View File

@@ -0,0 +1,26 @@
//
// ChatCustomMsgModel.swift
// yinmeng-ios
//
// Created by yinmeng on 2024/3/23.
//
import UIKit
import HandyJSON
class ChatCustomMsgModel: NSObject, HandyJSON,NIMCustomAttachment {
required override init(){
}
var first = 0
var second = 0
var data:[String:Any] = [:]
// encodeAttachment
func encode() -> String {
if let text = self.toJSONString(){
return text
}
return ""
}
}

View File

@@ -0,0 +1,16 @@
//
// ChatMsgRemoteModel.swift
// yinmeng-ios
//
// Created by yinmeng on 2024/3/23.
//
import UIKit
import HandyJSON
class ChatMsgRemoteModel: HandyJSON {
required init() {
}
}

View File

@@ -0,0 +1,40 @@
//
// YinCustomAttachmentCoding.swift
// yinmeng-ios
//
// Created by yinmeng on 2024/3/23.
//
import UIKit
import MJExtension
class YinCustomAttachmentCoding: NSObject,NIMCustomAttachmentCoding {
func decodeAttachment(_ content: String?) -> NIMCustomAttachment? {
if let text = content as? NSString{
if let data = text.mj_JSONObject() as? [String : Any],let first = data["first"] as? Int,let second = data["second"] as? Int,let dic = data["data"]{
if let _dic = dic as? [String : Any]{
let model = ChatCustomMsgModel()
model.first = first
model.second = second
model.data = _dic
return model
}
if let _dic = dic as? NSString,let getDic = _dic.mj_JSONObject(),let getData = getDic as? [String:Any]{
let model = ChatCustomMsgModel()
model.first = first
model.second = second
model.data = getData
return model
}
}
}
return nil
}
}

View File

@@ -0,0 +1,115 @@
//
// HomeSearchNavView.swift
// yinmeng-ios
//
// Created by yinmeng on 2024/3/21.
//
import UIKit
typealias ClickSearchBlcok = (_ type:Int)->Void
class HomeSearchNavView: UIView {
override init(frame: CGRect) {
super.init(frame: frame)
setUILayout()
}
required init?(coder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}
private func setUILayout(){
addSubview(leftArrowBtn)
addSubview(bgSearchView)
addSubview(searchBtn)
bgSearchView.addSubview(searchIconView)
bgSearchView.addSubview(textField)
leftArrowBtn.snp.makeConstraints { make in
make.width.height.equalTo(UIDevice.scaleWidth(width: 22))
make.leading.equalTo(UIDevice.scaleWidth(width: 8))
make.centerY.equalTo(bgSearchView)
}
bgSearchView.snp.makeConstraints { make in
make.height.equalTo(UIDevice.scaleWidth(width: 30))
make.leading.equalTo(leftArrowBtn.snp.trailing).offset((UIDevice.scaleWidth(width: 5)))
make.trailing.equalTo(searchBtn.snp.leading).offset(-UIDevice.scaleWidth(width: 13))
make.top.equalTo(UIDevice.scaleWidth(width: StatusBarHeight + 10))
}
searchBtn.snp.makeConstraints { make in
make.trailing.equalTo(-UIDevice.scaleWidth(width: 15))
make.centerY.equalTo(bgSearchView)
make.height.equalTo(UIDevice.scaleWidth(width: 30))
}
searchIconView.snp.makeConstraints { make in
make.width.height.equalTo(UIDevice.scaleWidth(width: 28))
make.centerY.equalTo(bgSearchView)
make.leading.equalTo(UIDevice.scaleWidth(width: 9))
}
textField.snp.makeConstraints { make in
make.leading.equalTo(searchIconView.snp.trailing).offset((UIDevice.scaleWidth(width: 0)))
make.trailing.top.bottom.equalTo(bgSearchView)
}
leftArrowBtn.addTarget(self, action: #selector(leftArroAction), for: .touchUpInside)
searchBtn.addTarget(self, action: #selector(searchBtnAction), for: .touchUpInside)
}
@objc func leftArroAction(){
if let clickSearchBlcok = self.clickSearchBlcok{
clickSearchBlcok(0)
}
}
@objc func searchBtnAction(){
textField.resignFirstResponder()
if let clickSearchBlcok = self.clickSearchBlcok{
clickSearchBlcok(1)
}
}
//MARK: -
var clickSearchBlcok:ClickSearchBlcok?
private lazy var leftArrowBtn:UIButton = {
let _leftArrowBtn = UIButton.getCustomBtn(image: UIImage(named: "yin_left_black_arrow"))
_leftArrowBtn.setBtnClickRadius = UIEdgeInsets(top: 10, left: 10, bottom: 10, right: 10)
return _leftArrowBtn
}()
private lazy var bgSearchView:UIView = {
let _bgSearchView = UIView()
_bgSearchView.backgroundColor = .white
_bgSearchView.layer.cornerRadius = UIDevice.scaleWidth(width: 30)/2
_bgSearchView.layer.masksToBounds = true
return _bgSearchView
}()
private lazy var searchIconView:UIImageView = {
let _searchIconView = UIImageView()
_searchIconView.isUserInteractionEnabled = true
_searchIconView.image = UIImage(named: "yin_search_vc_iocn")
return _searchIconView
}()
lazy var textField:UITextField = {
let _textField = UITextField()
_textField.layer.cornerRadius = UIDevice.scaleWidth(width: 30)/2
_textField.layer.masksToBounds = true
_textField.tintColor = ThemeColor(hexStr: "#878B9C")
_textField.textColor = ThemeColor(hexStr: "#282828")
_textField.backgroundColor = .clear
_textField.font = UIFont.getScaleFont(ofSize: 13, weight: .regular)
let att = NSAttributedString(string: "搜索昵称/ID/房间名",attributes: [.font:UIFont.getScaleFont(ofSize: 13, weight: .regular),.foregroundColor:ThemeColor(hexStr: "#878B9C")])
_textField.attributedPlaceholder = att
_textField.clearButtonMode = .whileEditing
_textField.returnKeyType = .search
_textField.enablesReturnKeyAutomatically = true
return _textField
}()
private lazy var searchBtn:UIButton = {
let _searchBtn = UIButton.getCustomBtn(text: "搜索",font: UIFont.getScaleFont(ofSize: 16, weight: .medium),color: ThemeColor(hexStr: "#878B9C"))
_searchBtn.setBtnClickRadius = UIEdgeInsets(top: 10, left: 10, bottom: 10, right: 10)
return _searchBtn
}()
}

View File

@@ -0,0 +1,166 @@
//
// HomeSearchRoomCell.swift
// yinmeng-ios
//
// Created by yinmeng on 2024/3/21.
//
import UIKit
import Nuke
class HomeSearchRoomCell: UITableViewCell {
override init(style: UITableViewCell.CellStyle, reuseIdentifier: String?) {
super.init(style: style, reuseIdentifier: reuseIdentifier)
setUILayout()
}
required init?(coder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}
private func setUILayout(){
selectionStyle = .none
backgroundColor = .clear
contentView.addSubview(avatarView)
contentView.addSubview(nickStackView)
contentView.addSubview(idView)
contentView.addSubview(numView)
contentView.addSubview(dividerView)
numView.addSubview(onlienTextView)
numView.addSubview(bgOnlineView)
nickStackView.addArrangedSubview(textVeiw)
nickStackView.addArrangedSubview(genderView)
avatarView.snp.makeConstraints { make in
make.width.height.equalTo(UIDevice.scaleWidth(width: 45))
make.leading.equalTo(UIDevice.scaleWidth(width: 15))
make.centerY.equalTo(contentView)
}
nickStackView.snp.makeConstraints { make in
make.leading.equalTo(avatarView.snp.trailing).offset((UIDevice.scaleWidth(width: 13)))
make.height.equalTo(UIDevice.scaleWidth(width: 20))
make.bottom.equalTo(avatarView.snp.centerY).offset(-UIDevice.scaleWidth(width: 1.5))
}
idView.snp.makeConstraints { make in
make.leading.equalTo(nickStackView)
make.top.equalTo(avatarView.snp.centerY).offset(UIDevice.scaleWidth(width: 1.5))
}
dividerView.snp.makeConstraints { make in
make.leading.equalTo(nickStackView)
make.trailing.equalTo(-UIDevice.scaleWidth(width: 15))
make.bottom.equalTo(contentView)
make.height.equalTo(UIDevice.scaleWidth(width: 1))
}
numView.snp.makeConstraints { make in
make.height.equalTo(UIDevice.scaleWidth(width: 18))
make.trailing.equalTo(-UIDevice.scaleWidth(width: 15))
make.centerY.equalTo(contentView)
make.leading.equalTo(bgOnlineView.snp.leading).offset(-UIDevice.scaleWidth(width: 8))
}
onlienTextView.snp.makeConstraints { make in
make.centerY.equalTo(numView)
make.trailing.equalTo(numView.snp.trailing).offset(-UIDevice.scaleWidth(width:5))
}
bgOnlineView.snp.makeConstraints { make in
make.width.equalTo(UIDevice.scaleWidth(width: 10))
make.height.equalTo(UIDevice.scaleWidth(width: 9))
make.centerY.equalTo(numView)
make.trailing.equalTo(onlienTextView.snp.leading).offset(-UIDevice.scaleWidth(width:3))
}
}
func setModel(model:HomeSearchRoomModel,type:Int){
Nuke.loadImage(with: model.avatar, into: avatarView, completion: nil)
textVeiw.text = type == 0 ? model.title : model.nick
idView.text = "ID:" + model.erbanNo
genderView.image = model.gender == .Boy ? UIImage(named: "yin_plane_star_man") : UIImage(named: "yin_plane_star__woman")
if type == 0{
if model.onlineNum > 100{
onlienTextView.text = "\(model.onlineNum)"
}else{
onlienTextView.text = " \(model.onlineNum) "
}
numView.isHidden = !model.valid
return
}
onlienTextView.text = "直播中"
numView.isHidden = model.roomUid.count <= 0
}
//MARK: -
private lazy var avatarView:UIImageView = {
let _avatarView = UIImageView()
_avatarView.layer.cornerRadius = UIDevice.scaleWidth(width: 45)/2
_avatarView.layer.masksToBounds = true
_avatarView.contentMode = .scaleAspectFill
return _avatarView
}()
private lazy var nickStackView:UIStackView = {
let _nickStackView = UIStackView()
_nickStackView.axis = .horizontal
_nickStackView.distribution = .fill
_nickStackView.alignment = .center
_nickStackView.spacing = UIDevice.scaleWidth(width: 2)
return _nickStackView
}()
private lazy var textVeiw:UILabel = {
let _textVeiw = UILabel.getCustomLabel(font: UIFont.getScaleFont(ofSize: 15, weight: .regular),color: ThemeColor(hexStr: "#878B9C"))
return _textVeiw
}()
private lazy var genderView:UIImageView = {
let _genderView = UIImageView()
_genderView.isUserInteractionEnabled = true
return _genderView
}()
private lazy var idView:UILabel = {
let _idView = UILabel.getCustomLabel(font: UIFont.getScaleFont(ofSize: 13, weight: .regular),color: ThemeColor(hexStr: "#BDBFD0"))
return _idView
}()
private lazy var dividerView:UIView = {
let _dividerView = UIView()
_dividerView.backgroundColor = ThemeColor(hexStr: "#E8E8E8")
return _dividerView
}()
private lazy var numView:UIView = {
let _numView = UIView()
_numView.backgroundColor = .clear
_numView.layer.masksToBounds = true
_numView.layer.cornerRadius = UIDevice.scaleWidth(width: 18)/2
_numView.layer.borderColor = ThemeColor(hexStr: "#248CFE").cgColor
_numView.layer.borderWidth = 1
return _numView
}()
private lazy var bgOnlineView:UIImageView = {
let _bgOnlineView = UIImageView()
_bgOnlineView.image = UIImage(named: "home_search_online_icon")
return _bgOnlineView
}()
private lazy var onlienTextView:UILabel = {
let _onlienTextView = UILabel.getCustomLabel(text: "直播中",font: UIFont.getScaleFont(ofSize: 10, weight: .regular),color: ThemeColor(hexStr: "#248CFE"))
return _onlienTextView
}()
override func awakeFromNib() {
super.awakeFromNib()
// Initialization code
}
override func setSelected(_ selected: Bool, animated: Bool) {
super.setSelected(selected, animated: animated)
// Configure the view for the selected state
}
}

View File

@@ -0,0 +1,28 @@
//
// HomeSearchRoomModel.swift
// yinmeng-ios
//
// Created by yinmeng on 2024/3/21.
//
import Foundation
import HandyJSON
struct HomeSearchRoomModel:HandyJSON{
var avatar = ""
var onlineNum:Int = 0
var uid = ""
var title = ""
var nick = ""
var erbanNo = ""
var valid = false
var gender:UserSexType = .Boy
var roomUid = ""
}

View File

@@ -0,0 +1,93 @@
//
// HomeSearchRoomVC.swift
// yinmeng-ios
//
// Created by yinmeng on 2024/3/21.
//
import UIKit
class HomeSearchRoomVC: BaseViewController {
init(type:Int){
super.init(nibName: nil, bundle: nil)
self.type = type
}
required init?(coder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}
override func viewDidLoad() {
super.viewDidLoad()
setUILayout()
}
private func setUILayout(){
view.addSubview(tableView)
view.backgroundColor = .clear
tableView.snp.makeConstraints { make in
make.edges.equalTo(view)
}
tableView.delegate = self
tableView.dataSource = self
tableView.register(HomeSearchRoomCell.self, forCellReuseIdentifier: "HomeSearchRoomCell")
}
func requestData(text:String){
let params = ["page":"1","pageSize":"50","key":text,"type":"\(type+1)"]
RequestGet(path: "search/room", parma: params) { data in
if let list = Deserialized<HomeSearchRoomModel>.toArray(with: data) {
self.listData = list
self.tableView.reloadData()
}
} fail: { code, message in
HUDTool.show(with: message)
}
}
var listData:[HomeSearchRoomModel] = []
var type:Int = 0
//MARK: -
private lazy var tableView:UITableView = {
let _tableView = UITableView(frame: .zero, style: .plain)
_tableView.tableHeaderView = UIView()
_tableView.tableFooterView = UIView()
_tableView.separatorStyle = .none
_tableView.backgroundColor = .clear
return _tableView
}()
}
extension HomeSearchRoomVC:JXCategoryListContentViewDelegate,UITableViewDelegate,UITableViewDataSource{
func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return listData.count
}
func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat {
return UIDevice.scaleWidth(width: 74)
}
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCell(withIdentifier: "HomeSearchRoomCell", for: indexPath) as! HomeSearchRoomCell
cell.setModel(model: listData[indexPath.row], type: type)
return cell
}
func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
if type == 1 {return}
let model = listData[indexPath.row]
if model.valid {
self.dismiss(animated: true) {
let vc = RoomVC(roomUid: model.uid)
vc.roomText = model.title + "的房间"
let nav = BaseNavigationViewController.init(rootViewController: vc)
nav.modalPresentationStyle = .fullScreen
keyWindow.rootViewController?.present(nav, animated: true, completion: nil)
}
return
}
HUDTool.show(with: "该用户的房间已失效")
}
func listView() -> UIView! {
return self.view
}
}

View File

@@ -0,0 +1,121 @@
//
// HomeSearchVC.swift
// yinmeng-ios
//
// Created by yinmeng on 2024/3/21.
//
import UIKit
class HomeSearchVC: BaseViewController,HiddenNavigationBarProtocol {
override func viewDidLoad() {
super.viewDidLoad()
setUILayout()
requestData()
}
private func setUILayout(){
view.addSubview(navView)
view.addSubview(pageTitleView)
view.addSubview(containerView)
view.backgroundColor = ThemeColor(hexStr: "#F8F8FB")
navView.snp.makeConstraints { make in
make.leading.trailing.top.equalTo(view)
make.height.equalTo(NavHeight)
}
pageTitleView.snp.makeConstraints { make in
make.leading.trailing.equalTo(view).inset(UIDevice.scaleWidth(width: 0))
make.top.equalTo(navView.snp.bottom).offset(UIDevice.scaleWidth(width: 10))
make.height.equalTo(UIDevice.scaleWidth(width: 50))
}
containerView.snp.makeConstraints { make in
make.top.equalTo(pageTitleView.snp.bottom).offset(UIDevice.scaleWidth(width: 10))
make.leading.trailing.bottom.equalTo(view)
}
navView.textField.delegate = self
navView.clickSearchBlcok = {[weak self] type in
guard let self = self else { return }
if type == 0{
self.dismiss(animated: true, completion: nil)
return
}
self.roomView.requestData(text:self.navView.textField.text ?? "")
self.userView.requestData(text: self.navView.textField.text ?? "")
}
pageTitleView.listContainer = containerView
}
private func requestData(){
}
//MARK: -
private lazy var navView:HomeSearchNavView = {
let _navView = HomeSearchNavView(frame: .zero)
return _navView
}()
private lazy var pageTitleView:JXCategoryTitleView = {
let _pageTitleView = JXCategoryTitleView()
_pageTitleView.delegate = self
_pageTitleView.titles = ["房间","用户"]
_pageTitleView.titleColor = ThemeColor(hexStr: "#878B9C")
_pageTitleView.titleSelectedColor = ThemeColor(hexStr: "#282828")
_pageTitleView.titleFont = UIFont.getScaleFont(ofSize: 16, weight: .medium)
_pageTitleView.titleSelectedFont = UIFont.getScaleFont(ofSize: 16, weight: .medium)
_pageTitleView.titleLabelAnchorPointStyle = JXCategoryTitleLabelAnchorPointStyle.center
_pageTitleView.isContentScrollViewClickTransitionAnimationEnabled = false
_pageTitleView.defaultSelectedIndex = 0
let lineView = JXCategoryIndicatorLineView()
lineView.indicatorColor = ThemeColor(hexStr: "#FFE710")
lineView.indicatorWidth = UIDevice.scaleWidth(width: 8)
lineView.indicatorHeight = UIDevice.scaleWidth(width: 8) / 2
lineView.indicatorCornerRadius = UIDevice.scaleWidth(width: 8) / 4
_pageTitleView.indicators = [lineView]
return _pageTitleView
}()
private lazy var containerView:JXCategoryListContainerView = {
let _containerView = JXCategoryListContainerView.init(type: .scrollView, delegate: self)!
_containerView.setDefaultSelectedIndex(0)
return _containerView
}()
private lazy var roomView:HomeSearchRoomVC = {
let _roomView = HomeSearchRoomVC(type: 0)
return _roomView
}()
private lazy var userView:HomeSearchRoomVC = {
let _userView = HomeSearchRoomVC(type: 1)
return _userView
}()
}
extension HomeSearchVC:JXCategoryListContainerViewDelegate,JXCategoryViewDelegate,UITextFieldDelegate{
func number(ofListsInlistContainerView listContainerView: JXCategoryListContainerView!) -> Int {
return 2
}
func listContainerView(_ listContainerView: JXCategoryListContainerView!, initListFor index: Int) -> JXCategoryListContentViewDelegate! {
return index == 0 ? roomView : userView
}
func textFieldShouldReturn(_ textField: UITextField) -> Bool {
guard let text = textField.text else {
HUDTool.show(with: "请输入需要搜索的内容")
return true
}
if text.count > 0{
textField.resignFirstResponder()
roomView.requestData(text: text)
userView.requestData(text: text)
}else{
HUDTool.show(with: "请输入需要搜索的内容")
}
return true
}
}

View File

@@ -21,4 +21,5 @@ struct HomeVoiceModel : HandyJSON, Codable {
var userVoice = ""
var voiceDura = ""
var userDesc = ""
var birth:Int64 = 0
}

View File

@@ -0,0 +1,55 @@
//
// HomeVoiceSearchView.swift
// yinmeng-ios
//
// Created by yinmeng on 2024/3/20.
//
import UIKit
class HomeVoiceSearchView: UIView {
override init(frame: CGRect) {
super.init(frame: frame)
setUILayout()
}
required init?(coder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}
private func setUILayout(){
addSubview(bgImageView)
addSubview(iconView)
addSubview(textVeiw)
bgImageView.snp.makeConstraints { make in
make.edges.equalTo(self)
}
iconView.snp.makeConstraints { make in
make.width.height.equalTo(UIDevice.scaleWidth(width: 18))
make.leading.equalTo(UIDevice.scaleWidth(width: 9))
make.centerY.equalTo(self)
}
textVeiw.snp.makeConstraints { make in
make.leading.equalTo(UIDevice.scaleWidth(width: 31))
make.centerY.equalTo(self)
}
}
//MARK: -
private lazy var bgImageView:UIImageView = {
let _bgImageView = UIImageView()
_bgImageView.image = UIImage(named: "yin_home_voice_search_bg")
return _bgImageView
}()
private lazy var iconView:UIImageView = {
let _iconView = UIImageView()
_iconView.image = UIImage(named: "yin_home_voice_search_icon")
return _iconView
}()
private lazy var textVeiw:UILabel = {
let _textVeiw = UILabel.getCustomLabel(text: "搜索房间",font: UIFont.getScaleFont(ofSize: 14, weight: .regular),color: ThemeColor(hexStr: "#CCCCCC"))
return _textVeiw
}()
}

View File

@@ -9,7 +9,7 @@ import UIKit
import Nuke
typealias ClickBtnBlock = (_ type: Int ,_ model:HomeVoiceModel)->Void
typealias ClickBtnBlock = (_ type: Int ,_ uid:String)->Void
class HomeVoiceUserInfoView: UIView {
@@ -33,12 +33,16 @@ class HomeVoiceUserInfoView: UIView {
bgVoiceVeiw.addSubview(playBtn)
bgVoiceVeiw.addSubview(waveView)
bgVoiceVeiw.addSubview(playTimeView)
backgroundView.addSubview(lineView)
backgroundView.addSubview(attentionBtn)
backgroundView.addSubview(lineView1)
backgroundView.addSubview(chatBtn)
backgroundView.addSubview(tagStackView)
tagStackView.addArrangedSubview(attentionBtn)
tagStackView.addArrangedSubview(lineView1)
tagStackView.addArrangedSubview(sendGfitBtn)
tagStackView.addArrangedSubview(lineView2)
tagStackView.addArrangedSubview(chatBtn)
dissView.snp.makeConstraints { make in
make.edges.equalTo(self)
}
@@ -79,7 +83,7 @@ class HomeVoiceUserInfoView: UIView {
make.height.equalTo(128)
}
signatureView.snp.makeConstraints { make in
make.left.top.right.equalTo(16)
make.left.top.right.equalTo(self.bgSignatureView).inset(16)
make.height.equalTo(54)
}
@@ -112,21 +116,22 @@ class HomeVoiceUserInfoView: UIView {
make.top.equalTo(self.bgSignatureView.snp.bottom).offset(16)
}
tagStackView.snp.makeConstraints { make in
make.leading.bottom.trailing.equalTo(backgroundView)
make.top.equalTo(230)
}
lineView1.snp.makeConstraints { make in
make.width.equalTo(1)
make.height.equalTo(18)
make.top.equalTo(237)
make.centerX.equalTo(self.backgroundView)
}
attentionBtn.snp.makeConstraints { make in
make.top.equalTo(self.lineView)
make.bottom.left.equalTo(self.backgroundView)
make.right.equalTo(self.lineView1.snp.left)
}
chatBtn.snp.makeConstraints { make in
make.top.height.width.equalTo(self.attentionBtn)
make.left.equalTo(self.lineView1.snp.right)
lineView2.snp.makeConstraints { make in
make.width.equalTo(1)
make.height.equalTo(18)
}
let layer = CAShapeLayer()
let path = UIBezierPath.init(roundedRect: CGRect(x: 0, y: 0, width: 130, height: 28), byRoundingCorners: [.topRight , .bottomRight,.bottomLeft] , cornerRadii: CGSize(width: 14, height: 14))
layer.path = path.cgPath
@@ -135,18 +140,25 @@ class HomeVoiceUserInfoView: UIView {
required init?(coder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}
@objc func sendGiftBtnAction(){
if let _clickBtnBlock = clickBtnBlock,let uid = self.user?.uid{
_clickBtnBlock(5,"\(uid)")
self.removeFromSuperview()
}
}
@objc func attentionBtnAction(){
if self.type == 1{
if let _clickBtnBlock = clickBtnBlock,let _model = self.model{
_clickBtnBlock(3,_model)
if let _clickBtnBlock = clickBtnBlock,let uid = self.model?.uid{
_clickBtnBlock(3,"\(uid)")
}
return
}
self.attentionBtn.isSelected = !self.attentionBtn.isSelected
let type = self.attentionBtn.isSelected ? "1" : "2"
guard let uid = self.model?.uid else{return}
let params = ["uid":"\(AuthManager.userUid)","ticket":AuthManager.ticket,"type":type,"likedUid":"\(uid)"] as [String : Any]
let uid = self.model != nil ? self.model?.uid : self.user?.uid
guard let getUid = uid else{return}
let params = ["uid":"\(AuthManager.userUid)","ticket":AuthManager.ticket,"type":type,"likedUid":"\(getUid)"] as [String : Any]
RequestPost(path: "fans/like", parma: params) { data in
if(self.attentionBtn.isSelected){
@@ -160,15 +172,19 @@ class HomeVoiceUserInfoView: UIView {
}
@objc func chatBtnAction(){
if self.type == 1{
if let _clickBtnBlock = clickBtnBlock,let _model = self.model{
_clickBtnBlock(4,_model)
if let _clickBtnBlock = clickBtnBlock,let uid = self.model?.uid{
_clickBtnBlock(4,"\(uid)")
}
return
}
if let _clickBtnBlock = clickBtnBlock,let _model = self.model{
_clickBtnBlock(0,_model)
if let _clickBtnBlock = clickBtnBlock, let uid = self.model?.uid{
_clickBtnBlock(0,"\(uid)")
}
if let _clickBtnBlock = clickBtnBlock, let uid = self.user?.uid{
_clickBtnBlock(0,"\(uid)")
}
}
@objc func playVoiceAction(){
guard let userVoice = self.model?.userVoice else {
@@ -182,6 +198,42 @@ class HomeVoiceUserInfoView: UIView {
}
}
var user:UserObject? = nil{
didSet{
guard let _user = user else { return }
Nuke.loadImage(with: _user.avatar, into: avatarView)
nameTextView.text = _user.nick
sexImageView.image = _user.gender == .Boy ? UIImage(named: "yin_plane_star_man") : UIImage(named: "yin_plane_star__woman")
signatureView.text = _user.userDesc.isEmpty ? "这个人很懒还没有签名" : _user.userDesc
bgVoiceVeiw.isHidden = true
guard let uid = _user.uid else{return}
let params = ["uid":uid]
RequestGet(path: "user/get", parma: params) { data in
if let info = Deserialized<UserObject>.toModel(with: data) {
self.signatureView.text = info.userDesc.isEmpty ? "这个人很懒还没有签名" : info.userDesc
let timeStamp = info.birth / 1000
let timeInterval:TimeInterval = TimeInterval(timeStamp)
let date = NSDate(timeIntervalSince1970: timeInterval) as Date
self.starView.text = Date.getCalculateWithDate(date: date)
self.starView.isHidden = false
}
} fail: { code, message in
}
RequestGet(path: "fans/islike", parma: ["uid":"\(AuthManager.userUid)","isLikeUid":"\(uid)"]) { data in
if let isLike = data as? Bool{
self.attentionBtn.isSelected = isLike
}
} fail: { code, data in
}
}
}
var model:HomeVoiceModel? = nil {
didSet{
guard let _model = model else {
@@ -190,8 +242,16 @@ class HomeVoiceUserInfoView: UIView {
Nuke.loadImage(with: _model.avatar, into: avatarView)
nameTextView.text = _model.nick
sexImageView.image = _model.gender == 1 ? UIImage(named: "yin_plane_star_man") : UIImage(named: "yin_plane_star__woman")
let timeStamp = _model.birth / 1000
let timeInterval:TimeInterval = TimeInterval(timeStamp)
let date = NSDate(timeIntervalSince1970: timeInterval) as Date
starView.text = Date.getCalculateWithDate(date: date)
starView.text = "天蠍座"
starView.isHidden = false
signatureView.text = _model.userDesc.isEmpty ? "这个人很懒还没有签名" : _model.userDesc
bgVoiceVeiw.isHidden = _model.userVoice.isEmpty
playTimeView.text = "\(_model.voiceDura)\""
@@ -255,6 +315,7 @@ class HomeVoiceUserInfoView: UIView {
_starView.backgroundColor = ThemeColor(hexStr: "#E9E1FF")
_starView.layer.cornerRadius = 9
_starView.layer.masksToBounds = true
_starView.isHidden = true
return _starView
}()
var bgSignatureView:UIView = {
@@ -269,6 +330,7 @@ class HomeVoiceUserInfoView: UIView {
_signatureView.font = UIFont.systemFont(ofSize: 13, weight: .regular)
_signatureView.textColor = ThemeColor(hexStr: "#1F1B4F")
_signatureView.text = ""
_signatureView.numberOfLines = 0
return _signatureView
}()
@@ -298,21 +360,39 @@ class HomeVoiceUserInfoView: UIView {
_playTimeView.font = UIFont.systemFont(ofSize: 14, weight: .medium)
return _playTimeView
}()
var type:Int = 0 {
didSet{
lineView2.isHidden = true
sendGfitBtn.isHidden = true
if type == 0{
attentionBtn.setImage(UIImage(named: "yin_plane_star_no_attention_icon"), for: .normal)
attentionBtn.setTitle(" 关注", for: .normal)
chatBtn.setImage(UIImage(named: "yin_home_voice_chat_icon"), for: .normal)
chatBtn.setTitle(" 私聊", for: .normal)
}else{
}else if type == 1{
attentionBtn.setImage(UIImage(named: "yin_plane_star_pay_icon"), for: .normal)
attentionBtn.setTitle(" 充值", for: .normal)
chatBtn.setImage(UIImage(named: "yin_home_voice_collect_icon"), for: .normal)
chatBtn.setTitle(" 收藏", for: .normal)
}else{
attentionBtn.setImage(UIImage(named: "yin_plane_star_no_attention_icon"), for: .normal)
attentionBtn.setTitle(" 关注", for: .normal)
chatBtn.setImage(UIImage(named: "yin_home_voice_chat_icon"), for: .normal)
chatBtn.setTitle(" 私聊", for: .normal)
lineView2.isHidden = false
sendGfitBtn.isHidden = false
}
}
}
private lazy var tagStackView:UIStackView = {
let _tagStackView = UIStackView()
_tagStackView.axis = .horizontal
_tagStackView.distribution = .fillProportionally
_tagStackView.alignment = .center
_tagStackView.spacing = UIDevice.scaleWidth(width: 0)
return _tagStackView
}()
var attentionBtn:UIButton = {
let _attentionBtn = UIButton()
@@ -326,6 +406,20 @@ class HomeVoiceUserInfoView: UIView {
return _attentionBtn
}()
var sendGfitBtn:UIButton = {
let _sendGfitBtn = UIButton()
_sendGfitBtn.setImage(UIImage(named: "yin_plane_star_send_gift_icon"), for: .normal)
_sendGfitBtn.setTitle(" 送礼", for: .normal)
_sendGfitBtn.setTitleColor(.white, for: .normal)
_sendGfitBtn.titleLabel?.font = UIFont.systemFont(ofSize: 15, weight: .medium)
_sendGfitBtn.setImage(UIImage(named: "yin_plane_star_send_gift_icon"), for: .selected)
_sendGfitBtn.addTarget(self, action: #selector(sendGiftBtnAction), for: .touchUpInside)
return _sendGfitBtn
}()
var chatBtn:UIButton = {
let _chatBtn = UIButton()
@@ -350,5 +444,12 @@ class HomeVoiceUserInfoView: UIView {
return _lineView1
}()
var lineView2:UIView = {
let _lineView2 = UIView()
_lineView2.backgroundColor = UIColor.init(white: 1, alpha: 0.2)
return _lineView2
}()
}

View File

@@ -35,13 +35,13 @@ class HomeVoiceVC: BaseViewController,HiddenNavigationBarProtocol {
}
@objc func userInfoBtnAction(){
let userInfoView:HomeVoiceUserInfoView = HomeVoiceUserInfoView.init(frame: .zero)
userInfoView.clickBtnBlock = {[weak self] (type,model) in
userInfoView.clickBtnBlock = {[weak self] (type,uid) in
guard let weakSelf = self else {
return
}
if type == 3{
let vc = UserPayViewController()
self?.navigationController?.pushViewController(vc, animated: true)
weakSelf.navigationController?.pushViewController(vc, animated: true)
return
}
}
@@ -69,6 +69,7 @@ class HomeVoiceVC: BaseViewController,HiddenNavigationBarProtocol {
view.addSubview(backgroundView)
view.addSubview(scrollView)
scrollView.addSubview(topLogoIcon)
scrollView.addSubview(searchView)
scrollView.addSubview(chooseItemVeiw)
scrollView.addSubview(changeItemView)
scrollView.addSubview(userInfoBtn)
@@ -89,9 +90,16 @@ class HomeVoiceVC: BaseViewController,HiddenNavigationBarProtocol {
topLogoIcon.snp.makeConstraints { make in
make.left.equalTo(20)
make.top.equalTo(14 + NavHeight)
make.width.equalTo(260)
make.width.equalTo(76)
make.height.equalTo(23)
}
searchView.snp.makeConstraints { make in
make.leading.equalTo(topLogoIcon.snp.trailing).offset((UIDevice.scaleWidth(width: 18)))
make.height.equalTo(UIDevice.scaleWidth(width: 30))
make.width.equalTo(UIDevice.scaleWidth(width: 240))
make.centerY.equalTo(topLogoIcon)
}
chooseItemVeiw.snp.makeConstraints { make in
make.left.equalTo(20)
make.top.equalTo(self.topLogoIcon.snp.bottom).offset(18)
@@ -172,13 +180,14 @@ class HomeVoiceVC: BaseViewController,HiddenNavigationBarProtocol {
return
}
let userInfoView:HomeVoiceUserInfoView = HomeVoiceUserInfoView.init(frame: .zero)
userInfoView.clickBtnBlock = {[weak self] (type,model) in
userInfoView.clickBtnBlock = {[weak self] (type,uid) in
let session = NIMSession("\(model.uid)", type: .P2P)
let session = NIMSession(uid, type: .P2P)
let chatVC = ChatVC.init(session: session)
self?.navigationController?.pushViewController(chatVC, animated: true)
}
userInfoView.model = model
userInfoView.type = 0
weakSelf.view.addSubview(userInfoView)
userInfoView.snp.makeConstraints { make in
make.edges.equalTo(weakSelf.view)
@@ -192,8 +201,15 @@ class HomeVoiceVC: BaseViewController,HiddenNavigationBarProtocol {
make.edges.equalTo((self?.view)!)
}
}
let searchTap = UITapGestureRecognizer(target: self, action: #selector(clickSearchAction))
searchView.addGestureRecognizer(searchTap)
}
@objc func clickSearchAction(){
let searchVC = HomeSearchVC()
searchVC.modalPresentationStyle = .fullScreen
navigationController?.present(searchVC, animated: true, completion: nil)
}
@objc func clickLongTapAction(sender:UIPanGestureRecognizer){
let i = (sender.view?.tag ?? 100) - 100
if sender.state == .began{
@@ -233,12 +249,13 @@ class HomeVoiceVC: BaseViewController,HiddenNavigationBarProtocol {
}
let userInfoView:HomeVoiceUserInfoView = HomeVoiceUserInfoView.init(frame: .zero)
userInfoView.clickBtnBlock = {[weak self] (type,model) in
userInfoView.clickBtnBlock = {[weak self] (type,uid) in
let session = NIMSession("\(model.uid)", type: .P2P)
let session = NIMSession(uid, type: .P2P)
let chatVC = ChatVC.init(session: session)
self?.navigationController?.pushViewController(chatVC, animated: true)
}
userInfoView.type = 0
userInfoView.model = view.model
self.view.addSubview(userInfoView)
userInfoView.snp.makeConstraints { make in
@@ -321,7 +338,11 @@ class HomeVoiceVC: BaseViewController,HiddenNavigationBarProtocol {
_changeItemView.text = "换一换"
return _changeItemView
}()
private lazy var searchView:HomeVoiceSearchView = {
let _searchView = HomeVoiceSearchView(frame: .zero)
return _searchView
}()
var userInfoBtn:UIButton = {
let _userInfoBtn = UIButton()
_userInfoBtn.setBackgroundImage(UIImage(named: "yin_home_voice_user_info_bg"), for: .normal)

View File

@@ -90,7 +90,52 @@ class PlayVoiceManager: NSObject,AVAudioPlayerDelegate {
downloadTask.resume()
}
static func downloadFile(url:String,complete:@escaping(_ url:String)->Void,fail:@escaping()->Void){
let list = url.components(separatedBy: "/")
var name = "FileList"
if list.isEmpty == false,let getName = list.last{
name = getName
}
let path = NSSearchPathForDirectoriesInDomains(.documentDirectory,.userDomainMask,true)[0] as String
let allPath = path + "/kUserFile/" + name
if FileManager.default.fileExists(atPath: allPath){
complete(allPath)
}else{
do {
try FileManager.default.createDirectory(atPath: allPath, withIntermediateDirectories: true, attributes: nil)
//
let request = URLRequest(url: URL(string: url)!)
let session = URLSession.shared
//
let downloadTask = session.downloadTask(with: request,
completionHandler: { (location:URL?, response:URLResponse?, error:Error?)
-> Void in
guard let locationPath = location?.path else{return}
do {
if FileManager.default.fileExists(atPath: allPath){
try FileManager.default.removeItem(atPath: allPath)
}
// document
try FileManager.default.copyItem(atPath: locationPath, toPath: allPath)
// main
DispatchQueue.main.async {
complete(allPath)
}
} catch let error {
fail()
}
})
//使resume
downloadTask.resume()
}catch let error{
fail()
}
}
}

View File

@@ -2,7 +2,7 @@
// RoomChatData.swift
// yinmeng-ios
//
// Created by duoban on 2024/3/11.
// Created by yinmeng on 2024/3/11.
//
import Foundation

View File

@@ -2,7 +2,7 @@
// RoomDataModel.swift
// yinmeng-ios
//
// Created by duoban on 2024/3/11.
// Created by yinmeng on 2024/3/11.
//
import Foundation
@@ -23,5 +23,7 @@ struct RoomDataModel : HandyJSON {
var onlineNum:Int = 0
var defUser = ""
var type:Int = 3
var audioSdkType = ""
var showGiftValue = false
}

View File

@@ -0,0 +1,59 @@
//
// YinRoomAgoraManager.swift
// yinmeng-ios
//
// Created by yinmeng on 2024/3/22.
//
import UIKit
class YinRoomAgoraManager: NSObject {
func initAgora(){
let manager = AgoraRtcEngineKit.sharedEngine(withAppId: AppKeys.agoraKey, delegate: self)
manager.setChannelProfile(.liveBroadcasting)
manager.startLastmileProbeTest(nil)
manager.setParameters("{\"che.audio.keep.audiosession\":true}")
manager.enableAudio()
manager.disableVideo()
manager.enableAudioVolumeIndication(900, smooth: 3, reportVad: true)
manager.setAudioProfile(.musicStandard)
manager.setAudioScenario(.gameStreaming)
#if DEBUG
manager.setLogFilter(0x000f)
#else
manager.setLogFilter(0)
#endif
self.manager = manager
}
func setAgora(roomUid:String){
manager?.setClientRole(.audience)
manager?.joinChannel(byToken: nil, channelId: roomUid, info: nil, uid: UInt(AuthManager.userUid)) { c, uid, e in
self.manager?.muteAllRemoteAudioStreams(false)
self.muteLocalAudio(mute: false)
}
}
func muteLocalAudio(mute:Bool){
manager?.muteLocalAudioStream(mute)
}
func setBroadcast(isChange:Bool){
manager?.setClientRole(isChange ? .broadcaster : .audience)
}
func exitRoom(){
manager?.leaveChannel { stats in
}
}
func destroySharedIntance(){
AgoraRtcEngineKit.destroy()
}
private var manager:AgoraRtcEngineKit?
}
extension YinRoomAgoraManager:AgoraRtcEngineDelegate{
func rtcEngine(_ engine: AgoraRtcEngineKit, reportAudioVolumeIndicationOfSpeakers speakers: [AgoraRtcAudioVolumeInfo], totalVolume: Int) {
NotificationCenter.default.post(name: NSNotification.Name(rawValue: "kReceiveUserVoiceVolume") , object: nil, userInfo: ["userVolumes":speakers,"totalVolume":totalVolume,"type":"agora"])
}
}

View File

@@ -0,0 +1,82 @@
//
// YinRoomAudioanager.swift
// yinmeng-ios
//
// Created by yinmeng on 2024/3/22.
//
import UIKit
enum YinRoomAudioManagerType {
case trtc,agora
}
class YinRoomAudioManager: NSObject {
static let share = YinRoomAudioManager()
var type:YinRoomAudioManagerType = .trtc
var roomId = ""
func dealWithChatData(roomData:RoomDataModel){
if roomId == roomData.roomId{
return
}
roomId = roomData.roomId
type = roomData.audioSdkType == "trtc" ? .trtc : .agora
if type == .trtc{
roomTRTCManager.initRTRC()
roomTRTCManager.roomData = roomData
roomTRTCManager.setTRTC()
}else{
agoraManager.initAgora()
agoraManager.setAgora(roomUid: roomData.roomId)
}
}
func muteLocalAudio(mute:Bool){
if type == .trtc{
roomTRTCManager.muteLocalAudio(mute: mute)
}else{
agoraManager.muteLocalAudio(mute: mute)
}
}
func setBroadcast(isChange:Bool){
if type == .trtc{
roomTRTCManager.setBroadcast(isChange: isChange)
}else{
agoraManager.setBroadcast(isChange: isChange)
}
}
func exitRoom(){
if type == .trtc{
roomTRTCManager.exitRoom()
}else{
agoraManager.exitRoom()
}
}
func destroySharedIntance(){
if type == .trtc{
roomTRTCManager.destroySharedIntance()
}else{
agoraManager.destroySharedIntance()
}
roomId = ""
}
//MARK: -
private lazy var roomTRTCManager:YinRoomTRTCManager = {
let _roomTRTCManager = YinRoomTRTCManager()
return _roomTRTCManager
}()
private lazy var agoraManager:YinRoomAgoraManager = {
let _agoraManager = YinRoomAgoraManager()
return _agoraManager
}()
}

View File

@@ -0,0 +1,82 @@
//
// YinRoomTRTCManager.swift
// yinmeng-ios
//
// Created by yinmeng on 2024/3/22.
//
import UIKit
class YinRoomTRTCManager: NSObject {
func initRTRC(){
let cloud = TRTCCloud.sharedInstance()
let params = TRTCAudioVolumeEvaluateParams()
params.interval = 900
cloud.enableAudioVolumeEvaluation(true, with: params)
TRTCCloud.setConsoleEnabled(false)
TRTCCloud.sharedInstance().addDelegate(self)
}
var roomData:RoomDataModel?
func setTRTC(){
if let roomId = self.roomData?.roomId,let uid = self.roomData?.uid{
let cloud = TRTCCloud.sharedInstance()
let curRoomId = (Int(roomId) ?? 0) > INT_MAX ? uid : roomId
let params = TRTCAudioVolumeEvaluateParams()
params.interval = 900
cloud.enableAudioVolumeEvaluation(true, with: params)
let yinParams = TRTCParams()
if AuthViewModel.authVM.appId.isEmpty{
yinParams.sdkAppId = UInt32("1400798783") ?? 0
}else{
yinParams.sdkAppId = UInt32(AuthViewModel.authVM.appId) ?? 0
}
yinParams.roomId = UInt32(curRoomId) ?? 0
let uid = "\(AuthManager.userUid)"
yinParams.userId = uid
let sign = self.roomData?.trtcSig ?? ""
yinParams.userSig = sign
yinParams.role = TRTCRoleType.audience
TRTCCloud.sharedInstance().enterRoom(yinParams, appScene: TRTCAppScene.LIVE)
TRTCCloud.sharedInstance().muteAllRemoteAudio(false)
TRTCCloud.sharedInstance().muteLocalAudio(false)
RoomVCViewModel.roomVM.isMute = false
}
}
func muteLocalAudio(mute:Bool){
TRTCCloud.sharedInstance().muteLocalAudio(mute)
}
func setBroadcast(isChange:Bool){
TRTCCloud.sharedInstance().switch(isChange ? .anchor : .audience)
if (isChange){
let text = "{\"api\":\"setAudioQualityEx\",\"params\":{\"sampleRate\":48000,\"channel\":2,\"bitrate\":192,\"encodeMode\":1,\"systemVolumeType\":1}}"
TRTCCloud.sharedInstance().callExperimentalAPI(text)
let aecText = "{\"api\":\"enableAudioAEC\",\"params\":{\"enable\":1,\"level\":100}}"
TRTCCloud.sharedInstance().callExperimentalAPI(aecText)
TRTCCloud.sharedInstance().startLocalAudio(.music)
}else{
TRTCCloud.sharedInstance().stopLocalAudio()
}
}
func exitRoom(){
TRTCCloud.sharedInstance().exitRoom()
TRTCCloud.sharedInstance().muteAllRemoteAudio(false)
TRTCCloud.sharedInstance().muteLocalAudio(false)
}
func destroySharedIntance(){
TRTCCloud.destroySharedIntance()
}
}
extension YinRoomTRTCManager:TRTCCloudDelegate{
func onUserVoiceVolume(_ userVolumes: [TRTCVolumeInfo], totalVolume: Int) {
NotificationCenter.default.post(name: NSNotification.Name(rawValue: "kReceiveUserVoiceVolume") , object: nil, userInfo: ["userVolumes":userVolumes,"totalVolume":totalVolume,"type":"trtc"])
}
}

View File

@@ -2,7 +2,7 @@
// RoomVC.swift
// yinmeng-ios
//
// Created by duoban on 2024/3/6.
// Created by yinmeng on 2024/3/6.
//
import NIMSDK
import UIKit
@@ -13,7 +13,7 @@ class RoomVC: BaseViewController, HiddenNavigationBarProtocol {
self.roomUid = roomUid
}
deinit {
TRTCCloud.destroySharedIntance()
YinRoomAudioManager.share.destroySharedIntance()
}
required init?(coder: NSCoder) {
fatalError("init(coder:) has not been implemented")
@@ -24,46 +24,119 @@ class RoomVC: BaseViewController, HiddenNavigationBarProtocol {
requestData()
addNIMSDKManager()
addChild(chatListVC)
menuView.clickMenuViewBlcok = {[weak self] in
menuView.clickMenuViewBlcok = {[weak self] type in
guard let self = self else { return}
self.view.addSubview(self.bgChatView)
self.bgChatView.snp.makeConstraints { make in
make.edges.equalTo(self.view)
}
let height = ScreenHeight * 2 / 3
self.view.addSubview(self.chatListVC.view)
self.chatListVC.view.layer.cornerRadius = 20
self.chatListVC.view.layer.masksToBounds = true
self.chatListVC.view.frame = CGRect(x: 0, y: ScreenHeight, width: ScreenWidth, height: height)
UIView.animate(withDuration: 0.1) {
self.chatListVC.view.frame = CGRect(x: 0, y:ScreenHeight - height, width: ScreenWidth, height: height)
if type == .chat{
self.view.addSubview(self.bgChatView)
self.bgChatView.snp.makeConstraints { make in
make.edges.equalTo(self.view)
}
let height = ScreenHeight * 2 / 3
self.view.addSubview(self.chatListVC.view)
self.chatListVC.view.layer.cornerRadius = 20
self.chatListVC.view.layer.masksToBounds = true
self.chatListVC.view.frame = CGRect(x: 0, y: ScreenHeight, width: ScreenWidth, height: height)
UIView.animate(withDuration: 0.1) {
self.chatListVC.view.frame = CGRect(x: 0, y:ScreenHeight - height, width: ScreenWidth, height: height)
}
}else{
let sendGiftVC = SendGiftVC()
let nav = BaseNavigationViewController.init(rootViewController: sendGiftVC)
nav.modalPresentationStyle = .overCurrentContext
let list = micSeatView.getMicUser()
var userList:[SendGiftUserModel] = []
for item:[String:UserObject] in list {
if let first = item.keys.first,let user = item[first],let uid = user.uid,uid != AuthManager.userUid{
let model = SendGiftUserModel()
model.position = first
model.nick = user.nick ?? ""
model.avatar = user.avatar ?? ""
model.uid = user.uid ?? 0
userList.append(model)
}
}
sendGiftVC.userList = userList
sendGiftVC.roomUid = self.roomUid
sendGiftVC.roomId = self.roomInfo?.roomId ?? ""
sendGiftVC.userData = self.userData
self.present(nav, animated: true, completion: nil)
}
}
micSeatView.showUserInfoBlock = {[weak self] user in
guard let weakSelf = self else { return }
let userInfoView:HomeVoiceUserInfoView = HomeVoiceUserInfoView.init(frame: .zero)
userInfoView.clickBtnBlock = {[weak self] (type,uid) in
guard let weakSelf = self else {
return
}
if type == 0{
let session = NIMSession(uid, type: .P2P)
let chatVC = ChatVC.init(session: session)
weakSelf.navigationController?.pushViewController(chatVC, animated: true)
}else if (type == 5){
if let first = user.keys.first,let userModel = user[first],let uid = userModel.uid,uid != AuthManager.userUid{
var userList:[SendGiftUserModel] = []
let model = SendGiftUserModel()
model.position = first
model.nick = userModel.nick ?? ""
model.avatar = userModel.avatar ?? ""
model.uid = userModel.uid ?? 0
userList.append(model)
let sendGiftVC = SendGiftVC()
let nav = BaseNavigationViewController.init(rootViewController: sendGiftVC)
nav.modalPresentationStyle = .overCurrentContext
sendGiftVC.userList = userList
sendGiftVC.roomUid = weakSelf.roomUid
sendGiftVC.roomId = weakSelf.roomInfo?.roomId ?? ""
sendGiftVC.userData = weakSelf.userData
sendGiftVC.isSendPerson = true
weakSelf.present(nav, animated: true, completion: nil)
}
}
}
userInfoView.type = 2
userInfoView.user = user.values.first
weakSelf.view.addSubview(userInfoView)
userInfoView.snp.makeConstraints { make in
make.edges.equalTo(weakSelf.view)
}
}
topView.didClickTypeBlcok = {[weak self] (type,uid) in
guard let self = self else { return}
if type == 0{
TRTCCloud.sharedInstance().exitRoom()
TRTCCloud.sharedInstance().muteAllRemoteAudio(false)
TRTCCloud.sharedInstance().muteLocalAudio(false)
YinRoomAudioManager.share.exitRoom()
RoomVCViewModel.roomVM.isMute = true
NIMSDK.shared().chatroomManager.exitChatroom(self.roomInfo?.roomId ?? "")
self.dismiss(animated: true, completion: nil)
return
}
TRTCCloud.sharedInstance().exitRoom()
TRTCCloud.sharedInstance().muteAllRemoteAudio(false)
TRTCCloud.sharedInstance().muteLocalAudio(false)
RoomVCViewModel.roomVM.isMute = true
NIMSDK.shared().chatroomManager.exitChatroom(self.roomInfo?.roomId ?? "")
self.dismiss(animated: true, completion: nil)
DispatchQueue.main.asyncAfter(deadline: .now() + 1) {
let vc = RoomVC(roomUid: uid)
let nav = BaseNavigationViewController.init(rootViewController: vc)
nav.modalPresentationStyle = .fullScreen
keyWindow.rootViewController?.present(nav, animated: true, completion: nil)
}else if type == 1 {
YinRoomAudioManager.share.exitRoom()
RoomVCViewModel.roomVM.isMute = true
NIMSDK.shared().chatroomManager.exitChatroom(self.roomInfo?.roomId ?? "")
self.dismiss(animated: true, completion: nil)
DispatchQueue.main.asyncAfter(deadline: .now() + 1) {
let vc = RoomVC(roomUid: uid)
let nav = BaseNavigationViewController.init(rootViewController: vc)
nav.modalPresentationStyle = .fullScreen
keyWindow.rootViewController?.present(nav, animated: true, completion: nil)
}
}else{
let web = WebViewController(url: uid,isHalf: true)
self.present(web, animated: true, completion: nil)
}
}
}
private func addNIMSDKManager(){
@@ -78,6 +151,7 @@ class RoomVC: BaseViewController, HiddenNavigationBarProtocol {
view.addSubview(micSeatView)
view.addSubview(chatScreenView)
view.addSubview(menuView)
view.addSubview(roomEffectView)
backgroundView.snp.makeConstraints { make in
make.edges.equalTo(self.view)
}
@@ -102,9 +176,12 @@ class RoomVC: BaseViewController, HiddenNavigationBarProtocol {
make.bottom.equalTo(-bottom)
make.height.equalTo(UIDevice.scaleWidth(width: 40))
}
roomEffectView.snp.makeConstraints { make in
make.edges.equalTo(view)
}
}
private func requestData(){
let uid = AuthManager.userUid
@@ -117,6 +194,7 @@ class RoomVC: BaseViewController, HiddenNavigationBarProtocol {
RoomVCViewModel.roomVM.NIMSDKEnterRoom(roomId:roomid , user: result)
self?.micSeatView.userData = result
self?.menuView.user = result
self?.userData = result
}
}).disposed(by: rx.disposeBag)
@@ -131,11 +209,13 @@ class RoomVC: BaseViewController, HiddenNavigationBarProtocol {
}
private func dealWithChatData(chatData:NIMChatroom){
self.topView.roomData = self.roomInfo
self.micSeatView.roomData = self.roomInfo
self.micSeatView.setTRTC()
self.micSeatView.setMicList()
self.menuView.roomUid = self.roomInfo?.roomId ?? ""
topView.roomData = self.roomInfo
micSeatView.roomData = self.roomInfo
if let roomInfo = self.roomInfo{
YinRoomAudioManager.share.dealWithChatData(roomData:roomInfo)
}
micSeatView.setMicList()
menuView.roomUid = self.roomInfo?.roomId ?? ""
}
private func dealWithRoomData(roomData:RoomDataModel){
let uid = AuthManager.userUid
@@ -164,6 +244,7 @@ class RoomVC: BaseViewController, HiddenNavigationBarProtocol {
var roomUid:String = ""
var roomText:String = ""
var roomInfo:RoomDataModel?
var userData:UserObject?
//MARK: -
private lazy var backgroundView:RoomBackgroundView = {
let _backgroundView = RoomBackgroundView(frame: .zero)
@@ -201,6 +282,12 @@ class RoomVC: BaseViewController, HiddenNavigationBarProtocol {
return _chatListVC
}()
private lazy var roomEffectView:RoomDynamicEffectView = {
let _roomEffectView = RoomDynamicEffectView(frame: .zero)
_roomEffectView.isUserInteractionEnabled = false
return _roomEffectView
}()
}
extension RoomVC : NIMChatManagerDelegate, NIMChatroomManagerDelegate, NIMLoginManagerDelegate, NIMConversationManagerDelegate{
@@ -214,7 +301,9 @@ extension RoomVC : NIMChatManagerDelegate, NIMChatroomManagerDelegate, NIMLoginM
if msg.messageType == .notification{
if let notMsg = msg.messageObject as? NIMNotificationObject,let content = notMsg.content as? NIMChatroomNotificationContent{
switch content.eventType {
case .enter:
updateOnlineNum(num: 1)
chatScreenView.getMsgListWithHistory()
@@ -228,7 +317,10 @@ extension RoomVC : NIMChatManagerDelegate, NIMChatroomManagerDelegate, NIMLoginM
case .exit:
updateOnlineNum(num: -1)
break
case .closed:
print("111")
break
default:
break
@@ -237,18 +329,68 @@ extension RoomVC : NIMChatManagerDelegate, NIMChatroomManagerDelegate, NIMLoginM
self.topView.roomData = self.roomInfo
}else if msg.messageType == .text{
chatScreenView.getTextMsg(msg: msg)
}else if msg.messageType == .custom{
chatScreenView.dealWithCustomMsg(msg: msg)
roomEffectView.dealWithCustomMsg(msg: msg)
micSeatView.dealWithCustomMsg(msg: msg)
startPlayAnimation(msg: msg)
}
micSeatView.dealWithNotMessage(msg: msg)
menuView.dealWithNotMessage(msg: msg)
}
}
func startPlayAnimation(msg:NIMMessage){
if let obj = msg.messageObject as? NIMCustomObject,let customObj = obj.attachment as? ChatCustomMsgModel{
if customObj.first == 3 || customObj.first == 12{
if let model = Deserialized<RectiveGiftModel>.toModel(with: customObj.data),let gift = model.gift == nil ? model.giftInfo : model.gift {
var userList:[String] = []
if userList.count <= 0 {
for item in model.targetUsers {
userList.append("\(item.uid)")
}
if userList.count <= 0{
userList.append(model.targetUid)
}
}
var starPoint = CGPoint(x: ScreenWidth/2, y: NavHeight)
if let point = micSeatView.getPointWithCell(uid: model.uid){
if point.x <= 0 || point.y <= 0{
}else{
starPoint = point
}
}
var curPoint = CGPoint(x: ScreenWidth/2, y: NavHeight)
for userUid in userList{
if let point = micSeatView.getPointWithCell(uid: userUid){
if point.x <= 0 || point.y <= 0{
}else{
curPoint = point
}
}
roomEffectView.startPlayAnimation(url: gift.giftUrl, start: starPoint, end: curPoint)
}
}
}
}
}
func send(_ message: NIMMessage, didCompleteWithError error: Error?) {
if let sessionId = message.session?.sessionId,let roomUid = self.roomInfo?.roomId,sessionId != roomUid{
return
}
if message.messageType == .text{
chatScreenView.getTextMsg(msg: message)
}else if message.messageType == .custom{
chatScreenView.dealWithCustomMsg(msg: message)
roomEffectView.dealWithCustomMsg(msg: message)
startPlayAnimation(msg: message)
micSeatView.dealWithCustomMsg(msg: message)
}
}
func updateOnlineNum(num:Int){

Some files were not shown because too many files have changed in this diff Show More