diff --git a/yinmeng-ios/Podfile b/yinmeng-ios/Podfile index 223900e..88fa440 100644 --- a/yinmeng-ios/Podfile +++ b/yinmeng-ios/Podfile @@ -44,6 +44,11 @@ target 'yinmeng-ios' do # 滑动标签栏 pod 'JXCategoryView' pod 'JXPagingView/Pager' + #输入 + pod 'SZTextView' + # 分享 + pod 'mob_sharesdk' + pod 'mob_sharesdk/ShareSDKExtension' #轮播图 pod 'SDCycleScrollView' # pod 'SDPhotoBrowser' diff --git a/yinmeng-ios/Podfile.lock b/yinmeng-ios/Podfile.lock index 7dcf761..54069f3 100644 --- a/yinmeng-ios/Podfile.lock +++ b/yinmeng-ios/Podfile.lock @@ -29,6 +29,15 @@ PODS: - MBProgressHUD (1.2.0) - MJExtension (3.4.1) - MJRefresh (3.7.5) + - mob_sharesdk (4.4.20): + - mob_sharesdk/ShareSDK (= 4.4.20) + - MOBFoundation (>= 3.2.9) + - mob_sharesdk/ShareSDK (4.4.20): + - MOBFoundation (>= 3.2.9) + - mob_sharesdk/ShareSDKExtension (4.4.20): + - mob_sharesdk/ShareSDK + - MOBFoundation (>= 3.2.9) + - MOBFoundation (3.2.60) - NIMSDK_LITE (8.9.119) - NTESBaseComponent (1.8) - NTESQuickPass (3.4.5): @@ -58,6 +67,7 @@ PODS: - SVGAPlayer/ProtoFiles - SVGAPlayer/ProtoFiles (2.5.7): - Protobuf (~> 3.4) + - SZTextView (1.3.0) - TXLiteAVSDK_TRTC (10.3.12363): - TXLiteAVSDK_TRTC/TRTC (= 10.3.12363) - TXLiteAVSDK_TRTC/TRTC (10.3.12363) @@ -82,6 +92,8 @@ DEPENDENCIES: - MBProgressHUD - MJExtension - MJRefresh + - mob_sharesdk + - mob_sharesdk/ShareSDKExtension - NIMSDK_LITE (~> 8.9.0) - NTESQuickPass - pop @@ -94,6 +106,7 @@ DEPENDENCIES: - SDWebImageFLPlugin - SSKeychain - SVGAPlayer + - SZTextView - TXLiteAVSDK_TRTC (~> 10.3.12271) - TZImagePickerController - YYText @@ -114,6 +127,8 @@ SPEC REPOS: - MBProgressHUD - MJExtension - MJRefresh + - mob_sharesdk + - MOBFoundation - NIMSDK_LITE - NTESBaseComponent - NTESQuickPass @@ -129,6 +144,7 @@ SPEC REPOS: - SSKeychain - SSZipArchive - SVGAPlayer + - SZTextView - TXLiteAVSDK_TRTC - TZImagePickerController - YYText @@ -148,6 +164,8 @@ SPEC CHECKSUMS: MBProgressHUD: 3ee5efcc380f6a79a7cc9b363dd669c5e1ae7406 MJExtension: 21c5f6f8c4d5d8844b7ae8fbae08fed0b501f961 MJRefresh: fdf5e979eb406a0341468932d1dfc8b7f9fce961 + mob_sharesdk: b23b515dda6ef255189cb84a9dc0c64faa7f3cf0 + MOBFoundation: d1ffddeaac634bb13f21a5a5e3445baee8d405d8 NIMSDK_LITE: c4895574b3e519c34e2c70ae013f0863efc87661 NTESBaseComponent: 7b310e7e80bb6c27183176188b98356d200dbbc5 NTESQuickPass: 7baf2a68a091fd69dbf70b84ecdc4eb6aa7dd7ad @@ -163,10 +181,11 @@ SPEC CHECKSUMS: SSKeychain: 55cc80f66f5c73da827e3077f02e43528897db41 SSZipArchive: fe6a26b2a54d5a0890f2567b5cc6de5caa600aef SVGAPlayer: 318b85a78b61292d6ae9dfcd651f3f0d1cdadd86 + SZTextView: 094dc6acc9beec537685c545d6e3e0d4975174e1 TXLiteAVSDK_TRTC: c4e42ef113788558b7c5f4250bad5f81925bcfb4 TZImagePickerController: e9909edbadf7381140efc5b5c9f5bdbfd630f7d4 YYText: 5c461d709e24d55a182d1441c41dc639a18a4849 -PODFILE CHECKSUM: 6d1f546b47a8b4ef9bb0f02d03691ede091c428f +PODFILE CHECKSUM: 9095077884f37d45cd88ecc466174db328affc61 COCOAPODS: 1.14.2 diff --git a/yinmeng-ios/yinmeng-ios.xcodeproj/project.pbxproj b/yinmeng-ios/yinmeng-ios.xcodeproj/project.pbxproj index 65ca8e1..e36b613 100644 --- a/yinmeng-ios/yinmeng-ios.xcodeproj/project.pbxproj +++ b/yinmeng-ios/yinmeng-ios.xcodeproj/project.pbxproj @@ -114,7 +114,7 @@ 237054C62B20265D00F5DE14 /* MewAccountModel.m in Sources */ = {isa = PBXBuildFile; fileRef = 237054C52B20265D00F5DE14 /* MewAccountModel.m */; }; 237054C92B2027E000F5DE14 /* MewBaseModel.m in Sources */ = {isa = PBXBuildFile; fileRef = 237054C82B2027E000F5DE14 /* MewBaseModel.m */; }; 237054DB2B204ADE00F5DE14 /* MewUserInfoModel.m in Sources */ = {isa = PBXBuildFile; fileRef = 237054D92B204ADD00F5DE14 /* MewUserInfoModel.m */; }; - 237054DE2B204C4E00F5DE14 /* MewUserVipInfoVo.m in Sources */ = {isa = PBXBuildFile; fileRef = 237054DD2B204C4E00F5DE14 /* MewUserVipInfoVo.m */; }; + 237054DE2B204C4E00F5DE14 /* MewUserVipInfoModel.m in Sources */ = {isa = PBXBuildFile; fileRef = 237054DD2B204C4E00F5DE14 /* MewUserVipInfoModel.m */; }; 237054E12B204DA400F5DE14 /* MewMvpViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 237054E02B204DA400F5DE14 /* MewMvpViewController.m */; }; 237054E42B204ED000F5DE14 /* MewUtility.m in Sources */ = {isa = PBXBuildFile; fileRef = 237054E32B204ED000F5DE14 /* MewUtility.m */; }; 237054E72B204F1000F5DE14 /* MewUtility+MewApp.m in Sources */ = {isa = PBXBuildFile; fileRef = 237054E62B204F1000F5DE14 /* MewUtility+MewApp.m */; }; @@ -236,6 +236,200 @@ 8CD780512B36137C00F4CFF3 /* MewEmptyCollectionViewCell.m in Sources */ = {isa = PBXBuildFile; fileRef = 8CD780502B36137C00F4CFF3 /* MewEmptyCollectionViewCell.m */; }; 8CD780542B36173700F4CFF3 /* MewUserPersonalGiftWallCollectionCell.m in Sources */ = {isa = PBXBuildFile; fileRef = 8CD780532B36173700F4CFF3 /* MewUserPersonalGiftWallCollectionCell.m */; }; 8CD7805F2B36193200F4CFF3 /* MewUserGiftWallModel.m in Sources */ = {isa = PBXBuildFile; fileRef = 8CD7805E2B36193200F4CFF3 /* MewUserGiftWallModel.m */; }; + 8CD780632B36535B00F4CFF3 /* MewDynamicMomentModel.m in Sources */ = {isa = PBXBuildFile; fileRef = 8CD780622B36535B00F4CFF3 /* MewDynamicMomentModel.m */; }; + 8CD780672B3656C800F4CFF3 /* MewUserPersonalDynamicMomentTableCell.m in Sources */ = {isa = PBXBuildFile; fileRef = 8CD780662B3656C800F4CFF3 /* MewUserPersonalDynamicMomentTableCell.m */; }; + 8CD7806C2B365A3200F4CFF3 /* MewDynamicMomentsContentView.m in Sources */ = {isa = PBXBuildFile; fileRef = 8CD7806B2B365A3200F4CFF3 /* MewDynamicMomentsContentView.m */; }; + 8CD7806F2B365A7300F4CFF3 /* MewDynamicMomentsPhotoView.m in Sources */ = {isa = PBXBuildFile; fileRef = 8CD7806E2B365A7300F4CFF3 /* MewDynamicMomentsPhotoView.m */; }; + 8CD780722B365AA400F4CFF3 /* MewDynamicMomentsToolBarView.m in Sources */ = {isa = PBXBuildFile; fileRef = 8CD780712B365AA400F4CFF3 /* MewDynamicMomentsToolBarView.m */; }; + 8CD780752B365AB800F4CFF3 /* MewDynamicMomentsTopicView.m in Sources */ = {isa = PBXBuildFile; fileRef = 8CD780742B365AB800F4CFF3 /* MewDynamicMomentsTopicView.m */; }; + 8CD780792B365C2D00F4CFF3 /* MewDynamicTextHeightLayout.m in Sources */ = {isa = PBXBuildFile; fileRef = 8CD780782B365C2D00F4CFF3 /* MewDynamicTextHeightLayout.m */; }; + 8CD7807E2B365E9200F4CFF3 /* MewDynamicCommentModel.m in Sources */ = {isa = PBXBuildFile; fileRef = 8CD7807D2B365E9200F4CFF3 /* MewDynamicCommentModel.m */; }; + 8CD780812B365F3100F4CFF3 /* MewDynamicReplyCommentModel.m in Sources */ = {isa = PBXBuildFile; fileRef = 8CD780802B365F3100F4CFF3 /* MewDynamicReplyCommentModel.m */; }; + 8CD781432B36611200F4CFF3 /* QEmotionBoardView.m in Sources */ = {isa = PBXBuildFile; fileRef = 8CD780842B36611200F4CFF3 /* QEmotionBoardView.m */; }; + 8CD781442B36611200F4CFF3 /* QInputBarViewConfiguration.m in Sources */ = {isa = PBXBuildFile; fileRef = 8CD780862B36611200F4CFF3 /* QInputBarViewConfiguration.m */; }; + 8CD781452B36611200F4CFF3 /* UITextView+QEmotion.m in Sources */ = {isa = PBXBuildFile; fileRef = 8CD780872B36611200F4CFF3 /* UITextView+QEmotion.m */; }; + 8CD781462B36611200F4CFF3 /* QInputBarView.m in Sources */ = {isa = PBXBuildFile; fileRef = 8CD780882B36611200F4CFF3 /* QInputBarView.m */; }; + 8CD781472B36611200F4CFF3 /* QEEmotionImageView.m in Sources */ = {isa = PBXBuildFile; fileRef = 8CD780892B36611200F4CFF3 /* QEEmotionImageView.m */; }; + 8CD781482B36611200F4CFF3 /* QKeyboardBaseManager.m in Sources */ = {isa = PBXBuildFile; fileRef = 8CD7808A2B36611200F4CFF3 /* QKeyboardBaseManager.m */; }; + 8CD781492B36611200F4CFF3 /* QEmotion.m in Sources */ = {isa = PBXBuildFile; fileRef = 8CD7808B2B36611200F4CFF3 /* QEmotion.m */; }; + 8CD7814A2B36611200F4CFF3 /* QExtendBoardView.m in Sources */ = {isa = PBXBuildFile; fileRef = 8CD7808E2B36611200F4CFF3 /* QExtendBoardView.m */; }; + 8CD7814B2B36611200F4CFF3 /* QEmotionHelper.m in Sources */ = {isa = PBXBuildFile; fileRef = 8CD780912B36611200F4CFF3 /* QEmotionHelper.m */; }; + 8CD7814C2B36611200F4CFF3 /* QEmotionAttachment.m in Sources */ = {isa = PBXBuildFile; fileRef = 8CD780972B36611200F4CFF3 /* QEmotionAttachment.m */; }; + 8CD7814D2B36611200F4CFF3 /* QKeyboardManager.m in Sources */ = {isa = PBXBuildFile; fileRef = 8CD780982B36611200F4CFF3 /* QKeyboardManager.m */; }; + 8CD7814E2B36611200F4CFF3 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 8CD7809A2B36611200F4CFF3 /* Assets.xcassets */; }; + 8CD7814F2B36611200F4CFF3 /* emoji_138@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 8CD7809C2B36611200F4CFF3 /* emoji_138@2x.png */; }; + 8CD781502B36611200F4CFF3 /* emoji_145@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 8CD7809D2B36611200F4CFF3 /* emoji_145@2x.png */; }; + 8CD781512B36611200F4CFF3 /* emoji_126@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 8CD7809E2B36611200F4CFF3 /* emoji_126@2x.png */; }; + 8CD781522B36611200F4CFF3 /* emoji_134@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 8CD7809F2B36611200F4CFF3 /* emoji_134@2x.png */; }; + 8CD781532B36611200F4CFF3 /* emoji_149@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 8CD780A02B36611200F4CFF3 /* emoji_149@2x.png */; }; + 8CD781542B36611200F4CFF3 /* emoji_80@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 8CD780A12B36611200F4CFF3 /* emoji_80@2x.png */; }; + 8CD781552B36611200F4CFF3 /* emoji_161@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 8CD780A22B36611200F4CFF3 /* emoji_161@2x.png */; }; + 8CD781562B36611200F4CFF3 /* emoji_102@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 8CD780A32B36611200F4CFF3 /* emoji_102@2x.png */; }; + 8CD781572B36611200F4CFF3 /* emoji_92@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 8CD780A42B36611200F4CFF3 /* emoji_92@2x.png */; }; + 8CD781582B36611200F4CFF3 /* emoji_110@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 8CD780A52B36611200F4CFF3 /* emoji_110@2x.png */; }; + 8CD781592B36611200F4CFF3 /* emoji_26@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 8CD780A62B36611200F4CFF3 /* emoji_26@2x.png */; }; + 8CD7815A2B36611200F4CFF3 /* emoji_45@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 8CD780A72B36611200F4CFF3 /* emoji_45@2x.png */; }; + 8CD7815B2B36611200F4CFF3 /* emoji_38@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 8CD780A82B36611200F4CFF3 /* emoji_38@2x.png */; }; + 8CD7815C2B36611200F4CFF3 /* emoji_49@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 8CD780A92B36611200F4CFF3 /* emoji_49@2x.png */; }; + 8CD7815D2B36611200F4CFF3 /* emoji_34@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 8CD780AA2B36611200F4CFF3 /* emoji_34@2x.png */; }; + 8CD7815E2B36611200F4CFF3 /* emoji_57@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 8CD780AB2B36611200F4CFF3 /* emoji_57@2x.png */; }; + 8CD7815F2B36611200F4CFF3 /* emoji_02@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 8CD780AC2B36611200F4CFF3 /* emoji_02@2x.png */; }; + 8CD781602B36611200F4CFF3 /* emoji_61@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 8CD780AD2B36611200F4CFF3 /* emoji_61@2x.png */; }; + 8CD781612B36611200F4CFF3 /* emoji_10@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 8CD780AE2B36611200F4CFF3 /* emoji_10@2x.png */; }; + 8CD781622B36611200F4CFF3 /* emoji_73@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 8CD780AF2B36611200F4CFF3 /* emoji_73@2x.png */; }; + 8CD781632B36611200F4CFF3 /* emoji_55@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 8CD780B02B36611200F4CFF3 /* emoji_55@2x.png */; }; + 8CD781642B36611200F4CFF3 /* emoji_28@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 8CD780B12B36611200F4CFF3 /* emoji_28@2x.png */; }; + 8CD781652B36611200F4CFF3 /* emoji_36@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 8CD780B22B36611200F4CFF3 /* emoji_36@2x.png */; }; + 8CD781662B36611200F4CFF3 /* emoji_47@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 8CD780B32B36611200F4CFF3 /* emoji_47@2x.png */; }; + 8CD781672B36611200F4CFF3 /* emoji_59@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 8CD780B42B36611200F4CFF3 /* emoji_59@2x.png */; }; + 8CD781682B36611200F4CFF3 /* emoji_24@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 8CD780B52B36611200F4CFF3 /* emoji_24@2x.png */; }; + 8CD781692B36611200F4CFF3 /* emoji.xml in Resources */ = {isa = PBXBuildFile; fileRef = 8CD780B62B36611200F4CFF3 /* emoji.xml */; }; + 8CD7816A2B36611200F4CFF3 /* emoji_71@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 8CD780B72B36611200F4CFF3 /* emoji_71@2x.png */; }; + 8CD7816B2B36611200F4CFF3 /* emoji_12@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 8CD780B82B36611200F4CFF3 /* emoji_12@2x.png */; }; + 8CD7816C2B36611200F4CFF3 /* emoji_63@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 8CD780B92B36611200F4CFF3 /* emoji_63@2x.png */; }; + 8CD7816D2B36611200F4CFF3 /* emoji_00@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 8CD780BA2B36611200F4CFF3 /* emoji_00@2x.png */; }; + 8CD7816E2B36611200F4CFF3 /* emoji_136@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 8CD780BB2B36611200F4CFF3 /* emoji_136@2x.png */; }; + 8CD7816F2B36611200F4CFF3 /* emoji_128@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 8CD780BC2B36611200F4CFF3 /* emoji_128@2x.png */; }; + 8CD781702B36611200F4CFF3 /* emoji_124@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 8CD780BD2B36611200F4CFF3 /* emoji_124@2x.png */; }; + 8CD781712B36611200F4CFF3 /* emoji_147@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 8CD780BE2B36611200F4CFF3 /* emoji_147@2x.png */; }; + 8CD781722B36611200F4CFF3 /* emoji_112@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 8CD780BF2B36611200F4CFF3 /* emoji_112@2x.png */; }; + 8CD781732B36611200F4CFF3 /* emoji_90@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 8CD780C02B36611200F4CFF3 /* emoji_90@2x.png */; }; + 8CD781742B36611200F4CFF3 /* emoji_100@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 8CD780C12B36611200F4CFF3 /* emoji_100@2x.png */; }; + 8CD781752B36611200F4CFF3 /* emoji_82@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 8CD780C22B36611200F4CFF3 /* emoji_82@2x.png */; }; + 8CD781762B36611200F4CFF3 /* emoji_163@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 8CD780C32B36611200F4CFF3 /* emoji_163@2x.png */; }; + 8CD781772B36611200F4CFF3 /* emoji_67@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 8CD780C42B36611200F4CFF3 /* emoji_67@2x.png */; }; + 8CD781782B36611200F4CFF3 /* emoji_04@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 8CD780C52B36611200F4CFF3 /* emoji_04@2x.png */; }; + 8CD781792B36611200F4CFF3 /* emoji_79@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 8CD780C62B36611200F4CFF3 /* emoji_79@2x.png */; }; + 8CD7817A2B36611200F4CFF3 /* emoji_08@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 8CD780C72B36611200F4CFF3 /* emoji_08@2x.png */; }; + 8CD7817B2B36611200F4CFF3 /* emoji_75@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 8CD780C82B36611200F4CFF3 /* emoji_75@2x.png */; }; + 8CD7817C2B36611200F4CFF3 /* emoji_16@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 8CD780C92B36611200F4CFF3 /* emoji_16@2x.png */; }; + 8CD7817D2B36611200F4CFF3 /* emoji_43@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 8CD780CA2B36611200F4CFF3 /* emoji_43@2x.png */; }; + 8CD7817E2B36611200F4CFF3 /* emoji_20@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 8CD780CB2B36611200F4CFF3 /* emoji_20@2x.png */; }; + 8CD7817F2B36611200F4CFF3 /* emoji_51@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 8CD780CC2B36611200F4CFF3 /* emoji_51@2x.png */; }; + 8CD781802B36611200F4CFF3 /* emoji_32@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 8CD780CD2B36611200F4CFF3 /* emoji_32@2x.png */; }; + 8CD781812B36611200F4CFF3 /* emoji_98@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 8CD780CE2B36611200F4CFF3 /* emoji_98@2x.png */; }; + 8CD781822B36611200F4CFF3 /* emoji_104@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 8CD780CF2B36611200F4CFF3 /* emoji_104@2x.png */; }; + 8CD781832B36611200F4CFF3 /* emoji_86@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 8CD780D02B36611200F4CFF3 /* emoji_86@2x.png */; }; + 8CD781842B36611200F4CFF3 /* emoji_116@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 8CD780D12B36611200F4CFF3 /* emoji_116@2x.png */; }; + 8CD781852B36611200F4CFF3 /* emoji_94@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 8CD780D22B36611200F4CFF3 /* emoji_94@2x.png */; }; + 8CD781862B36611200F4CFF3 /* emoji_108@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 8CD780D32B36611200F4CFF3 /* emoji_108@2x.png */; }; + 8CD781872B36611200F4CFF3 /* emoji_120@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 8CD780D42B36611200F4CFF3 /* emoji_120@2x.png */; }; + 8CD781882B36611200F4CFF3 /* emoji_143@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 8CD780D52B36611200F4CFF3 /* emoji_143@2x.png */; }; + 8CD781892B36611200F4CFF3 /* emoji_132@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 8CD780D62B36611200F4CFF3 /* emoji_132@2x.png */; }; + 8CD7818A2B36611200F4CFF3 /* emoji_151@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 8CD780D72B36611200F4CFF3 /* emoji_151@2x.png */; }; + 8CD7818B2B36611200F4CFF3 /* emoji_96@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 8CD780D82B36611200F4CFF3 /* emoji_96@2x.png */; }; + 8CD7818C2B36611200F4CFF3 /* emoji_88@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 8CD780D92B36611200F4CFF3 /* emoji_88@2x.png */; }; + 8CD7818D2B36611200F4CFF3 /* emoji_114@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 8CD780DA2B36611200F4CFF3 /* emoji_114@2x.png */; }; + 8CD7818E2B36611200F4CFF3 /* emoji_84@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 8CD780DB2B36611200F4CFF3 /* emoji_84@2x.png */; }; + 8CD7818F2B36611200F4CFF3 /* emoji_165@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 8CD780DC2B36611200F4CFF3 /* emoji_165@2x.png */; }; + 8CD781902B36611200F4CFF3 /* emoji_118@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 8CD780DD2B36611200F4CFF3 /* emoji_118@2x.png */; }; + 8CD781912B36611200F4CFF3 /* emoji_106@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 8CD780DE2B36611200F4CFF3 /* emoji_106@2x.png */; }; + 8CD781922B36611200F4CFF3 /* emoji_130@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 8CD780DF2B36611200F4CFF3 /* emoji_130@2x.png */; }; + 8CD781932B36611200F4CFF3 /* emoji_141@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 8CD780E02B36611200F4CFF3 /* emoji_141@2x.png */; }; + 8CD781942B36611200F4CFF3 /* emoji_122@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 8CD780E12B36611200F4CFF3 /* emoji_122@2x.png */; }; + 8CD781952B36611200F4CFF3 /* emoji_14@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 8CD780E22B36611200F4CFF3 /* emoji_14@2x.png */; }; + 8CD781962B36611200F4CFF3 /* emoji_69@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 8CD780E32B36611200F4CFF3 /* emoji_69@2x.png */; }; + 8CD781972B36611200F4CFF3 /* emoji_77@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 8CD780E42B36611200F4CFF3 /* emoji_77@2x.png */; }; + 8CD781982B36611200F4CFF3 /* emoji_06@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 8CD780E52B36611200F4CFF3 /* emoji_06@2x.png */; }; + 8CD781992B36611200F4CFF3 /* emoji_18@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 8CD780E62B36611200F4CFF3 /* emoji_18@2x.png */; }; + 8CD7819A2B36611200F4CFF3 /* emoji_65@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 8CD780E72B36611200F4CFF3 /* emoji_65@2x.png */; }; + 8CD7819B2B36611200F4CFF3 /* emoji_30@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 8CD780E82B36611200F4CFF3 /* emoji_30@2x.png */; }; + 8CD7819C2B36611200F4CFF3 /* emoji_53@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 8CD780E92B36611200F4CFF3 /* emoji_53@2x.png */; }; + 8CD7819D2B36611200F4CFF3 /* emoji_22@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 8CD780EA2B36611200F4CFF3 /* emoji_22@2x.png */; }; + 8CD7819E2B36611200F4CFF3 /* emoji_41@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 8CD780EB2B36611200F4CFF3 /* emoji_41@2x.png */; }; + 8CD7819F2B36611200F4CFF3 /* emoji_60@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 8CD780EC2B36611200F4CFF3 /* emoji_60@2x.png */; }; + 8CD781A02B36611200F4CFF3 /* emoji_03@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 8CD780ED2B36611200F4CFF3 /* emoji_03@2x.png */; }; + 8CD781A12B36611200F4CFF3 /* emoji_72@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 8CD780EE2B36611200F4CFF3 /* emoji_72@2x.png */; }; + 8CD781A22B36611200F4CFF3 /* emoji_11@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 8CD780EF2B36611200F4CFF3 /* emoji_11@2x.png */; }; + 8CD781A32B36611200F4CFF3 /* emoji_39@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 8CD780F02B36611200F4CFF3 /* emoji_39@2x.png */; }; + 8CD781A42B36611200F4CFF3 /* emoji_44@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 8CD780F12B36611200F4CFF3 /* emoji_44@2x.png */; }; + 8CD781A52B36611200F4CFF3 /* emoji_27@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 8CD780F22B36611200F4CFF3 /* emoji_27@2x.png */; }; + 8CD781A62B36611200F4CFF3 /* emoji_200@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 8CD780F32B36611200F4CFF3 /* emoji_200@2x.png */; }; + 8CD781A72B36611200F4CFF3 /* emoji_56@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 8CD780F42B36611200F4CFF3 /* emoji_56@2x.png */; }; + 8CD781A82B36611200F4CFF3 /* emoji_35@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 8CD780F52B36611200F4CFF3 /* emoji_35@2x.png */; }; + 8CD781A92B36611200F4CFF3 /* emoji_48@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 8CD780F62B36611200F4CFF3 /* emoji_48@2x.png */; }; + 8CD781AA2B36611200F4CFF3 /* emoji_103@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 8CD780F72B36611200F4CFF3 /* emoji_103@2x.png */; }; + 8CD781AB2B36611200F4CFF3 /* emoji_81@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 8CD780F82B36611200F4CFF3 /* emoji_81@2x.png */; }; + 8CD781AC2B36611200F4CFF3 /* emoji_160@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 8CD780F92B36611200F4CFF3 /* emoji_160@2x.png */; }; + 8CD781AD2B36611200F4CFF3 /* emoji_111@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 8CD780FA2B36611200F4CFF3 /* emoji_111@2x.png */; }; + 8CD781AE2B36611200F4CFF3 /* emoji_93@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 8CD780FB2B36611200F4CFF3 /* emoji_93@2x.png */; }; + 8CD781AF2B36611200F4CFF3 /* emoji_127@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 8CD780FC2B36611200F4CFF3 /* emoji_127@2x.png */; }; + 8CD781B02B36611200F4CFF3 /* emoji_144@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 8CD780FD2B36611200F4CFF3 /* emoji_144@2x.png */; }; + 8CD781B12B36611200F4CFF3 /* emoji_139@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 8CD780FE2B36611200F4CFF3 /* emoji_139@2x.png */; }; + 8CD781B22B36611200F4CFF3 /* emoji_148@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 8CD780FF2B36611200F4CFF3 /* emoji_148@2x.png */; }; + 8CD781B32B36611200F4CFF3 /* emoji_135@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 8CD781002B36611200F4CFF3 /* emoji_135@2x.png */; }; + 8CD781B42B36611200F4CFF3 /* emoji_91@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 8CD781012B36611200F4CFF3 /* emoji_91@2x.png */; }; + 8CD781B52B36611200F4CFF3 /* emoji_113@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 8CD781022B36611200F4CFF3 /* emoji_113@2x.png */; }; + 8CD781B62B36611200F4CFF3 /* emoji_83@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 8CD781032B36611200F4CFF3 /* emoji_83@2x.png */; }; + 8CD781B72B36611200F4CFF3 /* emoji_162@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 8CD781042B36611200F4CFF3 /* emoji_162@2x.png */; }; + 8CD781B82B36611200F4CFF3 /* emoji_101@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 8CD781052B36611200F4CFF3 /* emoji_101@2x.png */; }; + 8CD781B92B36611200F4CFF3 /* emoji_129@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 8CD781062B36611200F4CFF3 /* emoji_129@2x.png */; }; + 8CD781BA2B36611200F4CFF3 /* emoji_137@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 8CD781072B36611200F4CFF3 /* emoji_137@2x.png */; }; + 8CD781BB2B36611200F4CFF3 /* emoji_146@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 8CD781082B36611200F4CFF3 /* emoji_146@2x.png */; }; + 8CD781BC2B36611200F4CFF3 /* emoji_125@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 8CD781092B36611200F4CFF3 /* emoji_125@2x.png */; }; + 8CD781BD2B36611200F4CFF3 /* emoji_13@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 8CD7810A2B36611200F4CFF3 /* emoji_13@2x.png */; }; + 8CD781BE2B36611200F4CFF3 /* emoji_70@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 8CD7810B2B36611200F4CFF3 /* emoji_70@2x.png */; }; + 8CD781BF2B36611200F4CFF3 /* emoji_01@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 8CD7810C2B36611200F4CFF3 /* emoji_01@2x.png */; }; + 8CD781C02B36611200F4CFF3 /* emoji_62@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 8CD7810D2B36611200F4CFF3 /* emoji_62@2x.png */; }; + 8CD781C12B36611200F4CFF3 /* emoji_37@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 8CD7810E2B36611200F4CFF3 /* emoji_37@2x.png */; }; + 8CD781C22B36611200F4CFF3 /* emoji_29@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 8CD7810F2B36611200F4CFF3 /* emoji_29@2x.png */; }; + 8CD781C32B36611200F4CFF3 /* emoji_54@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 8CD781102B36611200F4CFF3 /* emoji_54@2x.png */; }; + 8CD781C42B36611200F4CFF3 /* emoj_s_normal@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 8CD781112B36611200F4CFF3 /* emoj_s_normal@2x.png */; }; + 8CD781C52B36611200F4CFF3 /* emoji_25@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 8CD781122B36611200F4CFF3 /* emoji_25@2x.png */; }; + 8CD781C62B36611200F4CFF3 /* emoji_58@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 8CD781132B36611200F4CFF3 /* emoji_58@2x.png */; }; + 8CD781C72B36611200F4CFF3 /* emoji_46@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 8CD781142B36611200F4CFF3 /* emoji_46@2x.png */; }; + 8CD781C82B36611200F4CFF3 /* emoji_del_pressed@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 8CD781152B36611200F4CFF3 /* emoji_del_pressed@2x.png */; }; + 8CD781C92B36611200F4CFF3 /* emoji_142@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 8CD781162B36611200F4CFF3 /* emoji_142@2x.png */; }; + 8CD781CA2B36611200F4CFF3 /* emoji_121@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 8CD781172B36611200F4CFF3 /* emoji_121@2x.png */; }; + 8CD781CB2B36611200F4CFF3 /* emoji_150@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 8CD781182B36611200F4CFF3 /* emoji_150@2x.png */; }; + 8CD781CC2B36611200F4CFF3 /* emoji_133@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 8CD781192B36611200F4CFF3 /* emoji_133@2x.png */; }; + 8CD781CD2B36611200F4CFF3 /* emoji_87@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 8CD7811A2B36611200F4CFF3 /* emoji_87@2x.png */; }; + 8CD781CE2B36611200F4CFF3 /* emoji_166@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 8CD7811B2B36611200F4CFF3 /* emoji_166@2x.png */; }; + 8CD781CF2B36611200F4CFF3 /* emoji_105@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 8CD7811C2B36611200F4CFF3 /* emoji_105@2x.png */; }; + 8CD781D02B36611200F4CFF3 /* emoji_99@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 8CD7811D2B36611200F4CFF3 /* emoji_99@2x.png */; }; + 8CD781D12B36611200F4CFF3 /* emoji_109@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 8CD7811E2B36611200F4CFF3 /* emoji_109@2x.png */; }; + 8CD781D22B36611200F4CFF3 /* emoji_95@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 8CD7811F2B36611200F4CFF3 /* emoji_95@2x.png */; }; + 8CD781D32B36611200F4CFF3 /* emoji_117@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 8CD781202B36611200F4CFF3 /* emoji_117@2x.png */; }; + 8CD781D42B36611200F4CFF3 /* emoji_21@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 8CD781212B36611200F4CFF3 /* emoji_21@2x.png */; }; + 8CD781D52B36611200F4CFF3 /* emoji_42@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 8CD781222B36611200F4CFF3 /* emoji_42@2x.png */; }; + 8CD781D62B36611200F4CFF3 /* emoji_33@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 8CD781232B36611200F4CFF3 /* emoji_33@2x.png */; }; + 8CD781D72B36611200F4CFF3 /* emoji_50@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 8CD781242B36611200F4CFF3 /* emoji_50@2x.png */; }; + 8CD781D82B36611200F4CFF3 /* emoji_78@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 8CD781252B36611200F4CFF3 /* emoji_78@2x.png */; }; + 8CD781D92B36611200F4CFF3 /* emoji_05@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 8CD781262B36611200F4CFF3 /* emoji_05@2x.png */; }; + 8CD781DA2B36611200F4CFF3 /* emoji_66@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 8CD781272B36611200F4CFF3 /* emoji_66@2x.png */; }; + 8CD781DB2B36611200F4CFF3 /* emoji_17@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 8CD781282B36611200F4CFF3 /* emoji_17@2x.png */; }; + 8CD781DC2B36611200F4CFF3 /* emoji_74@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 8CD781292B36611200F4CFF3 /* emoji_74@2x.png */; }; + 8CD781DD2B36611200F4CFF3 /* emoji_09@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 8CD7812A2B36611200F4CFF3 /* emoji_09@2x.png */; }; + 8CD781DE2B36611200F4CFF3 /* emoji_52@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 8CD7812B2B36611200F4CFF3 /* emoji_52@2x.png */; }; + 8CD781DF2B36611200F4CFF3 /* emoji_31@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 8CD7812C2B36611200F4CFF3 /* emoji_31@2x.png */; }; + 8CD781E02B36611200F4CFF3 /* emoji_40@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 8CD7812D2B36611200F4CFF3 /* emoji_40@2x.png */; }; + 8CD781E12B36611200F4CFF3 /* emoji_23@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 8CD7812E2B36611200F4CFF3 /* emoji_23@2x.png */; }; + 8CD781E22B36611200F4CFF3 /* emoji_del_normal@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 8CD7812F2B36611200F4CFF3 /* emoji_del_normal@2x.png */; }; + 8CD781E32B36611200F4CFF3 /* emoji_76@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 8CD781302B36611200F4CFF3 /* emoji_76@2x.png */; }; + 8CD781E42B36611200F4CFF3 /* emoji_68@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 8CD781312B36611200F4CFF3 /* emoji_68@2x.png */; }; + 8CD781E52B36611200F4CFF3 /* emoji_15@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 8CD781322B36611200F4CFF3 /* emoji_15@2x.png */; }; + 8CD781E62B36611200F4CFF3 /* emoji_64@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 8CD781332B36611200F4CFF3 /* emoji_64@2x.png */; }; + 8CD781E72B36611200F4CFF3 /* emoji_19@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 8CD781342B36611200F4CFF3 /* emoji_19@2x.png */; }; + 8CD781E82B36611200F4CFF3 /* emoji_07@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 8CD781352B36611200F4CFF3 /* emoji_07@2x.png */; }; + 8CD781E92B36611200F4CFF3 /* emoji_131@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 8CD781362B36611200F4CFF3 /* emoji_131@2x.png */; }; + 8CD781EA2B36611200F4CFF3 /* emoj_s_pressed@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 8CD781372B36611200F4CFF3 /* emoj_s_pressed@2x.png */; }; + 8CD781EB2B36611200F4CFF3 /* emoji_152@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 8CD781382B36611200F4CFF3 /* emoji_152@2x.png */; }; + 8CD781EC2B36611200F4CFF3 /* emoji_123@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 8CD781392B36611200F4CFF3 /* emoji_123@2x.png */; }; + 8CD781ED2B36611200F4CFF3 /* emoji_140@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 8CD7813A2B36611200F4CFF3 /* emoji_140@2x.png */; }; + 8CD781EE2B36611200F4CFF3 /* emoji_115@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 8CD7813B2B36611200F4CFF3 /* emoji_115@2x.png */; }; + 8CD781EF2B36611200F4CFF3 /* emoji_89@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 8CD7813C2B36611200F4CFF3 /* emoji_89@2x.png */; }; + 8CD781F02B36611200F4CFF3 /* emoji_97@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 8CD7813D2B36611200F4CFF3 /* emoji_97@2x.png */; }; + 8CD781F12B36611200F4CFF3 /* emoji_107@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 8CD7813E2B36611200F4CFF3 /* emoji_107@2x.png */; }; + 8CD781F22B36611200F4CFF3 /* emoji_119@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 8CD7813F2B36611200F4CFF3 /* emoji_119@2x.png */; }; + 8CD781F32B36611200F4CFF3 /* emoji_85@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 8CD781402B36611200F4CFF3 /* emoji_85@2x.png */; }; + 8CD781F42B36611200F4CFF3 /* emoji_164@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 8CD781412B36611200F4CFF3 /* emoji_164@2x.png */; }; + 8CD781F52B36611200F4CFF3 /* emoji.plist in Resources */ = {isa = PBXBuildFile; fileRef = 8CD781422B36611200F4CFF3 /* emoji.plist */; }; + 8CD781F92B366BB200F4CFF3 /* NSMutableAttributedString+MewUtil.m in Sources */ = {isa = PBXBuildFile; fileRef = 8CD781F82B366BB200F4CFF3 /* NSMutableAttributedString+MewUtil.m */; }; + 8CD781FC2B3682D100F4CFF3 /* MewDynamicPhotoMomentModel.m in Sources */ = {isa = PBXBuildFile; fileRef = 8CD781FB2B3682D100F4CFF3 /* MewDynamicPhotoMomentModel.m */; }; + 8CD782002B38FC9500F4CFF3 /* MewShareView.m in Sources */ = {isa = PBXBuildFile; fileRef = 8CD781FF2B38FC9500F4CFF3 /* MewShareView.m */; }; + 8CD782042B38FD6700F4CFF3 /* MewShareItemModel.m in Sources */ = {isa = PBXBuildFile; fileRef = 8CD782032B38FD6700F4CFF3 /* MewShareItemModel.m */; }; + 8CD782072B3900EB00F4CFF3 /* MewPushShareModel.m in Sources */ = {isa = PBXBuildFile; fileRef = 8CD782062B3900EB00F4CFF3 /* MewPushShareModel.m */; }; + 8CD7820A2B3A0DC200F4CFF3 /* MewShareItemCollectionCell.m in Sources */ = {isa = PBXBuildFile; fileRef = 8CD782092B3A0DC200F4CFF3 /* MewShareItemCollectionCell.m */; }; FFDAAB800AD6BB4653B4427F /* Pods_yinmeng_ios.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1797344FB85F47F60D0CC2A0 /* Pods_yinmeng_ios.framework */; }; /* End PBXBuildFile section */ @@ -467,8 +661,8 @@ 237054C82B2027E000F5DE14 /* MewBaseModel.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = MewBaseModel.m; sourceTree = ""; }; 237054D92B204ADD00F5DE14 /* MewUserInfoModel.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = MewUserInfoModel.m; sourceTree = ""; }; 237054DA2B204ADD00F5DE14 /* MewUserInfoModel.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MewUserInfoModel.h; sourceTree = ""; }; - 237054DC2B204C4E00F5DE14 /* MewUserVipInfoVo.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = MewUserVipInfoVo.h; sourceTree = ""; }; - 237054DD2B204C4E00F5DE14 /* MewUserVipInfoVo.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = MewUserVipInfoVo.m; sourceTree = ""; }; + 237054DC2B204C4E00F5DE14 /* MewUserVipInfoModel.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = MewUserVipInfoModel.h; sourceTree = ""; }; + 237054DD2B204C4E00F5DE14 /* MewUserVipInfoModel.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = MewUserVipInfoModel.m; sourceTree = ""; }; 237054DF2B204DA400F5DE14 /* MewMvpViewController.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = MewMvpViewController.h; sourceTree = ""; }; 237054E02B204DA400F5DE14 /* MewMvpViewController.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = MewMvpViewController.m; sourceTree = ""; }; 237054E22B204ED000F5DE14 /* MewUtility.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = MewUtility.h; sourceTree = ""; }; @@ -730,6 +924,227 @@ 8CD780532B36173700F4CFF3 /* MewUserPersonalGiftWallCollectionCell.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = MewUserPersonalGiftWallCollectionCell.m; sourceTree = ""; }; 8CD7805D2B36193200F4CFF3 /* MewUserGiftWallModel.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = MewUserGiftWallModel.h; sourceTree = ""; }; 8CD7805E2B36193200F4CFF3 /* MewUserGiftWallModel.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = MewUserGiftWallModel.m; sourceTree = ""; }; + 8CD780612B36535B00F4CFF3 /* MewDynamicMomentModel.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = MewDynamicMomentModel.h; sourceTree = ""; }; + 8CD780622B36535B00F4CFF3 /* MewDynamicMomentModel.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = MewDynamicMomentModel.m; sourceTree = ""; }; + 8CD780652B3656C800F4CFF3 /* MewUserPersonalDynamicMomentTableCell.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = MewUserPersonalDynamicMomentTableCell.h; sourceTree = ""; }; + 8CD780662B3656C800F4CFF3 /* MewUserPersonalDynamicMomentTableCell.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = MewUserPersonalDynamicMomentTableCell.m; sourceTree = ""; }; + 8CD7806A2B365A3200F4CFF3 /* MewDynamicMomentsContentView.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = MewDynamicMomentsContentView.h; sourceTree = ""; }; + 8CD7806B2B365A3200F4CFF3 /* MewDynamicMomentsContentView.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = MewDynamicMomentsContentView.m; sourceTree = ""; }; + 8CD7806D2B365A7300F4CFF3 /* MewDynamicMomentsPhotoView.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = MewDynamicMomentsPhotoView.h; sourceTree = ""; }; + 8CD7806E2B365A7300F4CFF3 /* MewDynamicMomentsPhotoView.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = MewDynamicMomentsPhotoView.m; sourceTree = ""; }; + 8CD780702B365AA400F4CFF3 /* MewDynamicMomentsToolBarView.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = MewDynamicMomentsToolBarView.h; sourceTree = ""; }; + 8CD780712B365AA400F4CFF3 /* MewDynamicMomentsToolBarView.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = MewDynamicMomentsToolBarView.m; sourceTree = ""; }; + 8CD780732B365AB800F4CFF3 /* MewDynamicMomentsTopicView.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = MewDynamicMomentsTopicView.h; sourceTree = ""; }; + 8CD780742B365AB800F4CFF3 /* MewDynamicMomentsTopicView.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = MewDynamicMomentsTopicView.m; sourceTree = ""; }; + 8CD780772B365C2D00F4CFF3 /* MewDynamicTextHeightLayout.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = MewDynamicTextHeightLayout.h; sourceTree = ""; }; + 8CD780782B365C2D00F4CFF3 /* MewDynamicTextHeightLayout.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = MewDynamicTextHeightLayout.m; sourceTree = ""; }; + 8CD7807A2B365CB800F4CFF3 /* MewDynamicLayoutConfig.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = MewDynamicLayoutConfig.h; sourceTree = ""; }; + 8CD7807C2B365E9200F4CFF3 /* MewDynamicCommentModel.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = MewDynamicCommentModel.h; sourceTree = ""; }; + 8CD7807D2B365E9200F4CFF3 /* MewDynamicCommentModel.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = MewDynamicCommentModel.m; sourceTree = ""; }; + 8CD7807F2B365F3100F4CFF3 /* MewDynamicReplyCommentModel.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = MewDynamicReplyCommentModel.h; sourceTree = ""; }; + 8CD780802B365F3100F4CFF3 /* MewDynamicReplyCommentModel.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = MewDynamicReplyCommentModel.m; sourceTree = ""; }; + 8CD780842B36611200F4CFF3 /* QEmotionBoardView.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = QEmotionBoardView.m; sourceTree = ""; }; + 8CD780852B36611200F4CFF3 /* QEmotionHelper.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = QEmotionHelper.h; sourceTree = ""; }; + 8CD780862B36611200F4CFF3 /* QInputBarViewConfiguration.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = QInputBarViewConfiguration.m; sourceTree = ""; }; + 8CD780872B36611200F4CFF3 /* UITextView+QEmotion.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "UITextView+QEmotion.m"; sourceTree = ""; }; + 8CD780882B36611200F4CFF3 /* QInputBarView.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = QInputBarView.m; sourceTree = ""; }; + 8CD780892B36611200F4CFF3 /* QEEmotionImageView.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = QEEmotionImageView.m; sourceTree = ""; }; + 8CD7808A2B36611200F4CFF3 /* QKeyboardBaseManager.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = QKeyboardBaseManager.m; sourceTree = ""; }; + 8CD7808B2B36611200F4CFF3 /* QEmotion.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = QEmotion.m; sourceTree = ""; }; + 8CD7808C2B36611200F4CFF3 /* QKeyboardManager.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = QKeyboardManager.h; sourceTree = ""; }; + 8CD7808D2B36611200F4CFF3 /* QEmotionAttachment.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = QEmotionAttachment.h; sourceTree = ""; }; + 8CD7808E2B36611200F4CFF3 /* QExtendBoardView.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = QExtendBoardView.m; sourceTree = ""; }; + 8CD7808F2B36611200F4CFF3 /* UITextView+QEmotion.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "UITextView+QEmotion.h"; sourceTree = ""; }; + 8CD780902B36611200F4CFF3 /* QInputBarViewConfiguration.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = QInputBarViewConfiguration.h; sourceTree = ""; }; + 8CD780912B36611200F4CFF3 /* QEmotionHelper.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = QEmotionHelper.m; sourceTree = ""; }; + 8CD780922B36611200F4CFF3 /* QEmotionBoardView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = QEmotionBoardView.h; sourceTree = ""; }; + 8CD780932B36611200F4CFF3 /* QKeyboardBaseManager.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = QKeyboardBaseManager.h; sourceTree = ""; }; + 8CD780942B36611200F4CFF3 /* QEEmotionImageView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = QEEmotionImageView.h; sourceTree = ""; }; + 8CD780952B36611200F4CFF3 /* QInputBarView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = QInputBarView.h; sourceTree = ""; }; + 8CD780962B36611200F4CFF3 /* QExtendBoardView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = QExtendBoardView.h; sourceTree = ""; }; + 8CD780972B36611200F4CFF3 /* QEmotionAttachment.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = QEmotionAttachment.m; sourceTree = ""; }; + 8CD780982B36611200F4CFF3 /* QKeyboardManager.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = QKeyboardManager.m; sourceTree = ""; }; + 8CD780992B36611200F4CFF3 /* QEmotion.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = QEmotion.h; sourceTree = ""; }; + 8CD7809A2B36611200F4CFF3 /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; }; + 8CD7809C2B36611200F4CFF3 /* emoji_138@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "emoji_138@2x.png"; sourceTree = ""; }; + 8CD7809D2B36611200F4CFF3 /* emoji_145@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "emoji_145@2x.png"; sourceTree = ""; }; + 8CD7809E2B36611200F4CFF3 /* emoji_126@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "emoji_126@2x.png"; sourceTree = ""; }; + 8CD7809F2B36611200F4CFF3 /* emoji_134@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "emoji_134@2x.png"; sourceTree = ""; }; + 8CD780A02B36611200F4CFF3 /* emoji_149@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "emoji_149@2x.png"; sourceTree = ""; }; + 8CD780A12B36611200F4CFF3 /* emoji_80@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "emoji_80@2x.png"; sourceTree = ""; }; + 8CD780A22B36611200F4CFF3 /* emoji_161@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "emoji_161@2x.png"; sourceTree = ""; }; + 8CD780A32B36611200F4CFF3 /* emoji_102@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "emoji_102@2x.png"; sourceTree = ""; }; + 8CD780A42B36611200F4CFF3 /* emoji_92@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "emoji_92@2x.png"; sourceTree = ""; }; + 8CD780A52B36611200F4CFF3 /* emoji_110@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "emoji_110@2x.png"; sourceTree = ""; }; + 8CD780A62B36611200F4CFF3 /* emoji_26@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "emoji_26@2x.png"; sourceTree = ""; }; + 8CD780A72B36611200F4CFF3 /* emoji_45@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "emoji_45@2x.png"; sourceTree = ""; }; + 8CD780A82B36611200F4CFF3 /* emoji_38@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "emoji_38@2x.png"; sourceTree = ""; }; + 8CD780A92B36611200F4CFF3 /* emoji_49@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "emoji_49@2x.png"; sourceTree = ""; }; + 8CD780AA2B36611200F4CFF3 /* emoji_34@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "emoji_34@2x.png"; sourceTree = ""; }; + 8CD780AB2B36611200F4CFF3 /* emoji_57@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "emoji_57@2x.png"; sourceTree = ""; }; + 8CD780AC2B36611200F4CFF3 /* emoji_02@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "emoji_02@2x.png"; sourceTree = ""; }; + 8CD780AD2B36611200F4CFF3 /* emoji_61@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "emoji_61@2x.png"; sourceTree = ""; }; + 8CD780AE2B36611200F4CFF3 /* emoji_10@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "emoji_10@2x.png"; sourceTree = ""; }; + 8CD780AF2B36611200F4CFF3 /* emoji_73@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "emoji_73@2x.png"; sourceTree = ""; }; + 8CD780B02B36611200F4CFF3 /* emoji_55@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "emoji_55@2x.png"; sourceTree = ""; }; + 8CD780B12B36611200F4CFF3 /* emoji_28@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "emoji_28@2x.png"; sourceTree = ""; }; + 8CD780B22B36611200F4CFF3 /* emoji_36@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "emoji_36@2x.png"; sourceTree = ""; }; + 8CD780B32B36611200F4CFF3 /* emoji_47@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "emoji_47@2x.png"; sourceTree = ""; }; + 8CD780B42B36611200F4CFF3 /* emoji_59@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "emoji_59@2x.png"; sourceTree = ""; }; + 8CD780B52B36611200F4CFF3 /* emoji_24@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "emoji_24@2x.png"; sourceTree = ""; }; + 8CD780B62B36611200F4CFF3 /* emoji.xml */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xml; path = emoji.xml; sourceTree = ""; }; + 8CD780B72B36611200F4CFF3 /* emoji_71@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "emoji_71@2x.png"; sourceTree = ""; }; + 8CD780B82B36611200F4CFF3 /* emoji_12@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "emoji_12@2x.png"; sourceTree = ""; }; + 8CD780B92B36611200F4CFF3 /* emoji_63@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "emoji_63@2x.png"; sourceTree = ""; }; + 8CD780BA2B36611200F4CFF3 /* emoji_00@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "emoji_00@2x.png"; sourceTree = ""; }; + 8CD780BB2B36611200F4CFF3 /* emoji_136@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "emoji_136@2x.png"; sourceTree = ""; }; + 8CD780BC2B36611200F4CFF3 /* emoji_128@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "emoji_128@2x.png"; sourceTree = ""; }; + 8CD780BD2B36611200F4CFF3 /* emoji_124@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "emoji_124@2x.png"; sourceTree = ""; }; + 8CD780BE2B36611200F4CFF3 /* emoji_147@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "emoji_147@2x.png"; sourceTree = ""; }; + 8CD780BF2B36611200F4CFF3 /* emoji_112@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "emoji_112@2x.png"; sourceTree = ""; }; + 8CD780C02B36611200F4CFF3 /* emoji_90@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "emoji_90@2x.png"; sourceTree = ""; }; + 8CD780C12B36611200F4CFF3 /* emoji_100@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "emoji_100@2x.png"; sourceTree = ""; }; + 8CD780C22B36611200F4CFF3 /* emoji_82@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "emoji_82@2x.png"; sourceTree = ""; }; + 8CD780C32B36611200F4CFF3 /* emoji_163@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "emoji_163@2x.png"; sourceTree = ""; }; + 8CD780C42B36611200F4CFF3 /* emoji_67@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "emoji_67@2x.png"; sourceTree = ""; }; + 8CD780C52B36611200F4CFF3 /* emoji_04@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "emoji_04@2x.png"; sourceTree = ""; }; + 8CD780C62B36611200F4CFF3 /* emoji_79@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "emoji_79@2x.png"; sourceTree = ""; }; + 8CD780C72B36611200F4CFF3 /* emoji_08@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "emoji_08@2x.png"; sourceTree = ""; }; + 8CD780C82B36611200F4CFF3 /* emoji_75@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "emoji_75@2x.png"; sourceTree = ""; }; + 8CD780C92B36611200F4CFF3 /* emoji_16@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "emoji_16@2x.png"; sourceTree = ""; }; + 8CD780CA2B36611200F4CFF3 /* emoji_43@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "emoji_43@2x.png"; sourceTree = ""; }; + 8CD780CB2B36611200F4CFF3 /* emoji_20@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "emoji_20@2x.png"; sourceTree = ""; }; + 8CD780CC2B36611200F4CFF3 /* emoji_51@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "emoji_51@2x.png"; sourceTree = ""; }; + 8CD780CD2B36611200F4CFF3 /* emoji_32@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "emoji_32@2x.png"; sourceTree = ""; }; + 8CD780CE2B36611200F4CFF3 /* emoji_98@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "emoji_98@2x.png"; sourceTree = ""; }; + 8CD780CF2B36611200F4CFF3 /* emoji_104@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "emoji_104@2x.png"; sourceTree = ""; }; + 8CD780D02B36611200F4CFF3 /* emoji_86@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "emoji_86@2x.png"; sourceTree = ""; }; + 8CD780D12B36611200F4CFF3 /* emoji_116@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "emoji_116@2x.png"; sourceTree = ""; }; + 8CD780D22B36611200F4CFF3 /* emoji_94@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "emoji_94@2x.png"; sourceTree = ""; }; + 8CD780D32B36611200F4CFF3 /* emoji_108@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "emoji_108@2x.png"; sourceTree = ""; }; + 8CD780D42B36611200F4CFF3 /* emoji_120@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "emoji_120@2x.png"; sourceTree = ""; }; + 8CD780D52B36611200F4CFF3 /* emoji_143@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "emoji_143@2x.png"; sourceTree = ""; }; + 8CD780D62B36611200F4CFF3 /* emoji_132@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "emoji_132@2x.png"; sourceTree = ""; }; + 8CD780D72B36611200F4CFF3 /* emoji_151@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "emoji_151@2x.png"; sourceTree = ""; }; + 8CD780D82B36611200F4CFF3 /* emoji_96@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "emoji_96@2x.png"; sourceTree = ""; }; + 8CD780D92B36611200F4CFF3 /* emoji_88@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "emoji_88@2x.png"; sourceTree = ""; }; + 8CD780DA2B36611200F4CFF3 /* emoji_114@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "emoji_114@2x.png"; sourceTree = ""; }; + 8CD780DB2B36611200F4CFF3 /* emoji_84@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "emoji_84@2x.png"; sourceTree = ""; }; + 8CD780DC2B36611200F4CFF3 /* emoji_165@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "emoji_165@2x.png"; sourceTree = ""; }; + 8CD780DD2B36611200F4CFF3 /* emoji_118@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "emoji_118@2x.png"; sourceTree = ""; }; + 8CD780DE2B36611200F4CFF3 /* emoji_106@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "emoji_106@2x.png"; sourceTree = ""; }; + 8CD780DF2B36611200F4CFF3 /* emoji_130@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "emoji_130@2x.png"; sourceTree = ""; }; + 8CD780E02B36611200F4CFF3 /* emoji_141@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "emoji_141@2x.png"; sourceTree = ""; }; + 8CD780E12B36611200F4CFF3 /* emoji_122@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "emoji_122@2x.png"; sourceTree = ""; }; + 8CD780E22B36611200F4CFF3 /* emoji_14@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "emoji_14@2x.png"; sourceTree = ""; }; + 8CD780E32B36611200F4CFF3 /* emoji_69@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "emoji_69@2x.png"; sourceTree = ""; }; + 8CD780E42B36611200F4CFF3 /* emoji_77@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "emoji_77@2x.png"; sourceTree = ""; }; + 8CD780E52B36611200F4CFF3 /* emoji_06@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "emoji_06@2x.png"; sourceTree = ""; }; + 8CD780E62B36611200F4CFF3 /* emoji_18@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "emoji_18@2x.png"; sourceTree = ""; }; + 8CD780E72B36611200F4CFF3 /* emoji_65@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "emoji_65@2x.png"; sourceTree = ""; }; + 8CD780E82B36611200F4CFF3 /* emoji_30@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "emoji_30@2x.png"; sourceTree = ""; }; + 8CD780E92B36611200F4CFF3 /* emoji_53@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "emoji_53@2x.png"; sourceTree = ""; }; + 8CD780EA2B36611200F4CFF3 /* emoji_22@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "emoji_22@2x.png"; sourceTree = ""; }; + 8CD780EB2B36611200F4CFF3 /* emoji_41@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "emoji_41@2x.png"; sourceTree = ""; }; + 8CD780EC2B36611200F4CFF3 /* emoji_60@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "emoji_60@2x.png"; sourceTree = ""; }; + 8CD780ED2B36611200F4CFF3 /* emoji_03@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "emoji_03@2x.png"; sourceTree = ""; }; + 8CD780EE2B36611200F4CFF3 /* emoji_72@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "emoji_72@2x.png"; sourceTree = ""; }; + 8CD780EF2B36611200F4CFF3 /* emoji_11@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "emoji_11@2x.png"; sourceTree = ""; }; + 8CD780F02B36611200F4CFF3 /* emoji_39@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "emoji_39@2x.png"; sourceTree = ""; }; + 8CD780F12B36611200F4CFF3 /* emoji_44@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "emoji_44@2x.png"; sourceTree = ""; }; + 8CD780F22B36611200F4CFF3 /* emoji_27@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "emoji_27@2x.png"; sourceTree = ""; }; + 8CD780F32B36611200F4CFF3 /* emoji_200@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "emoji_200@2x.png"; sourceTree = ""; }; + 8CD780F42B36611200F4CFF3 /* emoji_56@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "emoji_56@2x.png"; sourceTree = ""; }; + 8CD780F52B36611200F4CFF3 /* emoji_35@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "emoji_35@2x.png"; sourceTree = ""; }; + 8CD780F62B36611200F4CFF3 /* emoji_48@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "emoji_48@2x.png"; sourceTree = ""; }; + 8CD780F72B36611200F4CFF3 /* emoji_103@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "emoji_103@2x.png"; sourceTree = ""; }; + 8CD780F82B36611200F4CFF3 /* emoji_81@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "emoji_81@2x.png"; sourceTree = ""; }; + 8CD780F92B36611200F4CFF3 /* emoji_160@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "emoji_160@2x.png"; sourceTree = ""; }; + 8CD780FA2B36611200F4CFF3 /* emoji_111@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "emoji_111@2x.png"; sourceTree = ""; }; + 8CD780FB2B36611200F4CFF3 /* emoji_93@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "emoji_93@2x.png"; sourceTree = ""; }; + 8CD780FC2B36611200F4CFF3 /* emoji_127@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "emoji_127@2x.png"; sourceTree = ""; }; + 8CD780FD2B36611200F4CFF3 /* emoji_144@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "emoji_144@2x.png"; sourceTree = ""; }; + 8CD780FE2B36611200F4CFF3 /* emoji_139@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "emoji_139@2x.png"; sourceTree = ""; }; + 8CD780FF2B36611200F4CFF3 /* emoji_148@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "emoji_148@2x.png"; sourceTree = ""; }; + 8CD781002B36611200F4CFF3 /* emoji_135@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "emoji_135@2x.png"; sourceTree = ""; }; + 8CD781012B36611200F4CFF3 /* emoji_91@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "emoji_91@2x.png"; sourceTree = ""; }; + 8CD781022B36611200F4CFF3 /* emoji_113@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "emoji_113@2x.png"; sourceTree = ""; }; + 8CD781032B36611200F4CFF3 /* emoji_83@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "emoji_83@2x.png"; sourceTree = ""; }; + 8CD781042B36611200F4CFF3 /* emoji_162@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "emoji_162@2x.png"; sourceTree = ""; }; + 8CD781052B36611200F4CFF3 /* emoji_101@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "emoji_101@2x.png"; sourceTree = ""; }; + 8CD781062B36611200F4CFF3 /* emoji_129@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "emoji_129@2x.png"; sourceTree = ""; }; + 8CD781072B36611200F4CFF3 /* emoji_137@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "emoji_137@2x.png"; sourceTree = ""; }; + 8CD781082B36611200F4CFF3 /* emoji_146@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "emoji_146@2x.png"; sourceTree = ""; }; + 8CD781092B36611200F4CFF3 /* emoji_125@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "emoji_125@2x.png"; sourceTree = ""; }; + 8CD7810A2B36611200F4CFF3 /* emoji_13@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "emoji_13@2x.png"; sourceTree = ""; }; + 8CD7810B2B36611200F4CFF3 /* emoji_70@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "emoji_70@2x.png"; sourceTree = ""; }; + 8CD7810C2B36611200F4CFF3 /* emoji_01@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "emoji_01@2x.png"; sourceTree = ""; }; + 8CD7810D2B36611200F4CFF3 /* emoji_62@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "emoji_62@2x.png"; sourceTree = ""; }; + 8CD7810E2B36611200F4CFF3 /* emoji_37@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "emoji_37@2x.png"; sourceTree = ""; }; + 8CD7810F2B36611200F4CFF3 /* emoji_29@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "emoji_29@2x.png"; sourceTree = ""; }; + 8CD781102B36611200F4CFF3 /* emoji_54@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "emoji_54@2x.png"; sourceTree = ""; }; + 8CD781112B36611200F4CFF3 /* emoj_s_normal@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "emoj_s_normal@2x.png"; sourceTree = ""; }; + 8CD781122B36611200F4CFF3 /* emoji_25@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "emoji_25@2x.png"; sourceTree = ""; }; + 8CD781132B36611200F4CFF3 /* emoji_58@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "emoji_58@2x.png"; sourceTree = ""; }; + 8CD781142B36611200F4CFF3 /* emoji_46@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "emoji_46@2x.png"; sourceTree = ""; }; + 8CD781152B36611200F4CFF3 /* emoji_del_pressed@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "emoji_del_pressed@2x.png"; sourceTree = ""; }; + 8CD781162B36611200F4CFF3 /* emoji_142@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "emoji_142@2x.png"; sourceTree = ""; }; + 8CD781172B36611200F4CFF3 /* emoji_121@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "emoji_121@2x.png"; sourceTree = ""; }; + 8CD781182B36611200F4CFF3 /* emoji_150@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "emoji_150@2x.png"; sourceTree = ""; }; + 8CD781192B36611200F4CFF3 /* emoji_133@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "emoji_133@2x.png"; sourceTree = ""; }; + 8CD7811A2B36611200F4CFF3 /* emoji_87@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "emoji_87@2x.png"; sourceTree = ""; }; + 8CD7811B2B36611200F4CFF3 /* emoji_166@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "emoji_166@2x.png"; sourceTree = ""; }; + 8CD7811C2B36611200F4CFF3 /* emoji_105@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "emoji_105@2x.png"; sourceTree = ""; }; + 8CD7811D2B36611200F4CFF3 /* emoji_99@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "emoji_99@2x.png"; sourceTree = ""; }; + 8CD7811E2B36611200F4CFF3 /* emoji_109@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "emoji_109@2x.png"; sourceTree = ""; }; + 8CD7811F2B36611200F4CFF3 /* emoji_95@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "emoji_95@2x.png"; sourceTree = ""; }; + 8CD781202B36611200F4CFF3 /* emoji_117@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "emoji_117@2x.png"; sourceTree = ""; }; + 8CD781212B36611200F4CFF3 /* emoji_21@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "emoji_21@2x.png"; sourceTree = ""; }; + 8CD781222B36611200F4CFF3 /* emoji_42@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "emoji_42@2x.png"; sourceTree = ""; }; + 8CD781232B36611200F4CFF3 /* emoji_33@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "emoji_33@2x.png"; sourceTree = ""; }; + 8CD781242B36611200F4CFF3 /* emoji_50@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "emoji_50@2x.png"; sourceTree = ""; }; + 8CD781252B36611200F4CFF3 /* emoji_78@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "emoji_78@2x.png"; sourceTree = ""; }; + 8CD781262B36611200F4CFF3 /* emoji_05@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "emoji_05@2x.png"; sourceTree = ""; }; + 8CD781272B36611200F4CFF3 /* emoji_66@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "emoji_66@2x.png"; sourceTree = ""; }; + 8CD781282B36611200F4CFF3 /* emoji_17@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "emoji_17@2x.png"; sourceTree = ""; }; + 8CD781292B36611200F4CFF3 /* emoji_74@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "emoji_74@2x.png"; sourceTree = ""; }; + 8CD7812A2B36611200F4CFF3 /* emoji_09@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "emoji_09@2x.png"; sourceTree = ""; }; + 8CD7812B2B36611200F4CFF3 /* emoji_52@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "emoji_52@2x.png"; sourceTree = ""; }; + 8CD7812C2B36611200F4CFF3 /* emoji_31@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "emoji_31@2x.png"; sourceTree = ""; }; + 8CD7812D2B36611200F4CFF3 /* emoji_40@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "emoji_40@2x.png"; sourceTree = ""; }; + 8CD7812E2B36611200F4CFF3 /* emoji_23@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "emoji_23@2x.png"; sourceTree = ""; }; + 8CD7812F2B36611200F4CFF3 /* emoji_del_normal@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "emoji_del_normal@2x.png"; sourceTree = ""; }; + 8CD781302B36611200F4CFF3 /* emoji_76@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "emoji_76@2x.png"; sourceTree = ""; }; + 8CD781312B36611200F4CFF3 /* emoji_68@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "emoji_68@2x.png"; sourceTree = ""; }; + 8CD781322B36611200F4CFF3 /* emoji_15@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "emoji_15@2x.png"; sourceTree = ""; }; + 8CD781332B36611200F4CFF3 /* emoji_64@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "emoji_64@2x.png"; sourceTree = ""; }; + 8CD781342B36611200F4CFF3 /* emoji_19@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "emoji_19@2x.png"; sourceTree = ""; }; + 8CD781352B36611200F4CFF3 /* emoji_07@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "emoji_07@2x.png"; sourceTree = ""; }; + 8CD781362B36611200F4CFF3 /* emoji_131@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "emoji_131@2x.png"; sourceTree = ""; }; + 8CD781372B36611200F4CFF3 /* emoj_s_pressed@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "emoj_s_pressed@2x.png"; sourceTree = ""; }; + 8CD781382B36611200F4CFF3 /* emoji_152@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "emoji_152@2x.png"; sourceTree = ""; }; + 8CD781392B36611200F4CFF3 /* emoji_123@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "emoji_123@2x.png"; sourceTree = ""; }; + 8CD7813A2B36611200F4CFF3 /* emoji_140@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "emoji_140@2x.png"; sourceTree = ""; }; + 8CD7813B2B36611200F4CFF3 /* emoji_115@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "emoji_115@2x.png"; sourceTree = ""; }; + 8CD7813C2B36611200F4CFF3 /* emoji_89@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "emoji_89@2x.png"; sourceTree = ""; }; + 8CD7813D2B36611200F4CFF3 /* emoji_97@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "emoji_97@2x.png"; sourceTree = ""; }; + 8CD7813E2B36611200F4CFF3 /* emoji_107@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "emoji_107@2x.png"; sourceTree = ""; }; + 8CD7813F2B36611200F4CFF3 /* emoji_119@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "emoji_119@2x.png"; sourceTree = ""; }; + 8CD781402B36611200F4CFF3 /* emoji_85@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "emoji_85@2x.png"; sourceTree = ""; }; + 8CD781412B36611200F4CFF3 /* emoji_164@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "emoji_164@2x.png"; sourceTree = ""; }; + 8CD781422B36611200F4CFF3 /* emoji.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; path = emoji.plist; sourceTree = ""; }; + 8CD781F72B366BB200F4CFF3 /* NSMutableAttributedString+MewUtil.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "NSMutableAttributedString+MewUtil.h"; sourceTree = ""; }; + 8CD781F82B366BB200F4CFF3 /* NSMutableAttributedString+MewUtil.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = "NSMutableAttributedString+MewUtil.m"; sourceTree = ""; }; + 8CD781FA2B3682D100F4CFF3 /* MewDynamicPhotoMomentModel.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = MewDynamicPhotoMomentModel.h; sourceTree = ""; }; + 8CD781FB2B3682D100F4CFF3 /* MewDynamicPhotoMomentModel.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = MewDynamicPhotoMomentModel.m; sourceTree = ""; }; + 8CD781FE2B38FC9500F4CFF3 /* MewShareView.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = MewShareView.h; sourceTree = ""; }; + 8CD781FF2B38FC9500F4CFF3 /* MewShareView.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = MewShareView.m; sourceTree = ""; }; + 8CD782022B38FD6700F4CFF3 /* MewShareItemModel.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = MewShareItemModel.h; sourceTree = ""; }; + 8CD782032B38FD6700F4CFF3 /* MewShareItemModel.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = MewShareItemModel.m; sourceTree = ""; }; + 8CD782052B3900EB00F4CFF3 /* MewPushShareModel.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = MewPushShareModel.h; sourceTree = ""; }; + 8CD782062B3900EB00F4CFF3 /* MewPushShareModel.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = MewPushShareModel.m; sourceTree = ""; }; + 8CD782082B3A0DC200F4CFF3 /* MewShareItemCollectionCell.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = MewShareItemCollectionCell.h; sourceTree = ""; }; + 8CD782092B3A0DC200F4CFF3 /* MewShareItemCollectionCell.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = MewShareItemCollectionCell.m; sourceTree = ""; }; A22C3BCB2715A2E8FDECEA30 /* 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 = ""; }; E9E8A33E3FDD457C53D1E6D7 /* 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 = ""; }; /* End PBXFileReference section */ @@ -1092,6 +1507,7 @@ 237053F32B1F3B3200F5DE14 /* UI */ = { isa = PBXGroup; children = ( + 8CD780822B36611200F4CFF3 /* InputView */, 8CD780242B33DBB800F4CFF3 /* SDPhotoBrowser */, 8CD7800C2B33BFC100F4CFF3 /* MewCustomView */, 8CD77FC92B311F3E00F4CFF3 /* CategoryTitleView */, @@ -1242,18 +1658,13 @@ 2370542D2B1F3B3200F5DE14 /* Model */ = { isa = PBXGroup; children = ( + 8CD780642B36546700F4CFF3 /* UserModel */, 237054C12B20179800F5DE14 /* MewAccountInfoStorage.h */, 237054C22B20179800F5DE14 /* MewAccountInfoStorage.m */, 237054C42B20265D00F5DE14 /* MewAccountModel.h */, 237054C52B20265D00F5DE14 /* MewAccountModel.m */, 237054C72B2027E000F5DE14 /* MewBaseModel.h */, 237054C82B2027E000F5DE14 /* MewBaseModel.m */, - 237054DA2B204ADD00F5DE14 /* MewUserInfoModel.h */, - 237054D92B204ADD00F5DE14 /* MewUserInfoModel.m */, - 237054DC2B204C4E00F5DE14 /* MewUserVipInfoVo.h */, - 237054DD2B204C4E00F5DE14 /* MewUserVipInfoVo.m */, - 237054EB2B20550400F5DE14 /* NSObject+MewAutoCoding.h */, - 237054EC2B20550400F5DE14 /* NSObject+MewAutoCoding.m */, ); path = Model; sourceTree = ""; @@ -1575,6 +1986,7 @@ 8C9C82DE2B0C697A00A601BC /* Main */ = { isa = PBXGroup; children = ( + 8CD781FD2B38FC7300F4CFF3 /* ShareView */, 8CD77FEA2B32181100F4CFF3 /* YoungerView */, 2370535E2B1F3AA100F5DE14 /* Home */, 2370534B2B1F3AA100F5DE14 /* Party */, @@ -1582,6 +1994,7 @@ 8C9C82EE2B0C697A00A601BC /* Room */, 233757242B0CB577001D0B7F /* Message */, 8C9C83822B0C697A00A601BC /* IM */, + 8CD780682B3659A300F4CFF3 /* Dynamic */, 8C9C83582B0C697A00A601BC /* Mine */, 8C9C83892B0C697A00A601BC /* Login */, 8CAB973C2B23A09800ED8639 /* WebView */, @@ -1805,7 +2218,6 @@ 8C9C83612B0C697A00A601BC /* Model */ = { isa = PBXGroup; children = ( - 8CD780482B3528BC00F4CFF3 /* UserPersonalCenter */, 8C9C83622B0C697A00A601BC /* Friend */, 8C9C836C2B0C697A00A601BC /* MewMineSettingItemModel.h */, 8C9C83652B0C697A00A601BC /* MewMineSettingItemModel.m */, @@ -2363,6 +2775,7 @@ 8CD780322B34FFCB00F4CFF3 /* Category */ = { isa = PBXGroup; children = ( + 8CD781F62B366B7400F4CFF3 /* NSAttributedString */, 8CD780382B35008E00F4CFF3 /* UIView */, 2370547C2B1F3B3200F5DE14 /* UIButton */, 237054492B1F3B3200F5DE14 /* UIImage */, @@ -2375,6 +2788,8 @@ 8CD780362B35001400F4CFF3 /* NSObject */ = { isa = PBXGroup; children = ( + 237054EB2B20550400F5DE14 /* NSObject+MewAutoCoding.h */, + 237054EC2B20550400F5DE14 /* NSObject+MewAutoCoding.m */, 237054662B1F3B3200F5DE14 /* NSObject+MEWExtension.h */, 237054742B1F3B3200F5DE14 /* NSObject+MEWExtension.m */, ); @@ -2399,13 +2814,6 @@ path = UIView; sourceTree = ""; }; - 8CD780482B3528BC00F4CFF3 /* UserPersonalCenter */ = { - isa = PBXGroup; - children = ( - ); - path = UserPersonalCenter; - sourceTree = ""; - }; 8CD780552B36176000F4CFF3 /* GiftWall */ = { isa = PBXGroup; children = ( @@ -2444,6 +2852,8 @@ 8CD780582B36180500F4CFF3 /* Dynamic */ = { isa = PBXGroup; children = ( + 8CD780652B3656C800F4CFF3 /* MewUserPersonalDynamicMomentTableCell.h */, + 8CD780662B3656C800F4CFF3 /* MewUserPersonalDynamicMomentTableCell.m */, 8CD780172B33CCA300F4CFF3 /* MewUserPersonalDynamicViewController.h */, 8CD780182B33CCA300F4CFF3 /* MewUserPersonalDynamicViewController.m */, ); @@ -2492,6 +2902,312 @@ path = Gift; sourceTree = ""; }; + 8CD780642B36546700F4CFF3 /* UserModel */ = { + isa = PBXGroup; + children = ( + 237054DA2B204ADD00F5DE14 /* MewUserInfoModel.h */, + 237054D92B204ADD00F5DE14 /* MewUserInfoModel.m */, + 237054DC2B204C4E00F5DE14 /* MewUserVipInfoModel.h */, + 237054DD2B204C4E00F5DE14 /* MewUserVipInfoModel.m */, + ); + path = UserModel; + sourceTree = ""; + }; + 8CD780682B3659A300F4CFF3 /* Dynamic */ = { + isa = PBXGroup; + children = ( + 8CD7807B2B365E3300F4CFF3 /* Model */, + 8CD780692B365A1000F4CFF3 /* View */, + ); + path = Dynamic; + sourceTree = ""; + }; + 8CD780692B365A1000F4CFF3 /* View */ = { + isa = PBXGroup; + children = ( + 8CD780762B365C0600F4CFF3 /* Config */, + 8CD7806A2B365A3200F4CFF3 /* MewDynamicMomentsContentView.h */, + 8CD7806B2B365A3200F4CFF3 /* MewDynamicMomentsContentView.m */, + 8CD7806D2B365A7300F4CFF3 /* MewDynamicMomentsPhotoView.h */, + 8CD7806E2B365A7300F4CFF3 /* MewDynamicMomentsPhotoView.m */, + 8CD780702B365AA400F4CFF3 /* MewDynamicMomentsToolBarView.h */, + 8CD780712B365AA400F4CFF3 /* MewDynamicMomentsToolBarView.m */, + 8CD780732B365AB800F4CFF3 /* MewDynamicMomentsTopicView.h */, + 8CD780742B365AB800F4CFF3 /* MewDynamicMomentsTopicView.m */, + ); + path = View; + sourceTree = ""; + }; + 8CD780762B365C0600F4CFF3 /* Config */ = { + isa = PBXGroup; + children = ( + 8CD7807A2B365CB800F4CFF3 /* MewDynamicLayoutConfig.h */, + 8CD780772B365C2D00F4CFF3 /* MewDynamicTextHeightLayout.h */, + 8CD780782B365C2D00F4CFF3 /* MewDynamicTextHeightLayout.m */, + ); + path = Config; + sourceTree = ""; + }; + 8CD7807B2B365E3300F4CFF3 /* Model */ = { + isa = PBXGroup; + children = ( + 8CD780612B36535B00F4CFF3 /* MewDynamicMomentModel.h */, + 8CD780622B36535B00F4CFF3 /* MewDynamicMomentModel.m */, + 8CD7807C2B365E9200F4CFF3 /* MewDynamicCommentModel.h */, + 8CD7807D2B365E9200F4CFF3 /* MewDynamicCommentModel.m */, + 8CD7807F2B365F3100F4CFF3 /* MewDynamicReplyCommentModel.h */, + 8CD780802B365F3100F4CFF3 /* MewDynamicReplyCommentModel.m */, + 8CD781FA2B3682D100F4CFF3 /* MewDynamicPhotoMomentModel.h */, + 8CD781FB2B3682D100F4CFF3 /* MewDynamicPhotoMomentModel.m */, + ); + path = Model; + sourceTree = ""; + }; + 8CD780822B36611200F4CFF3 /* InputView */ = { + isa = PBXGroup; + children = ( + 8CD780832B36611200F4CFF3 /* InputView */, + 8CD7809A2B36611200F4CFF3 /* Assets.xcassets */, + 8CD7809B2B36611200F4CFF3 /* Emoji */, + 8CD781422B36611200F4CFF3 /* emoji.plist */, + ); + path = InputView; + sourceTree = ""; + }; + 8CD780832B36611200F4CFF3 /* InputView */ = { + isa = PBXGroup; + children = ( + 8CD780842B36611200F4CFF3 /* QEmotionBoardView.m */, + 8CD780852B36611200F4CFF3 /* QEmotionHelper.h */, + 8CD780862B36611200F4CFF3 /* QInputBarViewConfiguration.m */, + 8CD780872B36611200F4CFF3 /* UITextView+QEmotion.m */, + 8CD780882B36611200F4CFF3 /* QInputBarView.m */, + 8CD780892B36611200F4CFF3 /* QEEmotionImageView.m */, + 8CD7808A2B36611200F4CFF3 /* QKeyboardBaseManager.m */, + 8CD7808B2B36611200F4CFF3 /* QEmotion.m */, + 8CD7808C2B36611200F4CFF3 /* QKeyboardManager.h */, + 8CD7808D2B36611200F4CFF3 /* QEmotionAttachment.h */, + 8CD7808E2B36611200F4CFF3 /* QExtendBoardView.m */, + 8CD7808F2B36611200F4CFF3 /* UITextView+QEmotion.h */, + 8CD780902B36611200F4CFF3 /* QInputBarViewConfiguration.h */, + 8CD780912B36611200F4CFF3 /* QEmotionHelper.m */, + 8CD780922B36611200F4CFF3 /* QEmotionBoardView.h */, + 8CD780932B36611200F4CFF3 /* QKeyboardBaseManager.h */, + 8CD780942B36611200F4CFF3 /* QEEmotionImageView.h */, + 8CD780952B36611200F4CFF3 /* QInputBarView.h */, + 8CD780962B36611200F4CFF3 /* QExtendBoardView.h */, + 8CD780972B36611200F4CFF3 /* QEmotionAttachment.m */, + 8CD780982B36611200F4CFF3 /* QKeyboardManager.m */, + 8CD780992B36611200F4CFF3 /* QEmotion.h */, + ); + path = InputView; + sourceTree = ""; + }; + 8CD7809B2B36611200F4CFF3 /* Emoji */ = { + isa = PBXGroup; + children = ( + 8CD7809C2B36611200F4CFF3 /* emoji_138@2x.png */, + 8CD7809D2B36611200F4CFF3 /* emoji_145@2x.png */, + 8CD7809E2B36611200F4CFF3 /* emoji_126@2x.png */, + 8CD7809F2B36611200F4CFF3 /* emoji_134@2x.png */, + 8CD780A02B36611200F4CFF3 /* emoji_149@2x.png */, + 8CD780A12B36611200F4CFF3 /* emoji_80@2x.png */, + 8CD780A22B36611200F4CFF3 /* emoji_161@2x.png */, + 8CD780A32B36611200F4CFF3 /* emoji_102@2x.png */, + 8CD780A42B36611200F4CFF3 /* emoji_92@2x.png */, + 8CD780A52B36611200F4CFF3 /* emoji_110@2x.png */, + 8CD780A62B36611200F4CFF3 /* emoji_26@2x.png */, + 8CD780A72B36611200F4CFF3 /* emoji_45@2x.png */, + 8CD780A82B36611200F4CFF3 /* emoji_38@2x.png */, + 8CD780A92B36611200F4CFF3 /* emoji_49@2x.png */, + 8CD780AA2B36611200F4CFF3 /* emoji_34@2x.png */, + 8CD780AB2B36611200F4CFF3 /* emoji_57@2x.png */, + 8CD780AC2B36611200F4CFF3 /* emoji_02@2x.png */, + 8CD780AD2B36611200F4CFF3 /* emoji_61@2x.png */, + 8CD780AE2B36611200F4CFF3 /* emoji_10@2x.png */, + 8CD780AF2B36611200F4CFF3 /* emoji_73@2x.png */, + 8CD780B02B36611200F4CFF3 /* emoji_55@2x.png */, + 8CD780B12B36611200F4CFF3 /* emoji_28@2x.png */, + 8CD780B22B36611200F4CFF3 /* emoji_36@2x.png */, + 8CD780B32B36611200F4CFF3 /* emoji_47@2x.png */, + 8CD780B42B36611200F4CFF3 /* emoji_59@2x.png */, + 8CD780B52B36611200F4CFF3 /* emoji_24@2x.png */, + 8CD780B62B36611200F4CFF3 /* emoji.xml */, + 8CD780B72B36611200F4CFF3 /* emoji_71@2x.png */, + 8CD780B82B36611200F4CFF3 /* emoji_12@2x.png */, + 8CD780B92B36611200F4CFF3 /* emoji_63@2x.png */, + 8CD780BA2B36611200F4CFF3 /* emoji_00@2x.png */, + 8CD780BB2B36611200F4CFF3 /* emoji_136@2x.png */, + 8CD780BC2B36611200F4CFF3 /* emoji_128@2x.png */, + 8CD780BD2B36611200F4CFF3 /* emoji_124@2x.png */, + 8CD780BE2B36611200F4CFF3 /* emoji_147@2x.png */, + 8CD780BF2B36611200F4CFF3 /* emoji_112@2x.png */, + 8CD780C02B36611200F4CFF3 /* emoji_90@2x.png */, + 8CD780C12B36611200F4CFF3 /* emoji_100@2x.png */, + 8CD780C22B36611200F4CFF3 /* emoji_82@2x.png */, + 8CD780C32B36611200F4CFF3 /* emoji_163@2x.png */, + 8CD780C42B36611200F4CFF3 /* emoji_67@2x.png */, + 8CD780C52B36611200F4CFF3 /* emoji_04@2x.png */, + 8CD780C62B36611200F4CFF3 /* emoji_79@2x.png */, + 8CD780C72B36611200F4CFF3 /* emoji_08@2x.png */, + 8CD780C82B36611200F4CFF3 /* emoji_75@2x.png */, + 8CD780C92B36611200F4CFF3 /* emoji_16@2x.png */, + 8CD780CA2B36611200F4CFF3 /* emoji_43@2x.png */, + 8CD780CB2B36611200F4CFF3 /* emoji_20@2x.png */, + 8CD780CC2B36611200F4CFF3 /* emoji_51@2x.png */, + 8CD780CD2B36611200F4CFF3 /* emoji_32@2x.png */, + 8CD780CE2B36611200F4CFF3 /* emoji_98@2x.png */, + 8CD780CF2B36611200F4CFF3 /* emoji_104@2x.png */, + 8CD780D02B36611200F4CFF3 /* emoji_86@2x.png */, + 8CD780D12B36611200F4CFF3 /* emoji_116@2x.png */, + 8CD780D22B36611200F4CFF3 /* emoji_94@2x.png */, + 8CD780D32B36611200F4CFF3 /* emoji_108@2x.png */, + 8CD780D42B36611200F4CFF3 /* emoji_120@2x.png */, + 8CD780D52B36611200F4CFF3 /* emoji_143@2x.png */, + 8CD780D62B36611200F4CFF3 /* emoji_132@2x.png */, + 8CD780D72B36611200F4CFF3 /* emoji_151@2x.png */, + 8CD780D82B36611200F4CFF3 /* emoji_96@2x.png */, + 8CD780D92B36611200F4CFF3 /* emoji_88@2x.png */, + 8CD780DA2B36611200F4CFF3 /* emoji_114@2x.png */, + 8CD780DB2B36611200F4CFF3 /* emoji_84@2x.png */, + 8CD780DC2B36611200F4CFF3 /* emoji_165@2x.png */, + 8CD780DD2B36611200F4CFF3 /* emoji_118@2x.png */, + 8CD780DE2B36611200F4CFF3 /* emoji_106@2x.png */, + 8CD780DF2B36611200F4CFF3 /* emoji_130@2x.png */, + 8CD780E02B36611200F4CFF3 /* emoji_141@2x.png */, + 8CD780E12B36611200F4CFF3 /* emoji_122@2x.png */, + 8CD780E22B36611200F4CFF3 /* emoji_14@2x.png */, + 8CD780E32B36611200F4CFF3 /* emoji_69@2x.png */, + 8CD780E42B36611200F4CFF3 /* emoji_77@2x.png */, + 8CD780E52B36611200F4CFF3 /* emoji_06@2x.png */, + 8CD780E62B36611200F4CFF3 /* emoji_18@2x.png */, + 8CD780E72B36611200F4CFF3 /* emoji_65@2x.png */, + 8CD780E82B36611200F4CFF3 /* emoji_30@2x.png */, + 8CD780E92B36611200F4CFF3 /* emoji_53@2x.png */, + 8CD780EA2B36611200F4CFF3 /* emoji_22@2x.png */, + 8CD780EB2B36611200F4CFF3 /* emoji_41@2x.png */, + 8CD780EC2B36611200F4CFF3 /* emoji_60@2x.png */, + 8CD780ED2B36611200F4CFF3 /* emoji_03@2x.png */, + 8CD780EE2B36611200F4CFF3 /* emoji_72@2x.png */, + 8CD780EF2B36611200F4CFF3 /* emoji_11@2x.png */, + 8CD780F02B36611200F4CFF3 /* emoji_39@2x.png */, + 8CD780F12B36611200F4CFF3 /* emoji_44@2x.png */, + 8CD780F22B36611200F4CFF3 /* emoji_27@2x.png */, + 8CD780F32B36611200F4CFF3 /* emoji_200@2x.png */, + 8CD780F42B36611200F4CFF3 /* emoji_56@2x.png */, + 8CD780F52B36611200F4CFF3 /* emoji_35@2x.png */, + 8CD780F62B36611200F4CFF3 /* emoji_48@2x.png */, + 8CD780F72B36611200F4CFF3 /* emoji_103@2x.png */, + 8CD780F82B36611200F4CFF3 /* emoji_81@2x.png */, + 8CD780F92B36611200F4CFF3 /* emoji_160@2x.png */, + 8CD780FA2B36611200F4CFF3 /* emoji_111@2x.png */, + 8CD780FB2B36611200F4CFF3 /* emoji_93@2x.png */, + 8CD780FC2B36611200F4CFF3 /* emoji_127@2x.png */, + 8CD780FD2B36611200F4CFF3 /* emoji_144@2x.png */, + 8CD780FE2B36611200F4CFF3 /* emoji_139@2x.png */, + 8CD780FF2B36611200F4CFF3 /* emoji_148@2x.png */, + 8CD781002B36611200F4CFF3 /* emoji_135@2x.png */, + 8CD781012B36611200F4CFF3 /* emoji_91@2x.png */, + 8CD781022B36611200F4CFF3 /* emoji_113@2x.png */, + 8CD781032B36611200F4CFF3 /* emoji_83@2x.png */, + 8CD781042B36611200F4CFF3 /* emoji_162@2x.png */, + 8CD781052B36611200F4CFF3 /* emoji_101@2x.png */, + 8CD781062B36611200F4CFF3 /* emoji_129@2x.png */, + 8CD781072B36611200F4CFF3 /* emoji_137@2x.png */, + 8CD781082B36611200F4CFF3 /* emoji_146@2x.png */, + 8CD781092B36611200F4CFF3 /* emoji_125@2x.png */, + 8CD7810A2B36611200F4CFF3 /* emoji_13@2x.png */, + 8CD7810B2B36611200F4CFF3 /* emoji_70@2x.png */, + 8CD7810C2B36611200F4CFF3 /* emoji_01@2x.png */, + 8CD7810D2B36611200F4CFF3 /* emoji_62@2x.png */, + 8CD7810E2B36611200F4CFF3 /* emoji_37@2x.png */, + 8CD7810F2B36611200F4CFF3 /* emoji_29@2x.png */, + 8CD781102B36611200F4CFF3 /* emoji_54@2x.png */, + 8CD781112B36611200F4CFF3 /* emoj_s_normal@2x.png */, + 8CD781122B36611200F4CFF3 /* emoji_25@2x.png */, + 8CD781132B36611200F4CFF3 /* emoji_58@2x.png */, + 8CD781142B36611200F4CFF3 /* emoji_46@2x.png */, + 8CD781152B36611200F4CFF3 /* emoji_del_pressed@2x.png */, + 8CD781162B36611200F4CFF3 /* emoji_142@2x.png */, + 8CD781172B36611200F4CFF3 /* emoji_121@2x.png */, + 8CD781182B36611200F4CFF3 /* emoji_150@2x.png */, + 8CD781192B36611200F4CFF3 /* emoji_133@2x.png */, + 8CD7811A2B36611200F4CFF3 /* emoji_87@2x.png */, + 8CD7811B2B36611200F4CFF3 /* emoji_166@2x.png */, + 8CD7811C2B36611200F4CFF3 /* emoji_105@2x.png */, + 8CD7811D2B36611200F4CFF3 /* emoji_99@2x.png */, + 8CD7811E2B36611200F4CFF3 /* emoji_109@2x.png */, + 8CD7811F2B36611200F4CFF3 /* emoji_95@2x.png */, + 8CD781202B36611200F4CFF3 /* emoji_117@2x.png */, + 8CD781212B36611200F4CFF3 /* emoji_21@2x.png */, + 8CD781222B36611200F4CFF3 /* emoji_42@2x.png */, + 8CD781232B36611200F4CFF3 /* emoji_33@2x.png */, + 8CD781242B36611200F4CFF3 /* emoji_50@2x.png */, + 8CD781252B36611200F4CFF3 /* emoji_78@2x.png */, + 8CD781262B36611200F4CFF3 /* emoji_05@2x.png */, + 8CD781272B36611200F4CFF3 /* emoji_66@2x.png */, + 8CD781282B36611200F4CFF3 /* emoji_17@2x.png */, + 8CD781292B36611200F4CFF3 /* emoji_74@2x.png */, + 8CD7812A2B36611200F4CFF3 /* emoji_09@2x.png */, + 8CD7812B2B36611200F4CFF3 /* emoji_52@2x.png */, + 8CD7812C2B36611200F4CFF3 /* emoji_31@2x.png */, + 8CD7812D2B36611200F4CFF3 /* emoji_40@2x.png */, + 8CD7812E2B36611200F4CFF3 /* emoji_23@2x.png */, + 8CD7812F2B36611200F4CFF3 /* emoji_del_normal@2x.png */, + 8CD781302B36611200F4CFF3 /* emoji_76@2x.png */, + 8CD781312B36611200F4CFF3 /* emoji_68@2x.png */, + 8CD781322B36611200F4CFF3 /* emoji_15@2x.png */, + 8CD781332B36611200F4CFF3 /* emoji_64@2x.png */, + 8CD781342B36611200F4CFF3 /* emoji_19@2x.png */, + 8CD781352B36611200F4CFF3 /* emoji_07@2x.png */, + 8CD781362B36611200F4CFF3 /* emoji_131@2x.png */, + 8CD781372B36611200F4CFF3 /* emoj_s_pressed@2x.png */, + 8CD781382B36611200F4CFF3 /* emoji_152@2x.png */, + 8CD781392B36611200F4CFF3 /* emoji_123@2x.png */, + 8CD7813A2B36611200F4CFF3 /* emoji_140@2x.png */, + 8CD7813B2B36611200F4CFF3 /* emoji_115@2x.png */, + 8CD7813C2B36611200F4CFF3 /* emoji_89@2x.png */, + 8CD7813D2B36611200F4CFF3 /* emoji_97@2x.png */, + 8CD7813E2B36611200F4CFF3 /* emoji_107@2x.png */, + 8CD7813F2B36611200F4CFF3 /* emoji_119@2x.png */, + 8CD781402B36611200F4CFF3 /* emoji_85@2x.png */, + 8CD781412B36611200F4CFF3 /* emoji_164@2x.png */, + ); + path = Emoji; + sourceTree = ""; + }; + 8CD781F62B366B7400F4CFF3 /* NSAttributedString */ = { + isa = PBXGroup; + children = ( + 8CD781F72B366BB200F4CFF3 /* NSMutableAttributedString+MewUtil.h */, + 8CD781F82B366BB200F4CFF3 /* NSMutableAttributedString+MewUtil.m */, + ); + path = NSAttributedString; + sourceTree = ""; + }; + 8CD781FD2B38FC7300F4CFF3 /* ShareView */ = { + isa = PBXGroup; + children = ( + 8CD782012B38FD5100F4CFF3 /* Model */, + 8CD781FE2B38FC9500F4CFF3 /* MewShareView.h */, + 8CD781FF2B38FC9500F4CFF3 /* MewShareView.m */, + 8CD782082B3A0DC200F4CFF3 /* MewShareItemCollectionCell.h */, + 8CD782092B3A0DC200F4CFF3 /* MewShareItemCollectionCell.m */, + ); + path = ShareView; + sourceTree = ""; + }; + 8CD782012B38FD5100F4CFF3 /* Model */ = { + isa = PBXGroup; + children = ( + 8CD782022B38FD6700F4CFF3 /* MewShareItemModel.h */, + 8CD782032B38FD6700F4CFF3 /* MewShareItemModel.m */, + 8CD782052B3900EB00F4CFF3 /* MewPushShareModel.h */, + 8CD782062B3900EB00F4CFF3 /* MewPushShareModel.m */, + ); + path = Model; + sourceTree = ""; + }; B603F71B608343F0E1A79C4B /* Frameworks */ = { isa = PBXGroup; children = ( @@ -2564,9 +3280,177 @@ isa = PBXResourcesBuildPhase; buildActionMask = 2147483647; files = ( + 8CD781BD2B36611200F4CFF3 /* emoji_13@2x.png in Resources */, + 8CD781522B36611200F4CFF3 /* emoji_134@2x.png in Resources */, + 8CD781AC2B36611200F4CFF3 /* emoji_160@2x.png in Resources */, + 8CD781652B36611200F4CFF3 /* emoji_36@2x.png in Resources */, + 8CD781EA2B36611200F4CFF3 /* emoj_s_pressed@2x.png in Resources */, + 8CD7816F2B36611200F4CFF3 /* emoji_128@2x.png in Resources */, + 8CD781E72B36611200F4CFF3 /* emoji_19@2x.png in Resources */, + 8CD7817F2B36611200F4CFF3 /* emoji_51@2x.png in Resources */, + 8CD7819E2B36611200F4CFF3 /* emoji_41@2x.png in Resources */, + 8CD7819B2B36611200F4CFF3 /* emoji_30@2x.png in Resources */, + 8CD781932B36611200F4CFF3 /* emoji_141@2x.png in Resources */, + 8CD781CE2B36611200F4CFF3 /* emoji_166@2x.png in Resources */, + 8CD781922B36611200F4CFF3 /* emoji_130@2x.png in Resources */, + 8CD781872B36611200F4CFF3 /* emoji_120@2x.png in Resources */, + 8CD781B82B36611200F4CFF3 /* emoji_101@2x.png in Resources */, + 8CD781D22B36611200F4CFF3 /* emoji_95@2x.png in Resources */, + 8CD781B92B36611200F4CFF3 /* emoji_129@2x.png in Resources */, + 8CD781B62B36611200F4CFF3 /* emoji_83@2x.png in Resources */, + 8CD781B52B36611200F4CFF3 /* emoji_113@2x.png in Resources */, + 8CD781782B36611200F4CFF3 /* emoji_04@2x.png in Resources */, + 8CD781B42B36611200F4CFF3 /* emoji_91@2x.png in Resources */, + 8CD781662B36611200F4CFF3 /* emoji_47@2x.png in Resources */, + 8CD781E12B36611200F4CFF3 /* emoji_23@2x.png in Resources */, + 8CD781752B36611200F4CFF3 /* emoji_82@2x.png in Resources */, + 8CD7819A2B36611200F4CFF3 /* emoji_65@2x.png in Resources */, 8C4D535F2AFD4CF700238AE6 /* LaunchScreen.storyboard in Resources */, + 8CD781DF2B36611200F4CFF3 /* emoji_31@2x.png in Resources */, + 8CD781F32B36611200F4CFF3 /* emoji_85@2x.png in Resources */, + 8CD781F22B36611200F4CFF3 /* emoji_119@2x.png in Resources */, + 8CD781C32B36611200F4CFF3 /* emoji_54@2x.png in Resources */, + 8CD781A32B36611200F4CFF3 /* emoji_39@2x.png in Resources */, + 8CD781C12B36611200F4CFF3 /* emoji_37@2x.png in Resources */, + 8CD781E02B36611200F4CFF3 /* emoji_40@2x.png in Resources */, + 8CD7815D2B36611200F4CFF3 /* emoji_34@2x.png in Resources */, + 8CD781DA2B36611200F4CFF3 /* emoji_66@2x.png in Resources */, + 8CD781F42B36611200F4CFF3 /* emoji_164@2x.png in Resources */, + 8CD781C52B36611200F4CFF3 /* emoji_25@2x.png in Resources */, + 8CD781CB2B36611200F4CFF3 /* emoji_150@2x.png in Resources */, + 8CD781D62B36611200F4CFF3 /* emoji_33@2x.png in Resources */, + 8CD781632B36611200F4CFF3 /* emoji_55@2x.png in Resources */, + 8CD781532B36611200F4CFF3 /* emoji_149@2x.png in Resources */, + 8CD781A62B36611200F4CFF3 /* emoji_200@2x.png in Resources */, + 8CD7816A2B36611200F4CFF3 /* emoji_71@2x.png in Resources */, + 8CD781B22B36611200F4CFF3 /* emoji_148@2x.png in Resources */, + 8CD781AA2B36611200F4CFF3 /* emoji_103@2x.png in Resources */, + 8CD781802B36611200F4CFF3 /* emoji_32@2x.png in Resources */, + 8CD781562B36611200F4CFF3 /* emoji_102@2x.png in Resources */, + 8CD7819F2B36611200F4CFF3 /* emoji_60@2x.png in Resources */, + 8CD7818E2B36611200F4CFF3 /* emoji_84@2x.png in Resources */, + 8CD781EF2B36611200F4CFF3 /* emoji_89@2x.png in Resources */, + 8CD781552B36611200F4CFF3 /* emoji_161@2x.png in Resources */, + 8CD781B12B36611200F4CFF3 /* emoji_139@2x.png in Resources */, + 8CD781CD2B36611200F4CFF3 /* emoji_87@2x.png in Resources */, + 8CD781E92B36611200F4CFF3 /* emoji_131@2x.png in Resources */, + 8CD781812B36611200F4CFF3 /* emoji_98@2x.png in Resources */, + 8CD781742B36611200F4CFF3 /* emoji_100@2x.png in Resources */, + 8CD7817C2B36611200F4CFF3 /* emoji_16@2x.png in Resources */, + 8CD7816C2B36611200F4CFF3 /* emoji_63@2x.png in Resources */, + 8CD7815F2B36611200F4CFF3 /* emoji_02@2x.png in Resources */, 8C4D535C2AFD4CF700238AE6 /* Assets.xcassets in Resources */, + 8CD781882B36611200F4CFF3 /* emoji_143@2x.png in Resources */, + 8CD7814E2B36611200F4CFF3 /* Assets.xcassets in Resources */, + 8CD781BC2B36611200F4CFF3 /* emoji_125@2x.png in Resources */, + 8CD781B02B36611200F4CFF3 /* emoji_144@2x.png in Resources */, + 8CD781702B36611200F4CFF3 /* emoji_124@2x.png in Resources */, + 8CD781DD2B36611200F4CFF3 /* emoji_09@2x.png in Resources */, + 8CD781C42B36611200F4CFF3 /* emoj_s_normal@2x.png in Resources */, + 8CD7814F2B36611200F4CFF3 /* emoji_138@2x.png in Resources */, + 8CD781E62B36611200F4CFF3 /* emoji_64@2x.png in Resources */, + 8CD781A22B36611200F4CFF3 /* emoji_11@2x.png in Resources */, + 8CD781D32B36611200F4CFF3 /* emoji_117@2x.png in Resources */, + 8CD7819C2B36611200F4CFF3 /* emoji_53@2x.png in Resources */, + 8CD781C22B36611200F4CFF3 /* emoji_29@2x.png in Resources */, + 8CD781602B36611200F4CFF3 /* emoji_61@2x.png in Resources */, + 8CD7815C2B36611200F4CFF3 /* emoji_49@2x.png in Resources */, + 8CD781EE2B36611200F4CFF3 /* emoji_115@2x.png in Resources */, + 8CD781682B36611200F4CFF3 /* emoji_24@2x.png in Resources */, + 8CD781BB2B36611200F4CFF3 /* emoji_146@2x.png in Resources */, + 8CD781A92B36611200F4CFF3 /* emoji_48@2x.png in Resources */, + 8CD781892B36611200F4CFF3 /* emoji_132@2x.png in Resources */, + 8CD781DB2B36611200F4CFF3 /* emoji_17@2x.png in Resources */, + 8CD781722B36611200F4CFF3 /* emoji_112@2x.png in Resources */, + 8CD7815A2B36611200F4CFF3 /* emoji_45@2x.png in Resources */, + 8CD781912B36611200F4CFF3 /* emoji_106@2x.png in Resources */, + 8CD781502B36611200F4CFF3 /* emoji_145@2x.png in Resources */, 8C4D535A2AFD4CF600238AE6 /* Main.storyboard in Resources */, + 8CD7819D2B36611200F4CFF3 /* emoji_22@2x.png in Resources */, + 8CD781F12B36611200F4CFF3 /* emoji_107@2x.png in Resources */, + 8CD7818B2B36611200F4CFF3 /* emoji_96@2x.png in Resources */, + 8CD781D42B36611200F4CFF3 /* emoji_21@2x.png in Resources */, + 8CD781ED2B36611200F4CFF3 /* emoji_140@2x.png in Resources */, + 8CD781A52B36611200F4CFF3 /* emoji_27@2x.png in Resources */, + 8CD781512B36611200F4CFF3 /* emoji_126@2x.png in Resources */, + 8CD781842B36611200F4CFF3 /* emoji_116@2x.png in Resources */, + 8CD781A42B36611200F4CFF3 /* emoji_44@2x.png in Resources */, + 8CD781AE2B36611200F4CFF3 /* emoji_93@2x.png in Resources */, + 8CD781CC2B36611200F4CFF3 /* emoji_133@2x.png in Resources */, + 8CD781642B36611200F4CFF3 /* emoji_28@2x.png in Resources */, + 8CD781672B36611200F4CFF3 /* emoji_59@2x.png in Resources */, + 8CD7818F2B36611200F4CFF3 /* emoji_165@2x.png in Resources */, + 8CD7816B2B36611200F4CFF3 /* emoji_12@2x.png in Resources */, + 8CD781B72B36611200F4CFF3 /* emoji_162@2x.png in Resources */, + 8CD781E52B36611200F4CFF3 /* emoji_15@2x.png in Resources */, + 8CD781592B36611200F4CFF3 /* emoji_26@2x.png in Resources */, + 8CD781E32B36611200F4CFF3 /* emoji_76@2x.png in Resources */, + 8CD781C02B36611200F4CFF3 /* emoji_62@2x.png in Resources */, + 8CD781A12B36611200F4CFF3 /* emoji_72@2x.png in Resources */, + 8CD781B32B36611200F4CFF3 /* emoji_135@2x.png in Resources */, + 8CD781F52B36611200F4CFF3 /* emoji.plist in Resources */, + 8CD781EB2B36611200F4CFF3 /* emoji_152@2x.png in Resources */, + 8CD781962B36611200F4CFF3 /* emoji_69@2x.png in Resources */, + 8CD781D52B36611200F4CFF3 /* emoji_42@2x.png in Resources */, + 8CD781772B36611200F4CFF3 /* emoji_67@2x.png in Resources */, + 8CD781732B36611200F4CFF3 /* emoji_90@2x.png in Resources */, + 8CD781C62B36611200F4CFF3 /* emoji_58@2x.png in Resources */, + 8CD781BA2B36611200F4CFF3 /* emoji_137@2x.png in Resources */, + 8CD781A82B36611200F4CFF3 /* emoji_35@2x.png in Resources */, + 8CD781622B36611200F4CFF3 /* emoji_73@2x.png in Resources */, + 8CD7815B2B36611200F4CFF3 /* emoji_38@2x.png in Resources */, + 8CD7818C2B36611200F4CFF3 /* emoji_88@2x.png in Resources */, + 8CD781DE2B36611200F4CFF3 /* emoji_52@2x.png in Resources */, + 8CD781862B36611200F4CFF3 /* emoji_108@2x.png in Resources */, + 8CD781612B36611200F4CFF3 /* emoji_10@2x.png in Resources */, + 8CD781902B36611200F4CFF3 /* emoji_118@2x.png in Resources */, + 8CD781D12B36611200F4CFF3 /* emoji_109@2x.png in Resources */, + 8CD781C92B36611200F4CFF3 /* emoji_142@2x.png in Resources */, + 8CD781982B36611200F4CFF3 /* emoji_06@2x.png in Resources */, + 8CD781D02B36611200F4CFF3 /* emoji_99@2x.png in Resources */, + 8CD781AD2B36611200F4CFF3 /* emoji_111@2x.png in Resources */, + 8CD781572B36611200F4CFF3 /* emoji_92@2x.png in Resources */, + 8CD781AF2B36611200F4CFF3 /* emoji_127@2x.png in Resources */, + 8CD781582B36611200F4CFF3 /* emoji_110@2x.png in Resources */, + 8CD7817B2B36611200F4CFF3 /* emoji_75@2x.png in Resources */, + 8CD781D92B36611200F4CFF3 /* emoji_05@2x.png in Resources */, + 8CD7818D2B36611200F4CFF3 /* emoji_114@2x.png in Resources */, + 8CD781C82B36611200F4CFF3 /* emoji_del_pressed@2x.png in Resources */, + 8CD781952B36611200F4CFF3 /* emoji_14@2x.png in Resources */, + 8CD7817A2B36611200F4CFF3 /* emoji_08@2x.png in Resources */, + 8CD781942B36611200F4CFF3 /* emoji_122@2x.png in Resources */, + 8CD781822B36611200F4CFF3 /* emoji_104@2x.png in Resources */, + 8CD781C72B36611200F4CFF3 /* emoji_46@2x.png in Resources */, + 8CD781E42B36611200F4CFF3 /* emoji_68@2x.png in Resources */, + 8CD781CF2B36611200F4CFF3 /* emoji_105@2x.png in Resources */, + 8CD781992B36611200F4CFF3 /* emoji_18@2x.png in Resources */, + 8CD781692B36611200F4CFF3 /* emoji.xml in Resources */, + 8CD781542B36611200F4CFF3 /* emoji_80@2x.png in Resources */, + 8CD781712B36611200F4CFF3 /* emoji_147@2x.png in Resources */, + 8CD781BF2B36611200F4CFF3 /* emoji_01@2x.png in Resources */, + 8CD781EC2B36611200F4CFF3 /* emoji_123@2x.png in Resources */, + 8CD7815E2B36611200F4CFF3 /* emoji_57@2x.png in Resources */, + 8CD781AB2B36611200F4CFF3 /* emoji_81@2x.png in Resources */, + 8CD7818A2B36611200F4CFF3 /* emoji_151@2x.png in Resources */, + 8CD781792B36611200F4CFF3 /* emoji_79@2x.png in Resources */, + 8CD781CA2B36611200F4CFF3 /* emoji_121@2x.png in Resources */, + 8CD7816E2B36611200F4CFF3 /* emoji_136@2x.png in Resources */, + 8CD781852B36611200F4CFF3 /* emoji_94@2x.png in Resources */, + 8CD781E82B36611200F4CFF3 /* emoji_07@2x.png in Resources */, + 8CD781A72B36611200F4CFF3 /* emoji_56@2x.png in Resources */, + 8CD781E22B36611200F4CFF3 /* emoji_del_normal@2x.png in Resources */, + 8CD781D82B36611200F4CFF3 /* emoji_78@2x.png in Resources */, + 8CD7817D2B36611200F4CFF3 /* emoji_43@2x.png in Resources */, + 8CD7817E2B36611200F4CFF3 /* emoji_20@2x.png in Resources */, + 8CD781F02B36611200F4CFF3 /* emoji_97@2x.png in Resources */, + 8CD781BE2B36611200F4CFF3 /* emoji_70@2x.png in Resources */, + 8CD781762B36611200F4CFF3 /* emoji_163@2x.png in Resources */, + 8CD781972B36611200F4CFF3 /* emoji_77@2x.png in Resources */, + 8CD781D72B36611200F4CFF3 /* emoji_50@2x.png in Resources */, + 8CD781DC2B36611200F4CFF3 /* emoji_74@2x.png in Resources */, + 8CD781832B36611200F4CFF3 /* emoji_86@2x.png in Resources */, + 8CD781A02B36611200F4CFF3 /* emoji_03@2x.png in Resources */, + 8CD7816D2B36611200F4CFF3 /* emoji_00@2x.png in Resources */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -2638,14 +3522,19 @@ files = ( 8CD77FC52B31189300F4CFF3 /* MewMessageSessionViewController.m in Sources */, 8C9C84482B0C697A00A601BC /* MewMineSettingTableViewCell.m in Sources */, + 8CD780632B36535B00F4CFF3 /* MewDynamicMomentModel.m in Sources */, 233757682B0CB577001D0B7F /* MewNIMMessageUtils.m in Sources */, 237053942B1F3AA100F5DE14 /* MewPartyListCollectionViewCell.m in Sources */, 2370548F2B1F3B3200F5DE14 /* TTAlertView.m in Sources */, + 8CD7814B2B36611200F4CFF3 /* QEmotionHelper.m in Sources */, 8C9C843B2B0C697A00A601BC /* MewTRTCRtcImpl.m in Sources */, 237053982B1F3AA100F5DE14 /* MewAudioPlayerManager.m in Sources */, 8CD77FD52B31297A00F4CFF3 /* MewSessionHeaderItemModel.m in Sources */, + 8CD780752B365AB800F4CFF3 /* MewDynamicMomentsTopicView.m in Sources */, + 8CD780792B365C2D00F4CFF3 /* MewDynamicTextHeightLayout.m in Sources */, 8CD77FE22B3133FC00F4CFF3 /* MewMusicNoteView.m in Sources */, 2337575C2B0CB577001D0B7F /* MewSessionMessageCell.m in Sources */, + 8CD781FC2B3682D100F4CFF3 /* MewDynamicPhotoMomentModel.m in Sources */, 8C9C821F2B0C694900A601BC /* AppDelegate.m in Sources */, 8C92A8182B0EF3E9008F362C /* MewMineModifPayPwdView.m in Sources */, 237053F12B1F3B1700F5DE14 /* MewHtmlUrl.m in Sources */, @@ -2655,7 +3544,9 @@ 8CD780352B35000800F4CFF3 /* NSString+MewUtil.m in Sources */, 8CD7802E2B33DBDB00F4CFF3 /* SDPhotoBrowser.m in Sources */, 2370547F2B1F3B3200F5DE14 /* UIView+MewFilletCorner.m in Sources */, + 8CD7814D2B36611200F4CFF3 /* QKeyboardManager.m in Sources */, 8CD7800F2B33BFE600F4CFF3 /* MewCustomNavView.m in Sources */, + 8CD781462B36611200F4CFF3 /* QInputBarView.m in Sources */, 8C9C84462B0C697A00A601BC /* MewMineSettingViewController.m in Sources */, 8CD780412B351CB800F4CFF3 /* MewProfileSkillCardCollectionCell.m in Sources */, 237054882B1F3B3200F5DE14 /* MewEmptyTableViewCell.m in Sources */, @@ -2663,6 +3554,7 @@ 237054872B1F3B3200F5DE14 /* MewButton.m in Sources */, 237053142B1F3A3D00F5DE14 /* MewClientConfig.m in Sources */, 8CD7800B2B33B79500F4CFF3 /* MewUserPersonalDetailViewController.m in Sources */, + 8CD780722B365AA400F4CFF3 /* MewDynamicMomentsToolBarView.m in Sources */, 8C9C843D2B0C697A00A601BC /* MewMineCollectRoomPresenter.m in Sources */, 2370531D2B1F3A6E00F5DE14 /* MewWebViewController.m in Sources */, 237054E12B204DA400F5DE14 /* MewMvpViewController.m in Sources */, @@ -2671,6 +3563,7 @@ 8CD77FFF2B32832C00F4CFF3 /* MewAlertModel.m in Sources */, 2370539C2B1F3AA100F5DE14 /* MewVoiceDiscView.m in Sources */, 23270C292B0E037300B9303B /* MewMessageConentAudioView.m in Sources */, + 8CD782072B3900EB00F4CFF3 /* MewPushShareModel.m in Sources */, 8C9C84892B0D286F00A601BC /* Api+Gift.m in Sources */, 8CD780232B33D23100F4CFF3 /* MewUserInfoPhotoModel.m in Sources */, 237053902B1F3AA100F5DE14 /* MewSessionListViewController.m in Sources */, @@ -2678,7 +3571,7 @@ 237053862B1F3AA100F5DE14 /* MewRoomMessageTableCell.m in Sources */, 8C9C849E2B0D6A5C00A601BC /* MewGiftStorage.m in Sources */, 237053F22B1F3B1700F5DE14 /* MewConstant.m in Sources */, - 237054DE2B204C4E00F5DE14 /* MewUserVipInfoVo.m in Sources */, + 237054DE2B204C4E00F5DE14 /* MewUserVipInfoModel.m in Sources */, 237054AD2B1F3B3200F5DE14 /* YYReachability.m in Sources */, 8CD780072B3379C800F4CFF3 /* MewCATransitionAnimation.m in Sources */, 237054DB2B204ADE00F5DE14 /* MewUserInfoModel.m in Sources */, @@ -2698,7 +3591,10 @@ 8C9C84542B0C697A00A601BC /* MewLoginInputView.m in Sources */, 233757632B0CB577001D0B7F /* MewMessageContentUnSupportView.m in Sources */, 2337575E2B0CB577001D0B7F /* MewNIMMessageMaker.m in Sources */, + 8CD7806F2B365A7300F4CFF3 /* MewDynamicMomentsPhotoView.m in Sources */, + 8CD781452B36611200F4CFF3 /* UITextView+QEmotion.m in Sources */, 233757622B0CB577001D0B7F /* MewMessageContentImage.m in Sources */, + 8CD7806C2B365A3200F4CFF3 /* MewDynamicMomentsContentView.m in Sources */, 237053822B1F3AA100F5DE14 /* MewSocialMicroView.m in Sources */, 8C9C84532B0C697A00A601BC /* MewLoginForgetPasswordViewController.m in Sources */, 237054BB2B1F3BF600F5DE14 /* MewTabBarController.m in Sources */, @@ -2709,10 +3605,12 @@ 2337575B2B0CB577001D0B7F /* UIView+NIM.m in Sources */, 237054892B1F3B3200F5DE14 /* TTPopup.m in Sources */, 8C9C843F2B0C697A00A601BC /* MewFansInfoModel.m in Sources */, + 8CD782002B38FC9500F4CFF3 /* MewShareView.m in Sources */, 8CD7804B2B35290F00F4CFF3 /* MewSaveSkillCardModel.m in Sources */, 233757652B0CB577001D0B7F /* MewSessionNavView.m in Sources */, 8C9C84282B0C697A00A601BC /* MewRoomMessageParser.m in Sources */, 8CAB97012B1FE16000ED8639 /* UITableView+NIMScrollToBottom.m in Sources */, + 8CD7820A2B3A0DC200F4CFF3 /* MewShareItemCollectionCell.m in Sources */, 237053A42B1F3AA100F5DE14 /* Api+MewHome.m in Sources */, 233757592B0CB577001D0B7F /* MewNIMBadgeView.m in Sources */, 237054A42B1F3B3200F5DE14 /* MewTimeIntervalUtils.m in Sources */, @@ -2730,19 +3628,23 @@ 8C9C84442B0C697A00A601BC /* MewMineCollectRoomCell.m in Sources */, 237053A32B1F3AA100F5DE14 /* MewRightFollowVoiceCollectionCell.m in Sources */, 8CD780442B351D4B00F4CFF3 /* MewSkillCardInfoModel.m in Sources */, + 8CD782042B38FD6700F4CFF3 /* MewShareItemModel.m in Sources */, 8C9C84402B0C697A00A601BC /* MewMineSettingItemModel.m in Sources */, 237054AE2B1F3B3200F5DE14 /* NSObject+MEWExtension.m in Sources */, 8C9C84232B0C697A00A601BC /* MewMicroStateModel.m in Sources */, 8C9C84212B0C697A00A601BC /* MewMicroQueueModel.m in Sources */, 8C9C844F2B0C697A00A601BC /* MewLoginFullInfoPresenter.m in Sources */, 8C9C84222B0C697A00A601BC /* MewMicroExtModel.m in Sources */, + 8CD781F92B366BB200F4CFF3 /* NSMutableAttributedString+MewUtil.m in Sources */, 8C9C843C2B0C697A00A601BC /* MewRtcManager.m in Sources */, 8C9C84BA2B0ECD2100A601BC /* MewMineRechargePresenter.m in Sources */, + 8CD781442B36611200F4CFF3 /* QInputBarViewConfiguration.m in Sources */, 8CD77FED2B32182D00F4CFF3 /* MewYoungerView.m in Sources */, 2370538C2B1F3AA100F5DE14 /* MewLoginPasswordView.m in Sources */, 8CD780312B33DD5500F4CFF3 /* MewUserPersonalDetailHeaderInfoView.m in Sources */, 8C9C841E2B0C697A00A601BC /* MewRoomSendTextView.m in Sources */, 237053992B1F3AA100F5DE14 /* MewHomeViewController.m in Sources */, + 8CD781492B36611200F4CFF3 /* QEmotion.m in Sources */, 8C9C843E2B0C697A00A601BC /* MewMineSettingPresenter.m in Sources */, 8C4D53622AFD4CF700238AE6 /* main.m in Sources */, 233757642B0CB577001D0B7F /* MewMessageContentText.m in Sources */, @@ -2755,8 +3657,12 @@ 237053172B1F3A5300F5DE14 /* Api+MewMain.m in Sources */, 2370538D2B1F3AA100F5DE14 /* MewLoginNumberViewController.m in Sources */, 8C9C84252B0C697A00A601BC /* MewMessageInfoModel.m in Sources */, + 8CD781472B36611200F4CFF3 /* QEEmotionImageView.m in Sources */, + 8CD781482B36611200F4CFF3 /* QKeyboardBaseManager.m in Sources */, + 8CD7814C2B36611200F4CFF3 /* QEmotionAttachment.m in Sources */, 237054A62B1F3B3200F5DE14 /* MEWBase64.m in Sources */, 237054912B1F3B3200F5DE14 /* TTPopupService.m in Sources */, + 8CD7807E2B365E9200F4CFF3 /* MewDynamicCommentModel.m in Sources */, 233757582B0CB577001D0B7F /* MewChatLimitModel.m in Sources */, 2370539A2B1F3AA100F5DE14 /* MewVoiceGuideView.m in Sources */, 8CD77FF12B321CB500F4CFF3 /* MewMessageSessionListTableCell.m in Sources */, @@ -2811,10 +3717,12 @@ 8C9C84272B0C697A00A601BC /* MewNetImageLabel.m in Sources */, 2370538E2B1F3AA100F5DE14 /* MewLoginViewController.m in Sources */, 8CD780512B36137C00F4CFF3 /* MewEmptyCollectionViewCell.m in Sources */, + 8CD780812B365F3100F4CFF3 /* MewDynamicReplyCommentModel.m in Sources */, 237054842B1F3B3200F5DE14 /* UIImageConstant.m in Sources */, 8CD7805F2B36193200F4CFF3 /* MewUserGiftWallModel.m in Sources */, 8C9C842A2B0C697A00A601BC /* Api+Room.m in Sources */, 8CD77FCC2B311FBE00F4CFF3 /* MewCategoryTitleContainerView.m in Sources */, + 8CD781432B36611200F4CFF3 /* QEmotionBoardView.m in Sources */, 2370549F2B1F3B3200F5DE14 /* UIImage+RW.m in Sources */, 8C9C84902B0D439800A601BC /* MewRoomMessageFilter.m in Sources */, 237054E42B204ED000F5DE14 /* MewUtility.m in Sources */, @@ -2846,6 +3754,7 @@ 237054822B1F3B3200F5DE14 /* MewBaseNavigationController.m in Sources */, 237054852B1F3B3200F5DE14 /* NetImageConfig.m in Sources */, 2370548B2B1F3B3200F5DE14 /* TTAlertButtonConfig.m in Sources */, + 8CD780672B3656C800F4CFF3 /* MewUserPersonalDynamicMomentTableCell.m in Sources */, 2370548A2B1F3B3200F5DE14 /* TTAlertConfig.m in Sources */, 8C9C84562B0C697A00A601BC /* MewLoginFullInfoViewController.m in Sources */, 8CD7801F2B33CFF400F4CFF3 /* MewUserPersonalDetailHeaderPhotosView.m in Sources */, @@ -2853,6 +3762,7 @@ 237054A12B1F3B3200F5DE14 /* NSArray+MewSafe.m in Sources */, 8CD77FFB2B3272CA00F4CFF3 /* MewAlertPopup.m in Sources */, 2370539B2B1F3AA100F5DE14 /* MewPushExclusiveVoiceView.m in Sources */, + 8CD7814A2B36611200F4CFF3 /* QExtendBoardView.m in Sources */, 237054802B1F3B3200F5DE14 /* UIImage+MewUtils.m in Sources */, 8C92A8142B0EF1D8008F362C /* MewMineLoginPasswordViewController.m in Sources */, 8C9C84942B0D65C300A601BC /* MewRoomAnimationHitView.m in Sources */, diff --git a/yinmeng-ios/yinmeng-ios/Assets.xcassets/Common/common_gray_next_button.imageset/Contents.json b/yinmeng-ios/yinmeng-ios/Assets.xcassets/Common/common_gray_next_button.imageset/Contents.json new file mode 100644 index 0000000..db65e19 --- /dev/null +++ b/yinmeng-ios/yinmeng-ios/Assets.xcassets/Common/common_gray_next_button.imageset/Contents.json @@ -0,0 +1,22 @@ +{ + "images" : [ + { + "idiom" : "universal", + "scale" : "1x" + }, + { + "filename" : "common_gray_next_button@2x.png", + "idiom" : "universal", + "scale" : "2x" + }, + { + "filename" : "common_gray_next_button@3x.png", + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/yinmeng-ios/yinmeng-ios/Assets.xcassets/Common/common_gray_next_button.imageset/common_gray_next_button@2x.png b/yinmeng-ios/yinmeng-ios/Assets.xcassets/Common/common_gray_next_button.imageset/common_gray_next_button@2x.png new file mode 100644 index 0000000..e1eff85 Binary files /dev/null and b/yinmeng-ios/yinmeng-ios/Assets.xcassets/Common/common_gray_next_button.imageset/common_gray_next_button@2x.png differ diff --git a/yinmeng-ios/yinmeng-ios/Assets.xcassets/Common/common_gray_next_button.imageset/common_gray_next_button@3x.png b/yinmeng-ios/yinmeng-ios/Assets.xcassets/Common/common_gray_next_button.imageset/common_gray_next_button@3x.png new file mode 100644 index 0000000..17c784d Binary files /dev/null and b/yinmeng-ios/yinmeng-ios/Assets.xcassets/Common/common_gray_next_button.imageset/common_gray_next_button@3x.png differ diff --git a/yinmeng-ios/yinmeng-ios/Base/Category/NSAttributedString/NSMutableAttributedString+MewUtil.h b/yinmeng-ios/yinmeng-ios/Base/Category/NSAttributedString/NSMutableAttributedString+MewUtil.h new file mode 100644 index 0000000..c26e7e8 --- /dev/null +++ b/yinmeng-ios/yinmeng-ios/Base/Category/NSAttributedString/NSMutableAttributedString+MewUtil.h @@ -0,0 +1,21 @@ +// +// NSMutableAttributedString+MewUtil.h +// yinmeng-ios +// +// Created by 触海 on 2023/12/22. +// + +#import + +NS_ASSUME_NONNULL_BEGIN + +@interface NSMutableAttributedString (MewUtil) + +/// 创建NSMutableAttributedString ++ (NSMutableAttributedString *)Mew_MutableAttibuteString:(NSString *)string attibute:(NSDictionary *)attribute; + +/// 创建动态/广场的NSMutableAttributedString ++ (NSMutableAttributedString *)Mew_MutableAttibuteTextAttachementSuqare:(BOOL)suqare content:(NSString *)content; +@end + +NS_ASSUME_NONNULL_END diff --git a/yinmeng-ios/yinmeng-ios/Base/Category/NSAttributedString/NSMutableAttributedString+MewUtil.m b/yinmeng-ios/yinmeng-ios/Base/Category/NSAttributedString/NSMutableAttributedString+MewUtil.m new file mode 100644 index 0000000..fe23fa0 --- /dev/null +++ b/yinmeng-ios/yinmeng-ios/Base/Category/NSAttributedString/NSMutableAttributedString+MewUtil.m @@ -0,0 +1,36 @@ +// +// NSMutableAttributedString+MewUtil.m +// yinmeng-ios +// +// Created by 触海 on 2023/12/22. +// + +#import "NSMutableAttributedString+MewUtil.h" +#import "MewMacro.h" +#import + +@implementation NSMutableAttributedString (MewUtil) + +/// 创建NSMutableAttributedString ++ (NSMutableAttributedString *)Mew_MutableAttibuteString:(NSString *)string attibute:(NSDictionary *)attribute { + NSString *customStr = (string.length == 0 || [string isEqualToString:@""]) ? @" " : string; + return [[NSMutableAttributedString alloc] initWithString:customStr attributes:attribute]; +} + + +/// 创建动态/广场的NSMutableAttributedString ++ (NSMutableAttributedString *)Mew_MutableAttibuteTextAttachementSuqare:(BOOL)suqare content:(NSString *)content { + NSMutableAttributedString *attributedString = [[NSMutableAttributedString alloc] init]; + if (suqare) {//动态/广场 + NSTextAttachment * attachment = [[NSTextAttachment alloc] init]; + attachment.bounds = CGRectMake(0, 0, 25 * 1.3, 10 * 1.3); + attachment.image = [UIImage imageNamed:@"monents_info_top"]; + NSAttributedString * starAttribute = [NSMutableAttributedString attributedStringWithAttachment:(NSTextAttachment *)attachment]; + [attributedString insertAttributedString:starAttribute atIndex:0]; + } + [attributedString appendAttributedString:[self Mew_MutableAttibuteString:content attibute:@{NSFontAttributeName:kFontRegular(15)}]]; + attributedString.yy_lineSpacing = 5; + attributedString.yy_lineBreakMode = NSLineBreakByWordWrapping; + return attributedString; +} +@end diff --git a/yinmeng-ios/yinmeng-ios/Base/MVP/Model/NSObject+MewAutoCoding.h b/yinmeng-ios/yinmeng-ios/Base/Category/NSObject/NSObject+MewAutoCoding.h similarity index 100% rename from yinmeng-ios/yinmeng-ios/Base/MVP/Model/NSObject+MewAutoCoding.h rename to yinmeng-ios/yinmeng-ios/Base/Category/NSObject/NSObject+MewAutoCoding.h diff --git a/yinmeng-ios/yinmeng-ios/Base/MVP/Model/NSObject+MewAutoCoding.m b/yinmeng-ios/yinmeng-ios/Base/Category/NSObject/NSObject+MewAutoCoding.m similarity index 100% rename from yinmeng-ios/yinmeng-ios/Base/MVP/Model/NSObject+MewAutoCoding.m rename to yinmeng-ios/yinmeng-ios/Base/Category/NSObject/NSObject+MewAutoCoding.m diff --git a/yinmeng-ios/yinmeng-ios/Base/MVP/Model/MewUserInfoModel.h b/yinmeng-ios/yinmeng-ios/Base/MVP/Model/UserModel/MewUserInfoModel.h similarity index 90% rename from yinmeng-ios/yinmeng-ios/Base/MVP/Model/MewUserInfoModel.h rename to yinmeng-ios/yinmeng-ios/Base/MVP/Model/UserModel/MewUserInfoModel.h index 85d97b7..68c3987 100644 --- a/yinmeng-ios/yinmeng-ios/Base/MVP/Model/MewUserInfoModel.h +++ b/yinmeng-ios/yinmeng-ios/Base/MVP/Model/UserModel/MewUserInfoModel.h @@ -8,8 +8,10 @@ #import "NSObject+MEWExtension.h" #import "MewEnum.h" -#import "MewUserVipInfoVo.h" +#import "MewUserVipInfoModel.h" #import "MewUserInfoPhotoModel.h" +#import "MewUserGiftWallModel.h" + NS_ASSUME_NONNULL_BEGIN typedef NS_ENUM(NSInteger, MewUserLevelType) { @@ -84,6 +86,10 @@ typedef NS_ENUM(NSInteger, MewUserLevelType) { @property (nonatomic, copy) NSString *nameplatePic; ///铭牌名称 @property (nonatomic, copy) NSString *nameplateWord; +///礼物墙中的礼物 +@property (nonatomic,strong) NSArray *userGiftWall; +///礼物墙中的幸运礼物礼物 +@property (nonatomic,strong) NSArray *userLuckyBagGiftWall; ///跟随的 本地添加的字段 //@property (nonatomic,copy) NSString *fromNick; @@ -92,7 +98,7 @@ typedef NS_ENUM(NSInteger, MewUserLevelType) { #pragma mark - 相亲房的字段 ///贵族信息 -@property (nonatomic, strong) MewUserVipInfoVo *MewUserVipInfoVo; +@property (nonatomic, strong) MewUserVipInfoModel *MewUserVipInfoVo; ///麦位昵称颜色 @property (nonatomic, copy) NSString *micNickColor; diff --git a/yinmeng-ios/yinmeng-ios/Base/MVP/Model/MewUserInfoModel.m b/yinmeng-ios/yinmeng-ios/Base/MVP/Model/UserModel/MewUserInfoModel.m similarity index 89% rename from yinmeng-ios/yinmeng-ios/Base/MVP/Model/MewUserInfoModel.m rename to yinmeng-ios/yinmeng-ios/Base/MVP/Model/UserModel/MewUserInfoModel.m index 21fa2fd..30f8f98 100644 --- a/yinmeng-ios/yinmeng-ios/Base/MVP/Model/MewUserInfoModel.m +++ b/yinmeng-ios/yinmeng-ios/Base/MVP/Model/UserModel/MewUserInfoModel.m @@ -24,9 +24,9 @@ + (NSDictionary *)mewObjectClassInArray { return @{ - @"privatePhoto": [MewUserInfoPhotoModel class] -// @"userGiftWall":UserGiftWallInfoModel.class, -// @"userLuckyBagGiftWall":UserGiftWallInfoModel.class, + @"privatePhoto": [MewUserInfoPhotoModel class], + @"userGiftWall":[MewUserGiftWallModel class], + @"userLuckyBagGiftWall":[MewUserGiftWallModel class] // @"dynamicInfo":MonentsInfoModel.class, // @"userGamePartner":UserGameInfoVo.class }; diff --git a/yinmeng-ios/yinmeng-ios/Base/MVP/Model/MewUserVipInfoVo.h b/yinmeng-ios/yinmeng-ios/Base/MVP/Model/UserModel/MewUserVipInfoModel.h similarity index 94% rename from yinmeng-ios/yinmeng-ios/Base/MVP/Model/MewUserVipInfoVo.h rename to yinmeng-ios/yinmeng-ios/Base/MVP/Model/UserModel/MewUserVipInfoModel.h index 7b319e2..1974ff4 100644 --- a/yinmeng-ios/yinmeng-ios/Base/MVP/Model/MewUserVipInfoVo.h +++ b/yinmeng-ios/yinmeng-ios/Base/MVP/Model/UserModel/MewUserVipInfoModel.h @@ -9,7 +9,7 @@ NS_ASSUME_NONNULL_BEGIN -@interface MewUserVipInfoVo : NSObject +@interface MewUserVipInfoModel : NSObject ///贵族图标 @property (nonatomic, copy) NSString *vipIcon; ///贵族等级 diff --git a/yinmeng-ios/yinmeng-ios/Base/MVP/Model/MewUserVipInfoVo.m b/yinmeng-ios/yinmeng-ios/Base/MVP/Model/UserModel/MewUserVipInfoModel.m similarity index 57% rename from yinmeng-ios/yinmeng-ios/Base/MVP/Model/MewUserVipInfoVo.m rename to yinmeng-ios/yinmeng-ios/Base/MVP/Model/UserModel/MewUserVipInfoModel.m index e34050e..36cc390 100644 --- a/yinmeng-ios/yinmeng-ios/Base/MVP/Model/MewUserVipInfoVo.m +++ b/yinmeng-ios/yinmeng-ios/Base/MVP/Model/UserModel/MewUserVipInfoModel.m @@ -5,8 +5,8 @@ // Created by duoban on 2023/12/6. // -#import "MewUserVipInfoVo.h" +#import "MewUserVipInfoModel.h" -@implementation MewUserVipInfoVo +@implementation MewUserVipInfoModel @end diff --git a/yinmeng-ios/yinmeng-ios/Base/Tool/MewAlertView/MewAlertPopup.h b/yinmeng-ios/yinmeng-ios/Base/Tool/MewAlertView/MewAlertPopup.h index d9dbda5..38093f0 100644 --- a/yinmeng-ios/yinmeng-ios/Base/Tool/MewAlertView/MewAlertPopup.h +++ b/yinmeng-ios/yinmeng-ios/Base/Tool/MewAlertView/MewAlertPopup.h @@ -11,9 +11,6 @@ NS_ASSUME_NONNULL_BEGIN - - - @interface MewAlertPopup : NSObject /// 配置 @property (nonatomic, strong, readonly) TTAlertConfig *alertConfig; @@ -21,7 +18,7 @@ NS_ASSUME_NONNULL_BEGIN /// 展示提示框 + (instancetype)Mew_AlertPopupWithTitle:(NSString *)title message:(NSString *)message confirm:(TTPopupCompletionHandler)confirm cancel:(TTPopupCompletionHandler)cancel; -+ (instancetype)Mew_AlertPopupWithAlertType:(MewAlertPopupType)type confirm:(TTPopupCompletionHandler)confirm cancel:(TTPopupCompletionHandler)cancel; ++ (instancetype)Mew_AlertPopupWithAlertType:(MewAlertPopupType)type confirm:(TTPopupCompletionHandler _Nullable)confirm cancel:( TTPopupCompletionHandler _Nullable)cancel; @end diff --git a/yinmeng-ios/yinmeng-ios/Base/Tool/MewAlertView/Model/MewAlertModel.h b/yinmeng-ios/yinmeng-ios/Base/Tool/MewAlertView/Model/MewAlertModel.h index 6bce657..9f02c26 100644 --- a/yinmeng-ios/yinmeng-ios/Base/Tool/MewAlertView/Model/MewAlertModel.h +++ b/yinmeng-ios/yinmeng-ios/Base/Tool/MewAlertView/Model/MewAlertModel.h @@ -11,7 +11,9 @@ NS_ASSUME_NONNULL_BEGIN typedef NS_ENUM(NSUInteger, MewAlertPopupType) { Mew_AlertPopupType_Remove_Session, //删除会话中的聊天 Mew_AlertPopupType_Clean_Unread, //清除聊天未读消息 - Mew_AlertPopupType_Cancel_Attension //取消关注用户 + Mew_AlertPopupType_Cancel_Attension, //取消关注用户 + Mew_AlertPopupType_Cancel_Article, //删除文章 + Mew_AlertPopupType_Report_Article //举报文章 }; diff --git a/yinmeng-ios/yinmeng-ios/Base/Tool/MewAlertView/Model/MewAlertModel.m b/yinmeng-ios/yinmeng-ios/Base/Tool/MewAlertView/Model/MewAlertModel.m index 4d096cb..1f8c354 100644 --- a/yinmeng-ios/yinmeng-ios/Base/Tool/MewAlertView/Model/MewAlertModel.m +++ b/yinmeng-ios/yinmeng-ios/Base/Tool/MewAlertView/Model/MewAlertModel.m @@ -37,6 +37,16 @@ self.title = @"提示"; self.message = @"确定取消关注该用户吗?"; break; + + case Mew_AlertPopupType_Cancel_Article: + self.title = @"删除"; + self.message = @""; + break; + + case Mew_AlertPopupType_Report_Article: + self.title = @"举报"; + self.message = @""; + break; default: break; } diff --git a/yinmeng-ios/yinmeng-ios/Base/UI/EmptyView/MewEmptyCollectionViewCell.m b/yinmeng-ios/yinmeng-ios/Base/UI/EmptyView/MewEmptyCollectionViewCell.m index d2424e8..4be65f8 100644 --- a/yinmeng-ios/yinmeng-ios/Base/UI/EmptyView/MewEmptyCollectionViewCell.m +++ b/yinmeng-ios/yinmeng-ios/Base/UI/EmptyView/MewEmptyCollectionViewCell.m @@ -25,7 +25,7 @@ - (instancetype)initWithFrame:(CGRect)frame { self = [super initWithFrame:frame]; if (self) { - [self setUILayout]; + [self setUI]; } return self; } diff --git a/yinmeng-ios/yinmeng-ios/Base/UI/InputView/Assets.xcassets/Color/Contents.json b/yinmeng-ios/yinmeng-ios/Base/UI/InputView/Assets.xcassets/Color/Contents.json new file mode 100644 index 0000000..73c0059 --- /dev/null +++ b/yinmeng-ios/yinmeng-ios/Base/UI/InputView/Assets.xcassets/Color/Contents.json @@ -0,0 +1,6 @@ +{ + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/yinmeng-ios/yinmeng-ios/Base/UI/InputView/Assets.xcassets/Color/q_black_gray.colorset/Contents.json b/yinmeng-ios/yinmeng-ios/Base/UI/InputView/Assets.xcassets/Color/q_black_gray.colorset/Contents.json new file mode 100644 index 0000000..5f2a39f --- /dev/null +++ b/yinmeng-ios/yinmeng-ios/Base/UI/InputView/Assets.xcassets/Color/q_black_gray.colorset/Contents.json @@ -0,0 +1,41 @@ +{ + "colors" : [ + { + "color" : { + "color-space" : "srgb", + "components" : { + "alpha" : "1.000", + "blue" : "0.000", + "green" : "0.000", + "red" : "0.000" + } + }, + "idiom" : "universal" + }, + { + "appearances" : [ + { + "appearance" : "luminosity", + "value" : "dark" + } + ], + "color" : { + "color-space" : "srgb", + "components" : { + "alpha" : "1.000", + "blue" : "0.769", + "green" : "0.769", + "red" : "0.769" + } + }, + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + }, + "properties" : { + "localizable" : true + } +} diff --git a/yinmeng-ios/yinmeng-ios/Base/UI/InputView/Assets.xcassets/Color/q_black_white.colorset/Contents.json b/yinmeng-ios/yinmeng-ios/Base/UI/InputView/Assets.xcassets/Color/q_black_white.colorset/Contents.json new file mode 100644 index 0000000..806d2e5 --- /dev/null +++ b/yinmeng-ios/yinmeng-ios/Base/UI/InputView/Assets.xcassets/Color/q_black_white.colorset/Contents.json @@ -0,0 +1,41 @@ +{ + "colors" : [ + { + "color" : { + "color-space" : "srgb", + "components" : { + "alpha" : "1.000", + "blue" : "0.000", + "green" : "0.000", + "red" : "0.000" + } + }, + "idiom" : "universal" + }, + { + "appearances" : [ + { + "appearance" : "luminosity", + "value" : "dark" + } + ], + "color" : { + "color-space" : "srgb", + "components" : { + "alpha" : "1.000", + "blue" : "0.958", + "green" : "0.958", + "red" : "0.958" + } + }, + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + }, + "properties" : { + "localizable" : true + } +} diff --git a/yinmeng-ios/yinmeng-ios/Base/UI/InputView/Assets.xcassets/Color/q_border223.colorset/Contents.json b/yinmeng-ios/yinmeng-ios/Base/UI/InputView/Assets.xcassets/Color/q_border223.colorset/Contents.json new file mode 100644 index 0000000..4c31a54 --- /dev/null +++ b/yinmeng-ios/yinmeng-ios/Base/UI/InputView/Assets.xcassets/Color/q_border223.colorset/Contents.json @@ -0,0 +1,38 @@ +{ + "colors" : [ + { + "color" : { + "color-space" : "srgb", + "components" : { + "alpha" : "1.000", + "blue" : "0.875", + "green" : "0.875", + "red" : "0.875" + } + }, + "idiom" : "universal" + }, + { + "appearances" : [ + { + "appearance" : "luminosity", + "value" : "dark" + } + ], + "color" : { + "color-space" : "srgb", + "components" : { + "alpha" : "1.000", + "blue" : "0.192", + "green" : "0.204", + "red" : "0.208" + } + }, + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/yinmeng-ios/yinmeng-ios/Base/UI/InputView/Assets.xcassets/Color/q_input.colorset/Contents.json b/yinmeng-ios/yinmeng-ios/Base/UI/InputView/Assets.xcassets/Color/q_input.colorset/Contents.json new file mode 100644 index 0000000..10cd1a0 --- /dev/null +++ b/yinmeng-ios/yinmeng-ios/Base/UI/InputView/Assets.xcassets/Color/q_input.colorset/Contents.json @@ -0,0 +1,38 @@ +{ + "colors" : [ + { + "color" : { + "color-space" : "srgb", + "components" : { + "alpha" : "1.000", + "blue" : "1.000", + "green" : "1.000", + "red" : "1.000" + } + }, + "idiom" : "universal" + }, + { + "appearances" : [ + { + "appearance" : "luminosity", + "value" : "dark" + } + ], + "color" : { + "color-space" : "srgb", + "components" : { + "alpha" : "1.000", + "blue" : "0.153", + "green" : "0.153", + "red" : "0.145" + } + }, + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/yinmeng-ios/yinmeng-ios/Base/UI/InputView/Assets.xcassets/Color/q_input_extend_bg.colorset/Contents.json b/yinmeng-ios/yinmeng-ios/Base/UI/InputView/Assets.xcassets/Color/q_input_extend_bg.colorset/Contents.json new file mode 100644 index 0000000..d258cbf --- /dev/null +++ b/yinmeng-ios/yinmeng-ios/Base/UI/InputView/Assets.xcassets/Color/q_input_extend_bg.colorset/Contents.json @@ -0,0 +1,38 @@ +{ + "colors" : [ + { + "color" : { + "color-space" : "srgb", + "components" : { + "alpha" : "1.000", + "blue" : "0.945", + "green" : "0.945", + "red" : "0.945" + } + }, + "idiom" : "universal" + }, + { + "appearances" : [ + { + "appearance" : "luminosity", + "value" : "dark" + } + ], + "color" : { + "color-space" : "srgb", + "components" : { + "alpha" : "1.000", + "blue" : "0.122", + "green" : "0.122", + "red" : "0.122" + } + }, + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/yinmeng-ios/yinmeng-ios/Base/UI/InputView/Assets.xcassets/Color/q_input_gray_bg.colorset/Contents.json b/yinmeng-ios/yinmeng-ios/Base/UI/InputView/Assets.xcassets/Color/q_input_gray_bg.colorset/Contents.json new file mode 100644 index 0000000..d1f514a --- /dev/null +++ b/yinmeng-ios/yinmeng-ios/Base/UI/InputView/Assets.xcassets/Color/q_input_gray_bg.colorset/Contents.json @@ -0,0 +1,38 @@ +{ + "colors" : [ + { + "color" : { + "color-space" : "srgb", + "components" : { + "alpha" : "1.000", + "blue" : "0.965", + "green" : "0.965", + "red" : "0.965" + } + }, + "idiom" : "universal" + }, + { + "appearances" : [ + { + "appearance" : "luminosity", + "value" : "dark" + } + ], + "color" : { + "color-space" : "srgb", + "components" : { + "alpha" : "1.000", + "blue" : "0.110", + "green" : "0.114", + "red" : "0.114" + } + }, + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/yinmeng-ios/yinmeng-ios/Base/UI/InputView/Assets.xcassets/Color/q_text_black_gray.colorset/Contents.json b/yinmeng-ios/yinmeng-ios/Base/UI/InputView/Assets.xcassets/Color/q_text_black_gray.colorset/Contents.json new file mode 100644 index 0000000..d283037 --- /dev/null +++ b/yinmeng-ios/yinmeng-ios/Base/UI/InputView/Assets.xcassets/Color/q_text_black_gray.colorset/Contents.json @@ -0,0 +1,41 @@ +{ + "colors" : [ + { + "color" : { + "color-space" : "srgb", + "components" : { + "alpha" : "1.000", + "blue" : "0.357", + "green" : "0.357", + "red" : "0.357" + } + }, + "idiom" : "universal" + }, + { + "appearances" : [ + { + "appearance" : "luminosity", + "value" : "dark" + } + ], + "color" : { + "color-space" : "srgb", + "components" : { + "alpha" : "1.000", + "blue" : "0.769", + "green" : "0.769", + "red" : "0.769" + } + }, + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + }, + "properties" : { + "localizable" : true + } +} diff --git a/yinmeng-ios/yinmeng-ios/Base/UI/InputView/Assets.xcassets/Contents.json b/yinmeng-ios/yinmeng-ios/Base/UI/InputView/Assets.xcassets/Contents.json new file mode 100644 index 0000000..73c0059 --- /dev/null +++ b/yinmeng-ios/yinmeng-ios/Base/UI/InputView/Assets.xcassets/Contents.json @@ -0,0 +1,6 @@ +{ + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/yinmeng-ios/yinmeng-ios/Base/UI/InputView/Assets.xcassets/input/Contents.json b/yinmeng-ios/yinmeng-ios/Base/UI/InputView/Assets.xcassets/input/Contents.json new file mode 100644 index 0000000..73c0059 --- /dev/null +++ b/yinmeng-ios/yinmeng-ios/Base/UI/InputView/Assets.xcassets/input/Contents.json @@ -0,0 +1,6 @@ +{ + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/yinmeng-ios/yinmeng-ios/Base/UI/InputView/Assets.xcassets/input/q_chat_emoji_black_normal.imageset/Contents.json b/yinmeng-ios/yinmeng-ios/Base/UI/InputView/Assets.xcassets/input/q_chat_emoji_black_normal.imageset/Contents.json new file mode 100644 index 0000000..2f5f501 --- /dev/null +++ b/yinmeng-ios/yinmeng-ios/Base/UI/InputView/Assets.xcassets/input/q_chat_emoji_black_normal.imageset/Contents.json @@ -0,0 +1,54 @@ +{ + "images" : [ + { + "idiom" : "universal", + "scale" : "1x" + }, + { + "appearances" : [ + { + "appearance" : "luminosity", + "value" : "dark" + } + ], + "idiom" : "universal", + "scale" : "1x" + }, + { + "filename" : "chat_icon_emoji_black_l_normal@2x.png", + "idiom" : "universal", + "scale" : "2x" + }, + { + "appearances" : [ + { + "appearance" : "luminosity", + "value" : "dark" + } + ], + "filename" : "chat_icon_emoji_black_l_normal@2x-1.png", + "idiom" : "universal", + "scale" : "2x" + }, + { + "filename" : "chat_icon_emoji_black_l_normal@3x.png", + "idiom" : "universal", + "scale" : "3x" + }, + { + "appearances" : [ + { + "appearance" : "luminosity", + "value" : "dark" + } + ], + "filename" : "chat_icon_emoji_black_l_normal@3x-1.png", + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/yinmeng-ios/yinmeng-ios/Base/UI/InputView/Assets.xcassets/input/q_chat_emoji_black_normal.imageset/chat_icon_emoji_black_l_normal@2x-1.png b/yinmeng-ios/yinmeng-ios/Base/UI/InputView/Assets.xcassets/input/q_chat_emoji_black_normal.imageset/chat_icon_emoji_black_l_normal@2x-1.png new file mode 100644 index 0000000..4f9226c Binary files /dev/null and b/yinmeng-ios/yinmeng-ios/Base/UI/InputView/Assets.xcassets/input/q_chat_emoji_black_normal.imageset/chat_icon_emoji_black_l_normal@2x-1.png differ diff --git a/yinmeng-ios/yinmeng-ios/Base/UI/InputView/Assets.xcassets/input/q_chat_emoji_black_normal.imageset/chat_icon_emoji_black_l_normal@2x.png b/yinmeng-ios/yinmeng-ios/Base/UI/InputView/Assets.xcassets/input/q_chat_emoji_black_normal.imageset/chat_icon_emoji_black_l_normal@2x.png new file mode 100644 index 0000000..f744bdd Binary files /dev/null and b/yinmeng-ios/yinmeng-ios/Base/UI/InputView/Assets.xcassets/input/q_chat_emoji_black_normal.imageset/chat_icon_emoji_black_l_normal@2x.png differ diff --git a/yinmeng-ios/yinmeng-ios/Base/UI/InputView/Assets.xcassets/input/q_chat_emoji_black_normal.imageset/chat_icon_emoji_black_l_normal@3x-1.png b/yinmeng-ios/yinmeng-ios/Base/UI/InputView/Assets.xcassets/input/q_chat_emoji_black_normal.imageset/chat_icon_emoji_black_l_normal@3x-1.png new file mode 100644 index 0000000..567a1f4 Binary files /dev/null and b/yinmeng-ios/yinmeng-ios/Base/UI/InputView/Assets.xcassets/input/q_chat_emoji_black_normal.imageset/chat_icon_emoji_black_l_normal@3x-1.png differ diff --git a/yinmeng-ios/yinmeng-ios/Base/UI/InputView/Assets.xcassets/input/q_chat_emoji_black_normal.imageset/chat_icon_emoji_black_l_normal@3x.png b/yinmeng-ios/yinmeng-ios/Base/UI/InputView/Assets.xcassets/input/q_chat_emoji_black_normal.imageset/chat_icon_emoji_black_l_normal@3x.png new file mode 100644 index 0000000..06011f8 Binary files /dev/null and b/yinmeng-ios/yinmeng-ios/Base/UI/InputView/Assets.xcassets/input/q_chat_emoji_black_normal.imageset/chat_icon_emoji_black_l_normal@3x.png differ diff --git a/yinmeng-ios/yinmeng-ios/Base/UI/InputView/Assets.xcassets/input/q_chat_extend_black_normal.imageset/Contents.json b/yinmeng-ios/yinmeng-ios/Base/UI/InputView/Assets.xcassets/input/q_chat_extend_black_normal.imageset/Contents.json new file mode 100644 index 0000000..640000e --- /dev/null +++ b/yinmeng-ios/yinmeng-ios/Base/UI/InputView/Assets.xcassets/input/q_chat_extend_black_normal.imageset/Contents.json @@ -0,0 +1,54 @@ +{ + "images" : [ + { + "idiom" : "universal", + "scale" : "1x" + }, + { + "appearances" : [ + { + "appearance" : "luminosity", + "value" : "dark" + } + ], + "idiom" : "universal", + "scale" : "1x" + }, + { + "filename" : "chat_icon_more_black_l_normal@2x.png", + "idiom" : "universal", + "scale" : "2x" + }, + { + "appearances" : [ + { + "appearance" : "luminosity", + "value" : "dark" + } + ], + "filename" : "chat_icon_more_black_l_normal@2x-1.png", + "idiom" : "universal", + "scale" : "2x" + }, + { + "filename" : "chat_icon_more_black_l_normal@3x.png", + "idiom" : "universal", + "scale" : "3x" + }, + { + "appearances" : [ + { + "appearance" : "luminosity", + "value" : "dark" + } + ], + "filename" : "chat_icon_more_black_l_normal@3x-1.png", + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/yinmeng-ios/yinmeng-ios/Base/UI/InputView/Assets.xcassets/input/q_chat_extend_black_normal.imageset/chat_icon_more_black_l_normal@2x-1.png b/yinmeng-ios/yinmeng-ios/Base/UI/InputView/Assets.xcassets/input/q_chat_extend_black_normal.imageset/chat_icon_more_black_l_normal@2x-1.png new file mode 100644 index 0000000..c624a0d Binary files /dev/null and b/yinmeng-ios/yinmeng-ios/Base/UI/InputView/Assets.xcassets/input/q_chat_extend_black_normal.imageset/chat_icon_more_black_l_normal@2x-1.png differ diff --git a/yinmeng-ios/yinmeng-ios/Base/UI/InputView/Assets.xcassets/input/q_chat_extend_black_normal.imageset/chat_icon_more_black_l_normal@2x.png b/yinmeng-ios/yinmeng-ios/Base/UI/InputView/Assets.xcassets/input/q_chat_extend_black_normal.imageset/chat_icon_more_black_l_normal@2x.png new file mode 100644 index 0000000..4c7083e Binary files /dev/null and b/yinmeng-ios/yinmeng-ios/Base/UI/InputView/Assets.xcassets/input/q_chat_extend_black_normal.imageset/chat_icon_more_black_l_normal@2x.png differ diff --git a/yinmeng-ios/yinmeng-ios/Base/UI/InputView/Assets.xcassets/input/q_chat_extend_black_normal.imageset/chat_icon_more_black_l_normal@3x-1.png b/yinmeng-ios/yinmeng-ios/Base/UI/InputView/Assets.xcassets/input/q_chat_extend_black_normal.imageset/chat_icon_more_black_l_normal@3x-1.png new file mode 100644 index 0000000..d569818 Binary files /dev/null and b/yinmeng-ios/yinmeng-ios/Base/UI/InputView/Assets.xcassets/input/q_chat_extend_black_normal.imageset/chat_icon_more_black_l_normal@3x-1.png differ diff --git a/yinmeng-ios/yinmeng-ios/Base/UI/InputView/Assets.xcassets/input/q_chat_extend_black_normal.imageset/chat_icon_more_black_l_normal@3x.png b/yinmeng-ios/yinmeng-ios/Base/UI/InputView/Assets.xcassets/input/q_chat_extend_black_normal.imageset/chat_icon_more_black_l_normal@3x.png new file mode 100644 index 0000000..5b7fce2 Binary files /dev/null and b/yinmeng-ios/yinmeng-ios/Base/UI/InputView/Assets.xcassets/input/q_chat_extend_black_normal.imageset/chat_icon_more_black_l_normal@3x.png differ diff --git a/yinmeng-ios/yinmeng-ios/Base/UI/InputView/Assets.xcassets/input/q_chat_keyboard_black_normal.imageset/Contents.json b/yinmeng-ios/yinmeng-ios/Base/UI/InputView/Assets.xcassets/input/q_chat_keyboard_black_normal.imageset/Contents.json new file mode 100644 index 0000000..4ef04d9 --- /dev/null +++ b/yinmeng-ios/yinmeng-ios/Base/UI/InputView/Assets.xcassets/input/q_chat_keyboard_black_normal.imageset/Contents.json @@ -0,0 +1,54 @@ +{ + "images" : [ + { + "idiom" : "universal", + "scale" : "1x" + }, + { + "appearances" : [ + { + "appearance" : "luminosity", + "value" : "dark" + } + ], + "idiom" : "universal", + "scale" : "1x" + }, + { + "filename" : "chat_icon_keyboard_black_l_normal@2x.png", + "idiom" : "universal", + "scale" : "2x" + }, + { + "appearances" : [ + { + "appearance" : "luminosity", + "value" : "dark" + } + ], + "filename" : "chat_icon_keyboard_black_l_normal@2x-1.png", + "idiom" : "universal", + "scale" : "2x" + }, + { + "filename" : "chat_icon_keyboard_black_l_normal@3x.png", + "idiom" : "universal", + "scale" : "3x" + }, + { + "appearances" : [ + { + "appearance" : "luminosity", + "value" : "dark" + } + ], + "filename" : "chat_icon_keyboard_black_l_normal@3x-1.png", + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/yinmeng-ios/yinmeng-ios/Base/UI/InputView/Assets.xcassets/input/q_chat_keyboard_black_normal.imageset/chat_icon_keyboard_black_l_normal@2x-1.png b/yinmeng-ios/yinmeng-ios/Base/UI/InputView/Assets.xcassets/input/q_chat_keyboard_black_normal.imageset/chat_icon_keyboard_black_l_normal@2x-1.png new file mode 100644 index 0000000..e5a01fd Binary files /dev/null and b/yinmeng-ios/yinmeng-ios/Base/UI/InputView/Assets.xcassets/input/q_chat_keyboard_black_normal.imageset/chat_icon_keyboard_black_l_normal@2x-1.png differ diff --git a/yinmeng-ios/yinmeng-ios/Base/UI/InputView/Assets.xcassets/input/q_chat_keyboard_black_normal.imageset/chat_icon_keyboard_black_l_normal@2x.png b/yinmeng-ios/yinmeng-ios/Base/UI/InputView/Assets.xcassets/input/q_chat_keyboard_black_normal.imageset/chat_icon_keyboard_black_l_normal@2x.png new file mode 100644 index 0000000..4629082 Binary files /dev/null and b/yinmeng-ios/yinmeng-ios/Base/UI/InputView/Assets.xcassets/input/q_chat_keyboard_black_normal.imageset/chat_icon_keyboard_black_l_normal@2x.png differ diff --git a/yinmeng-ios/yinmeng-ios/Base/UI/InputView/Assets.xcassets/input/q_chat_keyboard_black_normal.imageset/chat_icon_keyboard_black_l_normal@3x-1.png b/yinmeng-ios/yinmeng-ios/Base/UI/InputView/Assets.xcassets/input/q_chat_keyboard_black_normal.imageset/chat_icon_keyboard_black_l_normal@3x-1.png new file mode 100644 index 0000000..18b2cfc Binary files /dev/null and b/yinmeng-ios/yinmeng-ios/Base/UI/InputView/Assets.xcassets/input/q_chat_keyboard_black_normal.imageset/chat_icon_keyboard_black_l_normal@3x-1.png differ diff --git a/yinmeng-ios/yinmeng-ios/Base/UI/InputView/Assets.xcassets/input/q_chat_keyboard_black_normal.imageset/chat_icon_keyboard_black_l_normal@3x.png b/yinmeng-ios/yinmeng-ios/Base/UI/InputView/Assets.xcassets/input/q_chat_keyboard_black_normal.imageset/chat_icon_keyboard_black_l_normal@3x.png new file mode 100644 index 0000000..1488338 Binary files /dev/null and b/yinmeng-ios/yinmeng-ios/Base/UI/InputView/Assets.xcassets/input/q_chat_keyboard_black_normal.imageset/chat_icon_keyboard_black_l_normal@3x.png differ diff --git a/yinmeng-ios/yinmeng-ios/Base/UI/InputView/Assets.xcassets/input/q_chat_voice_black_normal.imageset/Contents.json b/yinmeng-ios/yinmeng-ios/Base/UI/InputView/Assets.xcassets/input/q_chat_voice_black_normal.imageset/Contents.json new file mode 100644 index 0000000..0611033 --- /dev/null +++ b/yinmeng-ios/yinmeng-ios/Base/UI/InputView/Assets.xcassets/input/q_chat_voice_black_normal.imageset/Contents.json @@ -0,0 +1,54 @@ +{ + "images" : [ + { + "idiom" : "universal", + "scale" : "1x" + }, + { + "appearances" : [ + { + "appearance" : "luminosity", + "value" : "dark" + } + ], + "idiom" : "universal", + "scale" : "1x" + }, + { + "filename" : "chat_icon_voice@2x.png", + "idiom" : "universal", + "scale" : "2x" + }, + { + "appearances" : [ + { + "appearance" : "luminosity", + "value" : "dark" + } + ], + "filename" : "chat_icon_voice_dark@2x.png", + "idiom" : "universal", + "scale" : "2x" + }, + { + "filename" : "chat_icon_voice@3x.png", + "idiom" : "universal", + "scale" : "3x" + }, + { + "appearances" : [ + { + "appearance" : "luminosity", + "value" : "dark" + } + ], + "filename" : "chat_icon_voice_dark@3x.png", + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/yinmeng-ios/yinmeng-ios/Base/UI/InputView/Assets.xcassets/input/q_chat_voice_black_normal.imageset/chat_icon_voice@2x.png b/yinmeng-ios/yinmeng-ios/Base/UI/InputView/Assets.xcassets/input/q_chat_voice_black_normal.imageset/chat_icon_voice@2x.png new file mode 100644 index 0000000..ef1c8ec Binary files /dev/null and b/yinmeng-ios/yinmeng-ios/Base/UI/InputView/Assets.xcassets/input/q_chat_voice_black_normal.imageset/chat_icon_voice@2x.png differ diff --git a/yinmeng-ios/yinmeng-ios/Base/UI/InputView/Assets.xcassets/input/q_chat_voice_black_normal.imageset/chat_icon_voice@3x.png b/yinmeng-ios/yinmeng-ios/Base/UI/InputView/Assets.xcassets/input/q_chat_voice_black_normal.imageset/chat_icon_voice@3x.png new file mode 100644 index 0000000..3380ec3 Binary files /dev/null and b/yinmeng-ios/yinmeng-ios/Base/UI/InputView/Assets.xcassets/input/q_chat_voice_black_normal.imageset/chat_icon_voice@3x.png differ diff --git a/yinmeng-ios/yinmeng-ios/Base/UI/InputView/Assets.xcassets/input/q_chat_voice_black_normal.imageset/chat_icon_voice_dark@2x.png b/yinmeng-ios/yinmeng-ios/Base/UI/InputView/Assets.xcassets/input/q_chat_voice_black_normal.imageset/chat_icon_voice_dark@2x.png new file mode 100644 index 0000000..cb36968 Binary files /dev/null and b/yinmeng-ios/yinmeng-ios/Base/UI/InputView/Assets.xcassets/input/q_chat_voice_black_normal.imageset/chat_icon_voice_dark@2x.png differ diff --git a/yinmeng-ios/yinmeng-ios/Base/UI/InputView/Assets.xcassets/input/q_chat_voice_black_normal.imageset/chat_icon_voice_dark@3x.png b/yinmeng-ios/yinmeng-ios/Base/UI/InputView/Assets.xcassets/input/q_chat_voice_black_normal.imageset/chat_icon_voice_dark@3x.png new file mode 100644 index 0000000..211df54 Binary files /dev/null and b/yinmeng-ios/yinmeng-ios/Base/UI/InputView/Assets.xcassets/input/q_chat_voice_black_normal.imageset/chat_icon_voice_dark@3x.png differ diff --git a/yinmeng-ios/yinmeng-ios/Base/UI/InputView/Assets.xcassets/input/q_emotion_delete.imageset/Contents.json b/yinmeng-ios/yinmeng-ios/Base/UI/InputView/Assets.xcassets/input/q_emotion_delete.imageset/Contents.json new file mode 100644 index 0000000..260c5ef --- /dev/null +++ b/yinmeng-ios/yinmeng-ios/Base/UI/InputView/Assets.xcassets/input/q_emotion_delete.imageset/Contents.json @@ -0,0 +1,22 @@ +{ + "images" : [ + { + "idiom" : "universal", + "scale" : "1x" + }, + { + "filename" : "compose_emotion_delete_highlighted.png", + "idiom" : "universal", + "scale" : "2x" + }, + { + "filename" : "compose_emotion_delete_highlighted-1.png", + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/yinmeng-ios/yinmeng-ios/Base/UI/InputView/Assets.xcassets/input/q_emotion_delete.imageset/compose_emotion_delete_highlighted-1.png b/yinmeng-ios/yinmeng-ios/Base/UI/InputView/Assets.xcassets/input/q_emotion_delete.imageset/compose_emotion_delete_highlighted-1.png new file mode 100644 index 0000000..6053549 Binary files /dev/null and b/yinmeng-ios/yinmeng-ios/Base/UI/InputView/Assets.xcassets/input/q_emotion_delete.imageset/compose_emotion_delete_highlighted-1.png differ diff --git a/yinmeng-ios/yinmeng-ios/Base/UI/InputView/Assets.xcassets/input/q_emotion_delete.imageset/compose_emotion_delete_highlighted.png b/yinmeng-ios/yinmeng-ios/Base/UI/InputView/Assets.xcassets/input/q_emotion_delete.imageset/compose_emotion_delete_highlighted.png new file mode 100644 index 0000000..8acf5f1 Binary files /dev/null and b/yinmeng-ios/yinmeng-ios/Base/UI/InputView/Assets.xcassets/input/q_emotion_delete.imageset/compose_emotion_delete_highlighted.png differ diff --git a/yinmeng-ios/yinmeng-ios/Base/UI/InputView/Assets.xcassets/q_white_btn.imageset/Contents.json b/yinmeng-ios/yinmeng-ios/Base/UI/InputView/Assets.xcassets/q_white_btn.imageset/Contents.json new file mode 100644 index 0000000..5c56699 --- /dev/null +++ b/yinmeng-ios/yinmeng-ios/Base/UI/InputView/Assets.xcassets/q_white_btn.imageset/Contents.json @@ -0,0 +1,52 @@ +{ + "images" : [ + { + "idiom" : "universal", + "scale" : "1x" + }, + { + "appearances" : [ + { + "appearance" : "luminosity", + "value" : "dark" + } + ], + "idiom" : "universal", + "scale" : "1x" + }, + { + "filename" : "white_rect.png", + "idiom" : "universal", + "scale" : "2x" + }, + { + "appearances" : [ + { + "appearance" : "luminosity", + "value" : "dark" + } + ], + "filename" : "white_btn_dark.png", + "idiom" : "universal", + "scale" : "2x" + }, + { + "idiom" : "universal", + "scale" : "3x" + }, + { + "appearances" : [ + { + "appearance" : "luminosity", + "value" : "dark" + } + ], + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/yinmeng-ios/yinmeng-ios/Base/UI/InputView/Assets.xcassets/q_white_btn.imageset/white_btn_dark.png b/yinmeng-ios/yinmeng-ios/Base/UI/InputView/Assets.xcassets/q_white_btn.imageset/white_btn_dark.png new file mode 100644 index 0000000..9b9ef6e Binary files /dev/null and b/yinmeng-ios/yinmeng-ios/Base/UI/InputView/Assets.xcassets/q_white_btn.imageset/white_btn_dark.png differ diff --git a/yinmeng-ios/yinmeng-ios/Base/UI/InputView/Assets.xcassets/q_white_btn.imageset/white_rect.png b/yinmeng-ios/yinmeng-ios/Base/UI/InputView/Assets.xcassets/q_white_btn.imageset/white_rect.png new file mode 100644 index 0000000..804a26d Binary files /dev/null and b/yinmeng-ios/yinmeng-ios/Base/UI/InputView/Assets.xcassets/q_white_btn.imageset/white_rect.png differ diff --git a/yinmeng-ios/yinmeng-ios/Base/UI/InputView/Assets.xcassets/q_white_input_btn.imageset/Contents.json b/yinmeng-ios/yinmeng-ios/Base/UI/InputView/Assets.xcassets/q_white_input_btn.imageset/Contents.json new file mode 100644 index 0000000..f0cab49 --- /dev/null +++ b/yinmeng-ios/yinmeng-ios/Base/UI/InputView/Assets.xcassets/q_white_input_btn.imageset/Contents.json @@ -0,0 +1,52 @@ +{ + "images" : [ + { + "idiom" : "universal", + "scale" : "1x" + }, + { + "appearances" : [ + { + "appearance" : "luminosity", + "value" : "dark" + } + ], + "idiom" : "universal", + "scale" : "1x" + }, + { + "filename" : "white_rect.png", + "idiom" : "universal", + "scale" : "2x" + }, + { + "appearances" : [ + { + "appearance" : "luminosity", + "value" : "dark" + } + ], + "filename" : "white_input_btn_dark.png", + "idiom" : "universal", + "scale" : "2x" + }, + { + "idiom" : "universal", + "scale" : "3x" + }, + { + "appearances" : [ + { + "appearance" : "luminosity", + "value" : "dark" + } + ], + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/yinmeng-ios/yinmeng-ios/Base/UI/InputView/Assets.xcassets/q_white_input_btn.imageset/white_input_btn_dark.png b/yinmeng-ios/yinmeng-ios/Base/UI/InputView/Assets.xcassets/q_white_input_btn.imageset/white_input_btn_dark.png new file mode 100644 index 0000000..b86b1ac Binary files /dev/null and b/yinmeng-ios/yinmeng-ios/Base/UI/InputView/Assets.xcassets/q_white_input_btn.imageset/white_input_btn_dark.png differ diff --git a/yinmeng-ios/yinmeng-ios/Base/UI/InputView/Assets.xcassets/q_white_input_btn.imageset/white_rect.png b/yinmeng-ios/yinmeng-ios/Base/UI/InputView/Assets.xcassets/q_white_input_btn.imageset/white_rect.png new file mode 100644 index 0000000..804a26d Binary files /dev/null and b/yinmeng-ios/yinmeng-ios/Base/UI/InputView/Assets.xcassets/q_white_input_btn.imageset/white_rect.png differ diff --git a/yinmeng-ios/yinmeng-ios/Base/UI/InputView/Assets.xcassets/q_white_input_press_btn.imageset/Contents.json b/yinmeng-ios/yinmeng-ios/Base/UI/InputView/Assets.xcassets/q_white_input_press_btn.imageset/Contents.json new file mode 100644 index 0000000..16a190f --- /dev/null +++ b/yinmeng-ios/yinmeng-ios/Base/UI/InputView/Assets.xcassets/q_white_input_press_btn.imageset/Contents.json @@ -0,0 +1,52 @@ +{ + "images" : [ + { + "idiom" : "universal", + "scale" : "1x" + }, + { + "appearances" : [ + { + "appearance" : "luminosity", + "value" : "dark" + } + ], + "idiom" : "universal", + "scale" : "1x" + }, + { + "filename" : "white_input_press_btn.png", + "idiom" : "universal", + "scale" : "2x" + }, + { + "appearances" : [ + { + "appearance" : "luminosity", + "value" : "dark" + } + ], + "filename" : "white_input_press_btn_dark.png", + "idiom" : "universal", + "scale" : "2x" + }, + { + "idiom" : "universal", + "scale" : "3x" + }, + { + "appearances" : [ + { + "appearance" : "luminosity", + "value" : "dark" + } + ], + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/yinmeng-ios/yinmeng-ios/Base/UI/InputView/Assets.xcassets/q_white_input_press_btn.imageset/white_input_press_btn.png b/yinmeng-ios/yinmeng-ios/Base/UI/InputView/Assets.xcassets/q_white_input_press_btn.imageset/white_input_press_btn.png new file mode 100644 index 0000000..485bccd Binary files /dev/null and b/yinmeng-ios/yinmeng-ios/Base/UI/InputView/Assets.xcassets/q_white_input_press_btn.imageset/white_input_press_btn.png differ diff --git a/yinmeng-ios/yinmeng-ios/Base/UI/InputView/Assets.xcassets/q_white_input_press_btn.imageset/white_input_press_btn_dark.png b/yinmeng-ios/yinmeng-ios/Base/UI/InputView/Assets.xcassets/q_white_input_press_btn.imageset/white_input_press_btn_dark.png new file mode 100644 index 0000000..07a2dd9 Binary files /dev/null and b/yinmeng-ios/yinmeng-ios/Base/UI/InputView/Assets.xcassets/q_white_input_press_btn.imageset/white_input_press_btn_dark.png differ diff --git a/yinmeng-ios/yinmeng-ios/Base/UI/InputView/Emoji/emoj_s_normal@2x.png b/yinmeng-ios/yinmeng-ios/Base/UI/InputView/Emoji/emoj_s_normal@2x.png new file mode 100755 index 0000000..122bda2 Binary files /dev/null and b/yinmeng-ios/yinmeng-ios/Base/UI/InputView/Emoji/emoj_s_normal@2x.png differ diff --git a/yinmeng-ios/yinmeng-ios/Base/UI/InputView/Emoji/emoj_s_pressed@2x.png b/yinmeng-ios/yinmeng-ios/Base/UI/InputView/Emoji/emoj_s_pressed@2x.png new file mode 100755 index 0000000..c4ce400 Binary files /dev/null and b/yinmeng-ios/yinmeng-ios/Base/UI/InputView/Emoji/emoj_s_pressed@2x.png differ diff --git a/yinmeng-ios/yinmeng-ios/Base/UI/InputView/Emoji/emoji.xml b/yinmeng-ios/yinmeng-ios/Base/UI/InputView/Emoji/emoji.xml new file mode 100755 index 0000000..55b87da --- /dev/null +++ b/yinmeng-ios/yinmeng-ios/Base/UI/InputView/Emoji/emoji.xml @@ -0,0 +1,130 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/yinmeng-ios/yinmeng-ios/Base/UI/InputView/Emoji/emoji_00@2x.png b/yinmeng-ios/yinmeng-ios/Base/UI/InputView/Emoji/emoji_00@2x.png new file mode 100755 index 0000000..9db8367 Binary files /dev/null and b/yinmeng-ios/yinmeng-ios/Base/UI/InputView/Emoji/emoji_00@2x.png differ diff --git a/yinmeng-ios/yinmeng-ios/Base/UI/InputView/Emoji/emoji_01@2x.png b/yinmeng-ios/yinmeng-ios/Base/UI/InputView/Emoji/emoji_01@2x.png new file mode 100755 index 0000000..ee31fdc Binary files /dev/null and b/yinmeng-ios/yinmeng-ios/Base/UI/InputView/Emoji/emoji_01@2x.png differ diff --git a/yinmeng-ios/yinmeng-ios/Base/UI/InputView/Emoji/emoji_02@2x.png b/yinmeng-ios/yinmeng-ios/Base/UI/InputView/Emoji/emoji_02@2x.png new file mode 100755 index 0000000..13c6f9a Binary files /dev/null and b/yinmeng-ios/yinmeng-ios/Base/UI/InputView/Emoji/emoji_02@2x.png differ diff --git a/yinmeng-ios/yinmeng-ios/Base/UI/InputView/Emoji/emoji_03@2x.png b/yinmeng-ios/yinmeng-ios/Base/UI/InputView/Emoji/emoji_03@2x.png new file mode 100755 index 0000000..153f1a0 Binary files /dev/null and b/yinmeng-ios/yinmeng-ios/Base/UI/InputView/Emoji/emoji_03@2x.png differ diff --git a/yinmeng-ios/yinmeng-ios/Base/UI/InputView/Emoji/emoji_04@2x.png b/yinmeng-ios/yinmeng-ios/Base/UI/InputView/Emoji/emoji_04@2x.png new file mode 100755 index 0000000..7af71af Binary files /dev/null and b/yinmeng-ios/yinmeng-ios/Base/UI/InputView/Emoji/emoji_04@2x.png differ diff --git a/yinmeng-ios/yinmeng-ios/Base/UI/InputView/Emoji/emoji_05@2x.png b/yinmeng-ios/yinmeng-ios/Base/UI/InputView/Emoji/emoji_05@2x.png new file mode 100755 index 0000000..92e8845 Binary files /dev/null and b/yinmeng-ios/yinmeng-ios/Base/UI/InputView/Emoji/emoji_05@2x.png differ diff --git a/yinmeng-ios/yinmeng-ios/Base/UI/InputView/Emoji/emoji_06@2x.png b/yinmeng-ios/yinmeng-ios/Base/UI/InputView/Emoji/emoji_06@2x.png new file mode 100755 index 0000000..07a645d Binary files /dev/null and b/yinmeng-ios/yinmeng-ios/Base/UI/InputView/Emoji/emoji_06@2x.png differ diff --git a/yinmeng-ios/yinmeng-ios/Base/UI/InputView/Emoji/emoji_07@2x.png b/yinmeng-ios/yinmeng-ios/Base/UI/InputView/Emoji/emoji_07@2x.png new file mode 100755 index 0000000..4399a22 Binary files /dev/null and b/yinmeng-ios/yinmeng-ios/Base/UI/InputView/Emoji/emoji_07@2x.png differ diff --git a/yinmeng-ios/yinmeng-ios/Base/UI/InputView/Emoji/emoji_08@2x.png b/yinmeng-ios/yinmeng-ios/Base/UI/InputView/Emoji/emoji_08@2x.png new file mode 100755 index 0000000..ced9560 Binary files /dev/null and b/yinmeng-ios/yinmeng-ios/Base/UI/InputView/Emoji/emoji_08@2x.png differ diff --git a/yinmeng-ios/yinmeng-ios/Base/UI/InputView/Emoji/emoji_09@2x.png b/yinmeng-ios/yinmeng-ios/Base/UI/InputView/Emoji/emoji_09@2x.png new file mode 100755 index 0000000..56d2378 Binary files /dev/null and b/yinmeng-ios/yinmeng-ios/Base/UI/InputView/Emoji/emoji_09@2x.png differ diff --git a/yinmeng-ios/yinmeng-ios/Base/UI/InputView/Emoji/emoji_100@2x.png b/yinmeng-ios/yinmeng-ios/Base/UI/InputView/Emoji/emoji_100@2x.png new file mode 100755 index 0000000..f5d4ca9 Binary files /dev/null and b/yinmeng-ios/yinmeng-ios/Base/UI/InputView/Emoji/emoji_100@2x.png differ diff --git a/yinmeng-ios/yinmeng-ios/Base/UI/InputView/Emoji/emoji_101@2x.png b/yinmeng-ios/yinmeng-ios/Base/UI/InputView/Emoji/emoji_101@2x.png new file mode 100755 index 0000000..5915d88 Binary files /dev/null and b/yinmeng-ios/yinmeng-ios/Base/UI/InputView/Emoji/emoji_101@2x.png differ diff --git a/yinmeng-ios/yinmeng-ios/Base/UI/InputView/Emoji/emoji_102@2x.png b/yinmeng-ios/yinmeng-ios/Base/UI/InputView/Emoji/emoji_102@2x.png new file mode 100755 index 0000000..ea86e01 Binary files /dev/null and b/yinmeng-ios/yinmeng-ios/Base/UI/InputView/Emoji/emoji_102@2x.png differ diff --git a/yinmeng-ios/yinmeng-ios/Base/UI/InputView/Emoji/emoji_103@2x.png b/yinmeng-ios/yinmeng-ios/Base/UI/InputView/Emoji/emoji_103@2x.png new file mode 100755 index 0000000..53ac705 Binary files /dev/null and b/yinmeng-ios/yinmeng-ios/Base/UI/InputView/Emoji/emoji_103@2x.png differ diff --git a/yinmeng-ios/yinmeng-ios/Base/UI/InputView/Emoji/emoji_104@2x.png b/yinmeng-ios/yinmeng-ios/Base/UI/InputView/Emoji/emoji_104@2x.png new file mode 100755 index 0000000..38fd7d8 Binary files /dev/null and b/yinmeng-ios/yinmeng-ios/Base/UI/InputView/Emoji/emoji_104@2x.png differ diff --git a/yinmeng-ios/yinmeng-ios/Base/UI/InputView/Emoji/emoji_105@2x.png b/yinmeng-ios/yinmeng-ios/Base/UI/InputView/Emoji/emoji_105@2x.png new file mode 100755 index 0000000..25507f6 Binary files /dev/null and b/yinmeng-ios/yinmeng-ios/Base/UI/InputView/Emoji/emoji_105@2x.png differ diff --git a/yinmeng-ios/yinmeng-ios/Base/UI/InputView/Emoji/emoji_106@2x.png b/yinmeng-ios/yinmeng-ios/Base/UI/InputView/Emoji/emoji_106@2x.png new file mode 100755 index 0000000..8e9ab3d Binary files /dev/null and b/yinmeng-ios/yinmeng-ios/Base/UI/InputView/Emoji/emoji_106@2x.png differ diff --git a/yinmeng-ios/yinmeng-ios/Base/UI/InputView/Emoji/emoji_107@2x.png b/yinmeng-ios/yinmeng-ios/Base/UI/InputView/Emoji/emoji_107@2x.png new file mode 100755 index 0000000..f7b78d0 Binary files /dev/null and b/yinmeng-ios/yinmeng-ios/Base/UI/InputView/Emoji/emoji_107@2x.png differ diff --git a/yinmeng-ios/yinmeng-ios/Base/UI/InputView/Emoji/emoji_108@2x.png b/yinmeng-ios/yinmeng-ios/Base/UI/InputView/Emoji/emoji_108@2x.png new file mode 100755 index 0000000..74d26df Binary files /dev/null and b/yinmeng-ios/yinmeng-ios/Base/UI/InputView/Emoji/emoji_108@2x.png differ diff --git a/yinmeng-ios/yinmeng-ios/Base/UI/InputView/Emoji/emoji_109@2x.png b/yinmeng-ios/yinmeng-ios/Base/UI/InputView/Emoji/emoji_109@2x.png new file mode 100755 index 0000000..3a86316 Binary files /dev/null and b/yinmeng-ios/yinmeng-ios/Base/UI/InputView/Emoji/emoji_109@2x.png differ diff --git a/yinmeng-ios/yinmeng-ios/Base/UI/InputView/Emoji/emoji_10@2x.png b/yinmeng-ios/yinmeng-ios/Base/UI/InputView/Emoji/emoji_10@2x.png new file mode 100755 index 0000000..a7726c1 Binary files /dev/null and b/yinmeng-ios/yinmeng-ios/Base/UI/InputView/Emoji/emoji_10@2x.png differ diff --git a/yinmeng-ios/yinmeng-ios/Base/UI/InputView/Emoji/emoji_110@2x.png b/yinmeng-ios/yinmeng-ios/Base/UI/InputView/Emoji/emoji_110@2x.png new file mode 100755 index 0000000..0b08499 Binary files /dev/null and b/yinmeng-ios/yinmeng-ios/Base/UI/InputView/Emoji/emoji_110@2x.png differ diff --git a/yinmeng-ios/yinmeng-ios/Base/UI/InputView/Emoji/emoji_111@2x.png b/yinmeng-ios/yinmeng-ios/Base/UI/InputView/Emoji/emoji_111@2x.png new file mode 100755 index 0000000..b02f25f Binary files /dev/null and b/yinmeng-ios/yinmeng-ios/Base/UI/InputView/Emoji/emoji_111@2x.png differ diff --git a/yinmeng-ios/yinmeng-ios/Base/UI/InputView/Emoji/emoji_112@2x.png b/yinmeng-ios/yinmeng-ios/Base/UI/InputView/Emoji/emoji_112@2x.png new file mode 100755 index 0000000..c1c85bb Binary files /dev/null and b/yinmeng-ios/yinmeng-ios/Base/UI/InputView/Emoji/emoji_112@2x.png differ diff --git a/yinmeng-ios/yinmeng-ios/Base/UI/InputView/Emoji/emoji_113@2x.png b/yinmeng-ios/yinmeng-ios/Base/UI/InputView/Emoji/emoji_113@2x.png new file mode 100755 index 0000000..a197441 Binary files /dev/null and b/yinmeng-ios/yinmeng-ios/Base/UI/InputView/Emoji/emoji_113@2x.png differ diff --git a/yinmeng-ios/yinmeng-ios/Base/UI/InputView/Emoji/emoji_114@2x.png b/yinmeng-ios/yinmeng-ios/Base/UI/InputView/Emoji/emoji_114@2x.png new file mode 100755 index 0000000..0f95264 Binary files /dev/null and b/yinmeng-ios/yinmeng-ios/Base/UI/InputView/Emoji/emoji_114@2x.png differ diff --git a/yinmeng-ios/yinmeng-ios/Base/UI/InputView/Emoji/emoji_115@2x.png b/yinmeng-ios/yinmeng-ios/Base/UI/InputView/Emoji/emoji_115@2x.png new file mode 100755 index 0000000..13bd411 Binary files /dev/null and b/yinmeng-ios/yinmeng-ios/Base/UI/InputView/Emoji/emoji_115@2x.png differ diff --git a/yinmeng-ios/yinmeng-ios/Base/UI/InputView/Emoji/emoji_116@2x.png b/yinmeng-ios/yinmeng-ios/Base/UI/InputView/Emoji/emoji_116@2x.png new file mode 100755 index 0000000..ee31fdc Binary files /dev/null and b/yinmeng-ios/yinmeng-ios/Base/UI/InputView/Emoji/emoji_116@2x.png differ diff --git a/yinmeng-ios/yinmeng-ios/Base/UI/InputView/Emoji/emoji_117@2x.png b/yinmeng-ios/yinmeng-ios/Base/UI/InputView/Emoji/emoji_117@2x.png new file mode 100755 index 0000000..c37892e Binary files /dev/null and b/yinmeng-ios/yinmeng-ios/Base/UI/InputView/Emoji/emoji_117@2x.png differ diff --git a/yinmeng-ios/yinmeng-ios/Base/UI/InputView/Emoji/emoji_118@2x.png b/yinmeng-ios/yinmeng-ios/Base/UI/InputView/Emoji/emoji_118@2x.png new file mode 100755 index 0000000..19fe459 Binary files /dev/null and b/yinmeng-ios/yinmeng-ios/Base/UI/InputView/Emoji/emoji_118@2x.png differ diff --git a/yinmeng-ios/yinmeng-ios/Base/UI/InputView/Emoji/emoji_119@2x.png b/yinmeng-ios/yinmeng-ios/Base/UI/InputView/Emoji/emoji_119@2x.png new file mode 100755 index 0000000..d169aec Binary files /dev/null and b/yinmeng-ios/yinmeng-ios/Base/UI/InputView/Emoji/emoji_119@2x.png differ diff --git a/yinmeng-ios/yinmeng-ios/Base/UI/InputView/Emoji/emoji_11@2x.png b/yinmeng-ios/yinmeng-ios/Base/UI/InputView/Emoji/emoji_11@2x.png new file mode 100755 index 0000000..4d31165 Binary files /dev/null and b/yinmeng-ios/yinmeng-ios/Base/UI/InputView/Emoji/emoji_11@2x.png differ diff --git a/yinmeng-ios/yinmeng-ios/Base/UI/InputView/Emoji/emoji_120@2x.png b/yinmeng-ios/yinmeng-ios/Base/UI/InputView/Emoji/emoji_120@2x.png new file mode 100755 index 0000000..73b0f85 Binary files /dev/null and b/yinmeng-ios/yinmeng-ios/Base/UI/InputView/Emoji/emoji_120@2x.png differ diff --git a/yinmeng-ios/yinmeng-ios/Base/UI/InputView/Emoji/emoji_121@2x.png b/yinmeng-ios/yinmeng-ios/Base/UI/InputView/Emoji/emoji_121@2x.png new file mode 100755 index 0000000..b558b09 Binary files /dev/null and b/yinmeng-ios/yinmeng-ios/Base/UI/InputView/Emoji/emoji_121@2x.png differ diff --git a/yinmeng-ios/yinmeng-ios/Base/UI/InputView/Emoji/emoji_122@2x.png b/yinmeng-ios/yinmeng-ios/Base/UI/InputView/Emoji/emoji_122@2x.png new file mode 100755 index 0000000..d395e8d Binary files /dev/null and b/yinmeng-ios/yinmeng-ios/Base/UI/InputView/Emoji/emoji_122@2x.png differ diff --git a/yinmeng-ios/yinmeng-ios/Base/UI/InputView/Emoji/emoji_123@2x.png b/yinmeng-ios/yinmeng-ios/Base/UI/InputView/Emoji/emoji_123@2x.png new file mode 100755 index 0000000..911ab18 Binary files /dev/null and b/yinmeng-ios/yinmeng-ios/Base/UI/InputView/Emoji/emoji_123@2x.png differ diff --git a/yinmeng-ios/yinmeng-ios/Base/UI/InputView/Emoji/emoji_124@2x.png b/yinmeng-ios/yinmeng-ios/Base/UI/InputView/Emoji/emoji_124@2x.png new file mode 100755 index 0000000..e7db679 Binary files /dev/null and b/yinmeng-ios/yinmeng-ios/Base/UI/InputView/Emoji/emoji_124@2x.png differ diff --git a/yinmeng-ios/yinmeng-ios/Base/UI/InputView/Emoji/emoji_125@2x.png b/yinmeng-ios/yinmeng-ios/Base/UI/InputView/Emoji/emoji_125@2x.png new file mode 100755 index 0000000..adcf5b5 Binary files /dev/null and b/yinmeng-ios/yinmeng-ios/Base/UI/InputView/Emoji/emoji_125@2x.png differ diff --git a/yinmeng-ios/yinmeng-ios/Base/UI/InputView/Emoji/emoji_126@2x.png b/yinmeng-ios/yinmeng-ios/Base/UI/InputView/Emoji/emoji_126@2x.png new file mode 100755 index 0000000..0f1938e Binary files /dev/null and b/yinmeng-ios/yinmeng-ios/Base/UI/InputView/Emoji/emoji_126@2x.png differ diff --git a/yinmeng-ios/yinmeng-ios/Base/UI/InputView/Emoji/emoji_127@2x.png b/yinmeng-ios/yinmeng-ios/Base/UI/InputView/Emoji/emoji_127@2x.png new file mode 100755 index 0000000..0b30f90 Binary files /dev/null and b/yinmeng-ios/yinmeng-ios/Base/UI/InputView/Emoji/emoji_127@2x.png differ diff --git a/yinmeng-ios/yinmeng-ios/Base/UI/InputView/Emoji/emoji_128@2x.png b/yinmeng-ios/yinmeng-ios/Base/UI/InputView/Emoji/emoji_128@2x.png new file mode 100755 index 0000000..e2fa25e Binary files /dev/null and b/yinmeng-ios/yinmeng-ios/Base/UI/InputView/Emoji/emoji_128@2x.png differ diff --git a/yinmeng-ios/yinmeng-ios/Base/UI/InputView/Emoji/emoji_129@2x.png b/yinmeng-ios/yinmeng-ios/Base/UI/InputView/Emoji/emoji_129@2x.png new file mode 100755 index 0000000..e996713 Binary files /dev/null and b/yinmeng-ios/yinmeng-ios/Base/UI/InputView/Emoji/emoji_129@2x.png differ diff --git a/yinmeng-ios/yinmeng-ios/Base/UI/InputView/Emoji/emoji_12@2x.png b/yinmeng-ios/yinmeng-ios/Base/UI/InputView/Emoji/emoji_12@2x.png new file mode 100755 index 0000000..83b37d7 Binary files /dev/null and b/yinmeng-ios/yinmeng-ios/Base/UI/InputView/Emoji/emoji_12@2x.png differ diff --git a/yinmeng-ios/yinmeng-ios/Base/UI/InputView/Emoji/emoji_130@2x.png b/yinmeng-ios/yinmeng-ios/Base/UI/InputView/Emoji/emoji_130@2x.png new file mode 100755 index 0000000..02d4008 Binary files /dev/null and b/yinmeng-ios/yinmeng-ios/Base/UI/InputView/Emoji/emoji_130@2x.png differ diff --git a/yinmeng-ios/yinmeng-ios/Base/UI/InputView/Emoji/emoji_131@2x.png b/yinmeng-ios/yinmeng-ios/Base/UI/InputView/Emoji/emoji_131@2x.png new file mode 100755 index 0000000..c9b1c05 Binary files /dev/null and b/yinmeng-ios/yinmeng-ios/Base/UI/InputView/Emoji/emoji_131@2x.png differ diff --git a/yinmeng-ios/yinmeng-ios/Base/UI/InputView/Emoji/emoji_132@2x.png b/yinmeng-ios/yinmeng-ios/Base/UI/InputView/Emoji/emoji_132@2x.png new file mode 100755 index 0000000..5a65550 Binary files /dev/null and b/yinmeng-ios/yinmeng-ios/Base/UI/InputView/Emoji/emoji_132@2x.png differ diff --git a/yinmeng-ios/yinmeng-ios/Base/UI/InputView/Emoji/emoji_133@2x.png b/yinmeng-ios/yinmeng-ios/Base/UI/InputView/Emoji/emoji_133@2x.png new file mode 100755 index 0000000..def66bf Binary files /dev/null and b/yinmeng-ios/yinmeng-ios/Base/UI/InputView/Emoji/emoji_133@2x.png differ diff --git a/yinmeng-ios/yinmeng-ios/Base/UI/InputView/Emoji/emoji_134@2x.png b/yinmeng-ios/yinmeng-ios/Base/UI/InputView/Emoji/emoji_134@2x.png new file mode 100755 index 0000000..ed366cd Binary files /dev/null and b/yinmeng-ios/yinmeng-ios/Base/UI/InputView/Emoji/emoji_134@2x.png differ diff --git a/yinmeng-ios/yinmeng-ios/Base/UI/InputView/Emoji/emoji_135@2x.png b/yinmeng-ios/yinmeng-ios/Base/UI/InputView/Emoji/emoji_135@2x.png new file mode 100755 index 0000000..77d2054 Binary files /dev/null and b/yinmeng-ios/yinmeng-ios/Base/UI/InputView/Emoji/emoji_135@2x.png differ diff --git a/yinmeng-ios/yinmeng-ios/Base/UI/InputView/Emoji/emoji_136@2x.png b/yinmeng-ios/yinmeng-ios/Base/UI/InputView/Emoji/emoji_136@2x.png new file mode 100755 index 0000000..639cb3a Binary files /dev/null and b/yinmeng-ios/yinmeng-ios/Base/UI/InputView/Emoji/emoji_136@2x.png differ diff --git a/yinmeng-ios/yinmeng-ios/Base/UI/InputView/Emoji/emoji_137@2x.png b/yinmeng-ios/yinmeng-ios/Base/UI/InputView/Emoji/emoji_137@2x.png new file mode 100755 index 0000000..5ebe555 Binary files /dev/null and b/yinmeng-ios/yinmeng-ios/Base/UI/InputView/Emoji/emoji_137@2x.png differ diff --git a/yinmeng-ios/yinmeng-ios/Base/UI/InputView/Emoji/emoji_138@2x.png b/yinmeng-ios/yinmeng-ios/Base/UI/InputView/Emoji/emoji_138@2x.png new file mode 100755 index 0000000..417f8ab Binary files /dev/null and b/yinmeng-ios/yinmeng-ios/Base/UI/InputView/Emoji/emoji_138@2x.png differ diff --git a/yinmeng-ios/yinmeng-ios/Base/UI/InputView/Emoji/emoji_139@2x.png b/yinmeng-ios/yinmeng-ios/Base/UI/InputView/Emoji/emoji_139@2x.png new file mode 100755 index 0000000..1fd6655 Binary files /dev/null and b/yinmeng-ios/yinmeng-ios/Base/UI/InputView/Emoji/emoji_139@2x.png differ diff --git a/yinmeng-ios/yinmeng-ios/Base/UI/InputView/Emoji/emoji_13@2x.png b/yinmeng-ios/yinmeng-ios/Base/UI/InputView/Emoji/emoji_13@2x.png new file mode 100755 index 0000000..53be82b Binary files /dev/null and b/yinmeng-ios/yinmeng-ios/Base/UI/InputView/Emoji/emoji_13@2x.png differ diff --git a/yinmeng-ios/yinmeng-ios/Base/UI/InputView/Emoji/emoji_140@2x.png b/yinmeng-ios/yinmeng-ios/Base/UI/InputView/Emoji/emoji_140@2x.png new file mode 100755 index 0000000..e479745 Binary files /dev/null and b/yinmeng-ios/yinmeng-ios/Base/UI/InputView/Emoji/emoji_140@2x.png differ diff --git a/yinmeng-ios/yinmeng-ios/Base/UI/InputView/Emoji/emoji_141@2x.png b/yinmeng-ios/yinmeng-ios/Base/UI/InputView/Emoji/emoji_141@2x.png new file mode 100755 index 0000000..0627ec9 Binary files /dev/null and b/yinmeng-ios/yinmeng-ios/Base/UI/InputView/Emoji/emoji_141@2x.png differ diff --git a/yinmeng-ios/yinmeng-ios/Base/UI/InputView/Emoji/emoji_142@2x.png b/yinmeng-ios/yinmeng-ios/Base/UI/InputView/Emoji/emoji_142@2x.png new file mode 100755 index 0000000..06e9170 Binary files /dev/null and b/yinmeng-ios/yinmeng-ios/Base/UI/InputView/Emoji/emoji_142@2x.png differ diff --git a/yinmeng-ios/yinmeng-ios/Base/UI/InputView/Emoji/emoji_143@2x.png b/yinmeng-ios/yinmeng-ios/Base/UI/InputView/Emoji/emoji_143@2x.png new file mode 100755 index 0000000..0bdae77 Binary files /dev/null and b/yinmeng-ios/yinmeng-ios/Base/UI/InputView/Emoji/emoji_143@2x.png differ diff --git a/yinmeng-ios/yinmeng-ios/Base/UI/InputView/Emoji/emoji_144@2x.png b/yinmeng-ios/yinmeng-ios/Base/UI/InputView/Emoji/emoji_144@2x.png new file mode 100755 index 0000000..9d176d1 Binary files /dev/null and b/yinmeng-ios/yinmeng-ios/Base/UI/InputView/Emoji/emoji_144@2x.png differ diff --git a/yinmeng-ios/yinmeng-ios/Base/UI/InputView/Emoji/emoji_145@2x.png b/yinmeng-ios/yinmeng-ios/Base/UI/InputView/Emoji/emoji_145@2x.png new file mode 100755 index 0000000..8613276 Binary files /dev/null and b/yinmeng-ios/yinmeng-ios/Base/UI/InputView/Emoji/emoji_145@2x.png differ diff --git a/yinmeng-ios/yinmeng-ios/Base/UI/InputView/Emoji/emoji_146@2x.png b/yinmeng-ios/yinmeng-ios/Base/UI/InputView/Emoji/emoji_146@2x.png new file mode 100755 index 0000000..701bf5f Binary files /dev/null and b/yinmeng-ios/yinmeng-ios/Base/UI/InputView/Emoji/emoji_146@2x.png differ diff --git a/yinmeng-ios/yinmeng-ios/Base/UI/InputView/Emoji/emoji_147@2x.png b/yinmeng-ios/yinmeng-ios/Base/UI/InputView/Emoji/emoji_147@2x.png new file mode 100755 index 0000000..7c4b435 Binary files /dev/null and b/yinmeng-ios/yinmeng-ios/Base/UI/InputView/Emoji/emoji_147@2x.png differ diff --git a/yinmeng-ios/yinmeng-ios/Base/UI/InputView/Emoji/emoji_148@2x.png b/yinmeng-ios/yinmeng-ios/Base/UI/InputView/Emoji/emoji_148@2x.png new file mode 100755 index 0000000..ed2edb2 Binary files /dev/null and b/yinmeng-ios/yinmeng-ios/Base/UI/InputView/Emoji/emoji_148@2x.png differ diff --git a/yinmeng-ios/yinmeng-ios/Base/UI/InputView/Emoji/emoji_149@2x.png b/yinmeng-ios/yinmeng-ios/Base/UI/InputView/Emoji/emoji_149@2x.png new file mode 100755 index 0000000..8b9a67c Binary files /dev/null and b/yinmeng-ios/yinmeng-ios/Base/UI/InputView/Emoji/emoji_149@2x.png differ diff --git a/yinmeng-ios/yinmeng-ios/Base/UI/InputView/Emoji/emoji_14@2x.png b/yinmeng-ios/yinmeng-ios/Base/UI/InputView/Emoji/emoji_14@2x.png new file mode 100755 index 0000000..688a6e4 Binary files /dev/null and b/yinmeng-ios/yinmeng-ios/Base/UI/InputView/Emoji/emoji_14@2x.png differ diff --git a/yinmeng-ios/yinmeng-ios/Base/UI/InputView/Emoji/emoji_150@2x.png b/yinmeng-ios/yinmeng-ios/Base/UI/InputView/Emoji/emoji_150@2x.png new file mode 100755 index 0000000..81ac9a8 Binary files /dev/null and b/yinmeng-ios/yinmeng-ios/Base/UI/InputView/Emoji/emoji_150@2x.png differ diff --git a/yinmeng-ios/yinmeng-ios/Base/UI/InputView/Emoji/emoji_151@2x.png b/yinmeng-ios/yinmeng-ios/Base/UI/InputView/Emoji/emoji_151@2x.png new file mode 100755 index 0000000..30c3a84 Binary files /dev/null and b/yinmeng-ios/yinmeng-ios/Base/UI/InputView/Emoji/emoji_151@2x.png differ diff --git a/yinmeng-ios/yinmeng-ios/Base/UI/InputView/Emoji/emoji_152@2x.png b/yinmeng-ios/yinmeng-ios/Base/UI/InputView/Emoji/emoji_152@2x.png new file mode 100755 index 0000000..65193c4 Binary files /dev/null and b/yinmeng-ios/yinmeng-ios/Base/UI/InputView/Emoji/emoji_152@2x.png differ diff --git a/yinmeng-ios/yinmeng-ios/Base/UI/InputView/Emoji/emoji_15@2x.png b/yinmeng-ios/yinmeng-ios/Base/UI/InputView/Emoji/emoji_15@2x.png new file mode 100755 index 0000000..46c2948 Binary files /dev/null and b/yinmeng-ios/yinmeng-ios/Base/UI/InputView/Emoji/emoji_15@2x.png differ diff --git a/yinmeng-ios/yinmeng-ios/Base/UI/InputView/Emoji/emoji_160@2x.png b/yinmeng-ios/yinmeng-ios/Base/UI/InputView/Emoji/emoji_160@2x.png new file mode 100755 index 0000000..82ce23e Binary files /dev/null and b/yinmeng-ios/yinmeng-ios/Base/UI/InputView/Emoji/emoji_160@2x.png differ diff --git a/yinmeng-ios/yinmeng-ios/Base/UI/InputView/Emoji/emoji_161@2x.png b/yinmeng-ios/yinmeng-ios/Base/UI/InputView/Emoji/emoji_161@2x.png new file mode 100755 index 0000000..981fb71 Binary files /dev/null and b/yinmeng-ios/yinmeng-ios/Base/UI/InputView/Emoji/emoji_161@2x.png differ diff --git a/yinmeng-ios/yinmeng-ios/Base/UI/InputView/Emoji/emoji_162@2x.png b/yinmeng-ios/yinmeng-ios/Base/UI/InputView/Emoji/emoji_162@2x.png new file mode 100755 index 0000000..08d638f Binary files /dev/null and b/yinmeng-ios/yinmeng-ios/Base/UI/InputView/Emoji/emoji_162@2x.png differ diff --git a/yinmeng-ios/yinmeng-ios/Base/UI/InputView/Emoji/emoji_163@2x.png b/yinmeng-ios/yinmeng-ios/Base/UI/InputView/Emoji/emoji_163@2x.png new file mode 100755 index 0000000..a493dc3 Binary files /dev/null and b/yinmeng-ios/yinmeng-ios/Base/UI/InputView/Emoji/emoji_163@2x.png differ diff --git a/yinmeng-ios/yinmeng-ios/Base/UI/InputView/Emoji/emoji_164@2x.png b/yinmeng-ios/yinmeng-ios/Base/UI/InputView/Emoji/emoji_164@2x.png new file mode 100755 index 0000000..d61502d Binary files /dev/null and b/yinmeng-ios/yinmeng-ios/Base/UI/InputView/Emoji/emoji_164@2x.png differ diff --git a/yinmeng-ios/yinmeng-ios/Base/UI/InputView/Emoji/emoji_165@2x.png b/yinmeng-ios/yinmeng-ios/Base/UI/InputView/Emoji/emoji_165@2x.png new file mode 100755 index 0000000..2642192 Binary files /dev/null and b/yinmeng-ios/yinmeng-ios/Base/UI/InputView/Emoji/emoji_165@2x.png differ diff --git a/yinmeng-ios/yinmeng-ios/Base/UI/InputView/Emoji/emoji_166@2x.png b/yinmeng-ios/yinmeng-ios/Base/UI/InputView/Emoji/emoji_166@2x.png new file mode 100755 index 0000000..e87ca8b Binary files /dev/null and b/yinmeng-ios/yinmeng-ios/Base/UI/InputView/Emoji/emoji_166@2x.png differ diff --git a/yinmeng-ios/yinmeng-ios/Base/UI/InputView/Emoji/emoji_16@2x.png b/yinmeng-ios/yinmeng-ios/Base/UI/InputView/Emoji/emoji_16@2x.png new file mode 100755 index 0000000..0da25e2 Binary files /dev/null and b/yinmeng-ios/yinmeng-ios/Base/UI/InputView/Emoji/emoji_16@2x.png differ diff --git a/yinmeng-ios/yinmeng-ios/Base/UI/InputView/Emoji/emoji_17@2x.png b/yinmeng-ios/yinmeng-ios/Base/UI/InputView/Emoji/emoji_17@2x.png new file mode 100755 index 0000000..dd0af7e Binary files /dev/null and b/yinmeng-ios/yinmeng-ios/Base/UI/InputView/Emoji/emoji_17@2x.png differ diff --git a/yinmeng-ios/yinmeng-ios/Base/UI/InputView/Emoji/emoji_18@2x.png b/yinmeng-ios/yinmeng-ios/Base/UI/InputView/Emoji/emoji_18@2x.png new file mode 100755 index 0000000..feab8a1 Binary files /dev/null and b/yinmeng-ios/yinmeng-ios/Base/UI/InputView/Emoji/emoji_18@2x.png differ diff --git a/yinmeng-ios/yinmeng-ios/Base/UI/InputView/Emoji/emoji_19@2x.png b/yinmeng-ios/yinmeng-ios/Base/UI/InputView/Emoji/emoji_19@2x.png new file mode 100755 index 0000000..6f979ee Binary files /dev/null and b/yinmeng-ios/yinmeng-ios/Base/UI/InputView/Emoji/emoji_19@2x.png differ diff --git a/yinmeng-ios/yinmeng-ios/Base/UI/InputView/Emoji/emoji_200@2x.png b/yinmeng-ios/yinmeng-ios/Base/UI/InputView/Emoji/emoji_200@2x.png new file mode 100755 index 0000000..8b9f3bb Binary files /dev/null and b/yinmeng-ios/yinmeng-ios/Base/UI/InputView/Emoji/emoji_200@2x.png differ diff --git a/yinmeng-ios/yinmeng-ios/Base/UI/InputView/Emoji/emoji_20@2x.png b/yinmeng-ios/yinmeng-ios/Base/UI/InputView/Emoji/emoji_20@2x.png new file mode 100755 index 0000000..30bf0a7 Binary files /dev/null and b/yinmeng-ios/yinmeng-ios/Base/UI/InputView/Emoji/emoji_20@2x.png differ diff --git a/yinmeng-ios/yinmeng-ios/Base/UI/InputView/Emoji/emoji_21@2x.png b/yinmeng-ios/yinmeng-ios/Base/UI/InputView/Emoji/emoji_21@2x.png new file mode 100755 index 0000000..70324ca Binary files /dev/null and b/yinmeng-ios/yinmeng-ios/Base/UI/InputView/Emoji/emoji_21@2x.png differ diff --git a/yinmeng-ios/yinmeng-ios/Base/UI/InputView/Emoji/emoji_22@2x.png b/yinmeng-ios/yinmeng-ios/Base/UI/InputView/Emoji/emoji_22@2x.png new file mode 100755 index 0000000..f7d8584 Binary files /dev/null and b/yinmeng-ios/yinmeng-ios/Base/UI/InputView/Emoji/emoji_22@2x.png differ diff --git a/yinmeng-ios/yinmeng-ios/Base/UI/InputView/Emoji/emoji_23@2x.png b/yinmeng-ios/yinmeng-ios/Base/UI/InputView/Emoji/emoji_23@2x.png new file mode 100755 index 0000000..48f30fa Binary files /dev/null and b/yinmeng-ios/yinmeng-ios/Base/UI/InputView/Emoji/emoji_23@2x.png differ diff --git a/yinmeng-ios/yinmeng-ios/Base/UI/InputView/Emoji/emoji_24@2x.png b/yinmeng-ios/yinmeng-ios/Base/UI/InputView/Emoji/emoji_24@2x.png new file mode 100755 index 0000000..6b8edaa Binary files /dev/null and b/yinmeng-ios/yinmeng-ios/Base/UI/InputView/Emoji/emoji_24@2x.png differ diff --git a/yinmeng-ios/yinmeng-ios/Base/UI/InputView/Emoji/emoji_25@2x.png b/yinmeng-ios/yinmeng-ios/Base/UI/InputView/Emoji/emoji_25@2x.png new file mode 100755 index 0000000..7888637 Binary files /dev/null and b/yinmeng-ios/yinmeng-ios/Base/UI/InputView/Emoji/emoji_25@2x.png differ diff --git a/yinmeng-ios/yinmeng-ios/Base/UI/InputView/Emoji/emoji_26@2x.png b/yinmeng-ios/yinmeng-ios/Base/UI/InputView/Emoji/emoji_26@2x.png new file mode 100755 index 0000000..1bd1ee4 Binary files /dev/null and b/yinmeng-ios/yinmeng-ios/Base/UI/InputView/Emoji/emoji_26@2x.png differ diff --git a/yinmeng-ios/yinmeng-ios/Base/UI/InputView/Emoji/emoji_27@2x.png b/yinmeng-ios/yinmeng-ios/Base/UI/InputView/Emoji/emoji_27@2x.png new file mode 100755 index 0000000..bee713c Binary files /dev/null and b/yinmeng-ios/yinmeng-ios/Base/UI/InputView/Emoji/emoji_27@2x.png differ diff --git a/yinmeng-ios/yinmeng-ios/Base/UI/InputView/Emoji/emoji_28@2x.png b/yinmeng-ios/yinmeng-ios/Base/UI/InputView/Emoji/emoji_28@2x.png new file mode 100755 index 0000000..0226d98 Binary files /dev/null and b/yinmeng-ios/yinmeng-ios/Base/UI/InputView/Emoji/emoji_28@2x.png differ diff --git a/yinmeng-ios/yinmeng-ios/Base/UI/InputView/Emoji/emoji_29@2x.png b/yinmeng-ios/yinmeng-ios/Base/UI/InputView/Emoji/emoji_29@2x.png new file mode 100755 index 0000000..07f35a7 Binary files /dev/null and b/yinmeng-ios/yinmeng-ios/Base/UI/InputView/Emoji/emoji_29@2x.png differ diff --git a/yinmeng-ios/yinmeng-ios/Base/UI/InputView/Emoji/emoji_30@2x.png b/yinmeng-ios/yinmeng-ios/Base/UI/InputView/Emoji/emoji_30@2x.png new file mode 100755 index 0000000..7126b75 Binary files /dev/null and b/yinmeng-ios/yinmeng-ios/Base/UI/InputView/Emoji/emoji_30@2x.png differ diff --git a/yinmeng-ios/yinmeng-ios/Base/UI/InputView/Emoji/emoji_31@2x.png b/yinmeng-ios/yinmeng-ios/Base/UI/InputView/Emoji/emoji_31@2x.png new file mode 100755 index 0000000..dec4c4b Binary files /dev/null and b/yinmeng-ios/yinmeng-ios/Base/UI/InputView/Emoji/emoji_31@2x.png differ diff --git a/yinmeng-ios/yinmeng-ios/Base/UI/InputView/Emoji/emoji_32@2x.png b/yinmeng-ios/yinmeng-ios/Base/UI/InputView/Emoji/emoji_32@2x.png new file mode 100755 index 0000000..c39d85f Binary files /dev/null and b/yinmeng-ios/yinmeng-ios/Base/UI/InputView/Emoji/emoji_32@2x.png differ diff --git a/yinmeng-ios/yinmeng-ios/Base/UI/InputView/Emoji/emoji_33@2x.png b/yinmeng-ios/yinmeng-ios/Base/UI/InputView/Emoji/emoji_33@2x.png new file mode 100755 index 0000000..2ab18b1 Binary files /dev/null and b/yinmeng-ios/yinmeng-ios/Base/UI/InputView/Emoji/emoji_33@2x.png differ diff --git a/yinmeng-ios/yinmeng-ios/Base/UI/InputView/Emoji/emoji_34@2x.png b/yinmeng-ios/yinmeng-ios/Base/UI/InputView/Emoji/emoji_34@2x.png new file mode 100755 index 0000000..d57edc6 Binary files /dev/null and b/yinmeng-ios/yinmeng-ios/Base/UI/InputView/Emoji/emoji_34@2x.png differ diff --git a/yinmeng-ios/yinmeng-ios/Base/UI/InputView/Emoji/emoji_35@2x.png b/yinmeng-ios/yinmeng-ios/Base/UI/InputView/Emoji/emoji_35@2x.png new file mode 100755 index 0000000..e3a4fb2 Binary files /dev/null and b/yinmeng-ios/yinmeng-ios/Base/UI/InputView/Emoji/emoji_35@2x.png differ diff --git a/yinmeng-ios/yinmeng-ios/Base/UI/InputView/Emoji/emoji_36@2x.png b/yinmeng-ios/yinmeng-ios/Base/UI/InputView/Emoji/emoji_36@2x.png new file mode 100755 index 0000000..c7b74cc Binary files /dev/null and b/yinmeng-ios/yinmeng-ios/Base/UI/InputView/Emoji/emoji_36@2x.png differ diff --git a/yinmeng-ios/yinmeng-ios/Base/UI/InputView/Emoji/emoji_37@2x.png b/yinmeng-ios/yinmeng-ios/Base/UI/InputView/Emoji/emoji_37@2x.png new file mode 100755 index 0000000..8a02a03 Binary files /dev/null and b/yinmeng-ios/yinmeng-ios/Base/UI/InputView/Emoji/emoji_37@2x.png differ diff --git a/yinmeng-ios/yinmeng-ios/Base/UI/InputView/Emoji/emoji_38@2x.png b/yinmeng-ios/yinmeng-ios/Base/UI/InputView/Emoji/emoji_38@2x.png new file mode 100755 index 0000000..361333b Binary files /dev/null and b/yinmeng-ios/yinmeng-ios/Base/UI/InputView/Emoji/emoji_38@2x.png differ diff --git a/yinmeng-ios/yinmeng-ios/Base/UI/InputView/Emoji/emoji_39@2x.png b/yinmeng-ios/yinmeng-ios/Base/UI/InputView/Emoji/emoji_39@2x.png new file mode 100755 index 0000000..56d9485 Binary files /dev/null and b/yinmeng-ios/yinmeng-ios/Base/UI/InputView/Emoji/emoji_39@2x.png differ diff --git a/yinmeng-ios/yinmeng-ios/Base/UI/InputView/Emoji/emoji_40@2x.png b/yinmeng-ios/yinmeng-ios/Base/UI/InputView/Emoji/emoji_40@2x.png new file mode 100755 index 0000000..b0c7e4a Binary files /dev/null and b/yinmeng-ios/yinmeng-ios/Base/UI/InputView/Emoji/emoji_40@2x.png differ diff --git a/yinmeng-ios/yinmeng-ios/Base/UI/InputView/Emoji/emoji_41@2x.png b/yinmeng-ios/yinmeng-ios/Base/UI/InputView/Emoji/emoji_41@2x.png new file mode 100755 index 0000000..5389ecd Binary files /dev/null and b/yinmeng-ios/yinmeng-ios/Base/UI/InputView/Emoji/emoji_41@2x.png differ diff --git a/yinmeng-ios/yinmeng-ios/Base/UI/InputView/Emoji/emoji_42@2x.png b/yinmeng-ios/yinmeng-ios/Base/UI/InputView/Emoji/emoji_42@2x.png new file mode 100755 index 0000000..5bb78b8 Binary files /dev/null and b/yinmeng-ios/yinmeng-ios/Base/UI/InputView/Emoji/emoji_42@2x.png differ diff --git a/yinmeng-ios/yinmeng-ios/Base/UI/InputView/Emoji/emoji_43@2x.png b/yinmeng-ios/yinmeng-ios/Base/UI/InputView/Emoji/emoji_43@2x.png new file mode 100755 index 0000000..136d7fd Binary files /dev/null and b/yinmeng-ios/yinmeng-ios/Base/UI/InputView/Emoji/emoji_43@2x.png differ diff --git a/yinmeng-ios/yinmeng-ios/Base/UI/InputView/Emoji/emoji_44@2x.png b/yinmeng-ios/yinmeng-ios/Base/UI/InputView/Emoji/emoji_44@2x.png new file mode 100755 index 0000000..4addc10 Binary files /dev/null and b/yinmeng-ios/yinmeng-ios/Base/UI/InputView/Emoji/emoji_44@2x.png differ diff --git a/yinmeng-ios/yinmeng-ios/Base/UI/InputView/Emoji/emoji_45@2x.png b/yinmeng-ios/yinmeng-ios/Base/UI/InputView/Emoji/emoji_45@2x.png new file mode 100755 index 0000000..55aeaf2 Binary files /dev/null and b/yinmeng-ios/yinmeng-ios/Base/UI/InputView/Emoji/emoji_45@2x.png differ diff --git a/yinmeng-ios/yinmeng-ios/Base/UI/InputView/Emoji/emoji_46@2x.png b/yinmeng-ios/yinmeng-ios/Base/UI/InputView/Emoji/emoji_46@2x.png new file mode 100755 index 0000000..b25947c Binary files /dev/null and b/yinmeng-ios/yinmeng-ios/Base/UI/InputView/Emoji/emoji_46@2x.png differ diff --git a/yinmeng-ios/yinmeng-ios/Base/UI/InputView/Emoji/emoji_47@2x.png b/yinmeng-ios/yinmeng-ios/Base/UI/InputView/Emoji/emoji_47@2x.png new file mode 100755 index 0000000..213483a Binary files /dev/null and b/yinmeng-ios/yinmeng-ios/Base/UI/InputView/Emoji/emoji_47@2x.png differ diff --git a/yinmeng-ios/yinmeng-ios/Base/UI/InputView/Emoji/emoji_48@2x.png b/yinmeng-ios/yinmeng-ios/Base/UI/InputView/Emoji/emoji_48@2x.png new file mode 100755 index 0000000..858182d Binary files /dev/null and b/yinmeng-ios/yinmeng-ios/Base/UI/InputView/Emoji/emoji_48@2x.png differ diff --git a/yinmeng-ios/yinmeng-ios/Base/UI/InputView/Emoji/emoji_49@2x.png b/yinmeng-ios/yinmeng-ios/Base/UI/InputView/Emoji/emoji_49@2x.png new file mode 100755 index 0000000..16fb3cb Binary files /dev/null and b/yinmeng-ios/yinmeng-ios/Base/UI/InputView/Emoji/emoji_49@2x.png differ diff --git a/yinmeng-ios/yinmeng-ios/Base/UI/InputView/Emoji/emoji_50@2x.png b/yinmeng-ios/yinmeng-ios/Base/UI/InputView/Emoji/emoji_50@2x.png new file mode 100755 index 0000000..131f58b Binary files /dev/null and b/yinmeng-ios/yinmeng-ios/Base/UI/InputView/Emoji/emoji_50@2x.png differ diff --git a/yinmeng-ios/yinmeng-ios/Base/UI/InputView/Emoji/emoji_51@2x.png b/yinmeng-ios/yinmeng-ios/Base/UI/InputView/Emoji/emoji_51@2x.png new file mode 100755 index 0000000..3708efd Binary files /dev/null and b/yinmeng-ios/yinmeng-ios/Base/UI/InputView/Emoji/emoji_51@2x.png differ diff --git a/yinmeng-ios/yinmeng-ios/Base/UI/InputView/Emoji/emoji_52@2x.png b/yinmeng-ios/yinmeng-ios/Base/UI/InputView/Emoji/emoji_52@2x.png new file mode 100755 index 0000000..ea1c284 Binary files /dev/null and b/yinmeng-ios/yinmeng-ios/Base/UI/InputView/Emoji/emoji_52@2x.png differ diff --git a/yinmeng-ios/yinmeng-ios/Base/UI/InputView/Emoji/emoji_53@2x.png b/yinmeng-ios/yinmeng-ios/Base/UI/InputView/Emoji/emoji_53@2x.png new file mode 100755 index 0000000..6726743 Binary files /dev/null and b/yinmeng-ios/yinmeng-ios/Base/UI/InputView/Emoji/emoji_53@2x.png differ diff --git a/yinmeng-ios/yinmeng-ios/Base/UI/InputView/Emoji/emoji_54@2x.png b/yinmeng-ios/yinmeng-ios/Base/UI/InputView/Emoji/emoji_54@2x.png new file mode 100755 index 0000000..6ec04d5 Binary files /dev/null and b/yinmeng-ios/yinmeng-ios/Base/UI/InputView/Emoji/emoji_54@2x.png differ diff --git a/yinmeng-ios/yinmeng-ios/Base/UI/InputView/Emoji/emoji_55@2x.png b/yinmeng-ios/yinmeng-ios/Base/UI/InputView/Emoji/emoji_55@2x.png new file mode 100755 index 0000000..dcf2aa4 Binary files /dev/null and b/yinmeng-ios/yinmeng-ios/Base/UI/InputView/Emoji/emoji_55@2x.png differ diff --git a/yinmeng-ios/yinmeng-ios/Base/UI/InputView/Emoji/emoji_56@2x.png b/yinmeng-ios/yinmeng-ios/Base/UI/InputView/Emoji/emoji_56@2x.png new file mode 100755 index 0000000..0d963e8 Binary files /dev/null and b/yinmeng-ios/yinmeng-ios/Base/UI/InputView/Emoji/emoji_56@2x.png differ diff --git a/yinmeng-ios/yinmeng-ios/Base/UI/InputView/Emoji/emoji_57@2x.png b/yinmeng-ios/yinmeng-ios/Base/UI/InputView/Emoji/emoji_57@2x.png new file mode 100755 index 0000000..5a65550 Binary files /dev/null and b/yinmeng-ios/yinmeng-ios/Base/UI/InputView/Emoji/emoji_57@2x.png differ diff --git a/yinmeng-ios/yinmeng-ios/Base/UI/InputView/Emoji/emoji_58@2x.png b/yinmeng-ios/yinmeng-ios/Base/UI/InputView/Emoji/emoji_58@2x.png new file mode 100755 index 0000000..52dd5b1 Binary files /dev/null and b/yinmeng-ios/yinmeng-ios/Base/UI/InputView/Emoji/emoji_58@2x.png differ diff --git a/yinmeng-ios/yinmeng-ios/Base/UI/InputView/Emoji/emoji_59@2x.png b/yinmeng-ios/yinmeng-ios/Base/UI/InputView/Emoji/emoji_59@2x.png new file mode 100755 index 0000000..6102de8 Binary files /dev/null and b/yinmeng-ios/yinmeng-ios/Base/UI/InputView/Emoji/emoji_59@2x.png differ diff --git a/yinmeng-ios/yinmeng-ios/Base/UI/InputView/Emoji/emoji_60@2x.png b/yinmeng-ios/yinmeng-ios/Base/UI/InputView/Emoji/emoji_60@2x.png new file mode 100755 index 0000000..b90969e Binary files /dev/null and b/yinmeng-ios/yinmeng-ios/Base/UI/InputView/Emoji/emoji_60@2x.png differ diff --git a/yinmeng-ios/yinmeng-ios/Base/UI/InputView/Emoji/emoji_61@2x.png b/yinmeng-ios/yinmeng-ios/Base/UI/InputView/Emoji/emoji_61@2x.png new file mode 100755 index 0000000..30c3411 Binary files /dev/null and b/yinmeng-ios/yinmeng-ios/Base/UI/InputView/Emoji/emoji_61@2x.png differ diff --git a/yinmeng-ios/yinmeng-ios/Base/UI/InputView/Emoji/emoji_62@2x.png b/yinmeng-ios/yinmeng-ios/Base/UI/InputView/Emoji/emoji_62@2x.png new file mode 100755 index 0000000..d510577 Binary files /dev/null and b/yinmeng-ios/yinmeng-ios/Base/UI/InputView/Emoji/emoji_62@2x.png differ diff --git a/yinmeng-ios/yinmeng-ios/Base/UI/InputView/Emoji/emoji_63@2x.png b/yinmeng-ios/yinmeng-ios/Base/UI/InputView/Emoji/emoji_63@2x.png new file mode 100755 index 0000000..c574c94 Binary files /dev/null and b/yinmeng-ios/yinmeng-ios/Base/UI/InputView/Emoji/emoji_63@2x.png differ diff --git a/yinmeng-ios/yinmeng-ios/Base/UI/InputView/Emoji/emoji_64@2x.png b/yinmeng-ios/yinmeng-ios/Base/UI/InputView/Emoji/emoji_64@2x.png new file mode 100755 index 0000000..230ee5a Binary files /dev/null and b/yinmeng-ios/yinmeng-ios/Base/UI/InputView/Emoji/emoji_64@2x.png differ diff --git a/yinmeng-ios/yinmeng-ios/Base/UI/InputView/Emoji/emoji_65@2x.png b/yinmeng-ios/yinmeng-ios/Base/UI/InputView/Emoji/emoji_65@2x.png new file mode 100755 index 0000000..967e084 Binary files /dev/null and b/yinmeng-ios/yinmeng-ios/Base/UI/InputView/Emoji/emoji_65@2x.png differ diff --git a/yinmeng-ios/yinmeng-ios/Base/UI/InputView/Emoji/emoji_66@2x.png b/yinmeng-ios/yinmeng-ios/Base/UI/InputView/Emoji/emoji_66@2x.png new file mode 100755 index 0000000..69e85b0 Binary files /dev/null and b/yinmeng-ios/yinmeng-ios/Base/UI/InputView/Emoji/emoji_66@2x.png differ diff --git a/yinmeng-ios/yinmeng-ios/Base/UI/InputView/Emoji/emoji_67@2x.png b/yinmeng-ios/yinmeng-ios/Base/UI/InputView/Emoji/emoji_67@2x.png new file mode 100755 index 0000000..f34d671 Binary files /dev/null and b/yinmeng-ios/yinmeng-ios/Base/UI/InputView/Emoji/emoji_67@2x.png differ diff --git a/yinmeng-ios/yinmeng-ios/Base/UI/InputView/Emoji/emoji_68@2x.png b/yinmeng-ios/yinmeng-ios/Base/UI/InputView/Emoji/emoji_68@2x.png new file mode 100755 index 0000000..164dc56 Binary files /dev/null and b/yinmeng-ios/yinmeng-ios/Base/UI/InputView/Emoji/emoji_68@2x.png differ diff --git a/yinmeng-ios/yinmeng-ios/Base/UI/InputView/Emoji/emoji_69@2x.png b/yinmeng-ios/yinmeng-ios/Base/UI/InputView/Emoji/emoji_69@2x.png new file mode 100755 index 0000000..b1c92bd Binary files /dev/null and b/yinmeng-ios/yinmeng-ios/Base/UI/InputView/Emoji/emoji_69@2x.png differ diff --git a/yinmeng-ios/yinmeng-ios/Base/UI/InputView/Emoji/emoji_70@2x.png b/yinmeng-ios/yinmeng-ios/Base/UI/InputView/Emoji/emoji_70@2x.png new file mode 100755 index 0000000..a58cfc5 Binary files /dev/null and b/yinmeng-ios/yinmeng-ios/Base/UI/InputView/Emoji/emoji_70@2x.png differ diff --git a/yinmeng-ios/yinmeng-ios/Base/UI/InputView/Emoji/emoji_71@2x.png b/yinmeng-ios/yinmeng-ios/Base/UI/InputView/Emoji/emoji_71@2x.png new file mode 100755 index 0000000..e1d80e1 Binary files /dev/null and b/yinmeng-ios/yinmeng-ios/Base/UI/InputView/Emoji/emoji_71@2x.png differ diff --git a/yinmeng-ios/yinmeng-ios/Base/UI/InputView/Emoji/emoji_72@2x.png b/yinmeng-ios/yinmeng-ios/Base/UI/InputView/Emoji/emoji_72@2x.png new file mode 100755 index 0000000..14986a8 Binary files /dev/null and b/yinmeng-ios/yinmeng-ios/Base/UI/InputView/Emoji/emoji_72@2x.png differ diff --git a/yinmeng-ios/yinmeng-ios/Base/UI/InputView/Emoji/emoji_73@2x.png b/yinmeng-ios/yinmeng-ios/Base/UI/InputView/Emoji/emoji_73@2x.png new file mode 100755 index 0000000..6e4a99d Binary files /dev/null and b/yinmeng-ios/yinmeng-ios/Base/UI/InputView/Emoji/emoji_73@2x.png differ diff --git a/yinmeng-ios/yinmeng-ios/Base/UI/InputView/Emoji/emoji_74@2x.png b/yinmeng-ios/yinmeng-ios/Base/UI/InputView/Emoji/emoji_74@2x.png new file mode 100755 index 0000000..04d51be Binary files /dev/null and b/yinmeng-ios/yinmeng-ios/Base/UI/InputView/Emoji/emoji_74@2x.png differ diff --git a/yinmeng-ios/yinmeng-ios/Base/UI/InputView/Emoji/emoji_75@2x.png b/yinmeng-ios/yinmeng-ios/Base/UI/InputView/Emoji/emoji_75@2x.png new file mode 100755 index 0000000..5c9dd3f Binary files /dev/null and b/yinmeng-ios/yinmeng-ios/Base/UI/InputView/Emoji/emoji_75@2x.png differ diff --git a/yinmeng-ios/yinmeng-ios/Base/UI/InputView/Emoji/emoji_76@2x.png b/yinmeng-ios/yinmeng-ios/Base/UI/InputView/Emoji/emoji_76@2x.png new file mode 100755 index 0000000..102ffd9 Binary files /dev/null and b/yinmeng-ios/yinmeng-ios/Base/UI/InputView/Emoji/emoji_76@2x.png differ diff --git a/yinmeng-ios/yinmeng-ios/Base/UI/InputView/Emoji/emoji_77@2x.png b/yinmeng-ios/yinmeng-ios/Base/UI/InputView/Emoji/emoji_77@2x.png new file mode 100755 index 0000000..8853ca5 Binary files /dev/null and b/yinmeng-ios/yinmeng-ios/Base/UI/InputView/Emoji/emoji_77@2x.png differ diff --git a/yinmeng-ios/yinmeng-ios/Base/UI/InputView/Emoji/emoji_78@2x.png b/yinmeng-ios/yinmeng-ios/Base/UI/InputView/Emoji/emoji_78@2x.png new file mode 100755 index 0000000..b1febb3 Binary files /dev/null and b/yinmeng-ios/yinmeng-ios/Base/UI/InputView/Emoji/emoji_78@2x.png differ diff --git a/yinmeng-ios/yinmeng-ios/Base/UI/InputView/Emoji/emoji_79@2x.png b/yinmeng-ios/yinmeng-ios/Base/UI/InputView/Emoji/emoji_79@2x.png new file mode 100755 index 0000000..dc9f76c Binary files /dev/null and b/yinmeng-ios/yinmeng-ios/Base/UI/InputView/Emoji/emoji_79@2x.png differ diff --git a/yinmeng-ios/yinmeng-ios/Base/UI/InputView/Emoji/emoji_80@2x.png b/yinmeng-ios/yinmeng-ios/Base/UI/InputView/Emoji/emoji_80@2x.png new file mode 100755 index 0000000..d1d4001 Binary files /dev/null and b/yinmeng-ios/yinmeng-ios/Base/UI/InputView/Emoji/emoji_80@2x.png differ diff --git a/yinmeng-ios/yinmeng-ios/Base/UI/InputView/Emoji/emoji_81@2x.png b/yinmeng-ios/yinmeng-ios/Base/UI/InputView/Emoji/emoji_81@2x.png new file mode 100755 index 0000000..538dfd5 Binary files /dev/null and b/yinmeng-ios/yinmeng-ios/Base/UI/InputView/Emoji/emoji_81@2x.png differ diff --git a/yinmeng-ios/yinmeng-ios/Base/UI/InputView/Emoji/emoji_82@2x.png b/yinmeng-ios/yinmeng-ios/Base/UI/InputView/Emoji/emoji_82@2x.png new file mode 100755 index 0000000..a6c5606 Binary files /dev/null and b/yinmeng-ios/yinmeng-ios/Base/UI/InputView/Emoji/emoji_82@2x.png differ diff --git a/yinmeng-ios/yinmeng-ios/Base/UI/InputView/Emoji/emoji_83@2x.png b/yinmeng-ios/yinmeng-ios/Base/UI/InputView/Emoji/emoji_83@2x.png new file mode 100755 index 0000000..8376609 Binary files /dev/null and b/yinmeng-ios/yinmeng-ios/Base/UI/InputView/Emoji/emoji_83@2x.png differ diff --git a/yinmeng-ios/yinmeng-ios/Base/UI/InputView/Emoji/emoji_84@2x.png b/yinmeng-ios/yinmeng-ios/Base/UI/InputView/Emoji/emoji_84@2x.png new file mode 100755 index 0000000..dc7e2c5 Binary files /dev/null and b/yinmeng-ios/yinmeng-ios/Base/UI/InputView/Emoji/emoji_84@2x.png differ diff --git a/yinmeng-ios/yinmeng-ios/Base/UI/InputView/Emoji/emoji_85@2x.png b/yinmeng-ios/yinmeng-ios/Base/UI/InputView/Emoji/emoji_85@2x.png new file mode 100755 index 0000000..faa1694 Binary files /dev/null and b/yinmeng-ios/yinmeng-ios/Base/UI/InputView/Emoji/emoji_85@2x.png differ diff --git a/yinmeng-ios/yinmeng-ios/Base/UI/InputView/Emoji/emoji_86@2x.png b/yinmeng-ios/yinmeng-ios/Base/UI/InputView/Emoji/emoji_86@2x.png new file mode 100755 index 0000000..d1e9887 Binary files /dev/null and b/yinmeng-ios/yinmeng-ios/Base/UI/InputView/Emoji/emoji_86@2x.png differ diff --git a/yinmeng-ios/yinmeng-ios/Base/UI/InputView/Emoji/emoji_87@2x.png b/yinmeng-ios/yinmeng-ios/Base/UI/InputView/Emoji/emoji_87@2x.png new file mode 100755 index 0000000..9d9b57d Binary files /dev/null and b/yinmeng-ios/yinmeng-ios/Base/UI/InputView/Emoji/emoji_87@2x.png differ diff --git a/yinmeng-ios/yinmeng-ios/Base/UI/InputView/Emoji/emoji_88@2x.png b/yinmeng-ios/yinmeng-ios/Base/UI/InputView/Emoji/emoji_88@2x.png new file mode 100755 index 0000000..f61d6e7 Binary files /dev/null and b/yinmeng-ios/yinmeng-ios/Base/UI/InputView/Emoji/emoji_88@2x.png differ diff --git a/yinmeng-ios/yinmeng-ios/Base/UI/InputView/Emoji/emoji_89@2x.png b/yinmeng-ios/yinmeng-ios/Base/UI/InputView/Emoji/emoji_89@2x.png new file mode 100755 index 0000000..a1fd384 Binary files /dev/null and b/yinmeng-ios/yinmeng-ios/Base/UI/InputView/Emoji/emoji_89@2x.png differ diff --git a/yinmeng-ios/yinmeng-ios/Base/UI/InputView/Emoji/emoji_90@2x.png b/yinmeng-ios/yinmeng-ios/Base/UI/InputView/Emoji/emoji_90@2x.png new file mode 100755 index 0000000..5599f6b Binary files /dev/null and b/yinmeng-ios/yinmeng-ios/Base/UI/InputView/Emoji/emoji_90@2x.png differ diff --git a/yinmeng-ios/yinmeng-ios/Base/UI/InputView/Emoji/emoji_91@2x.png b/yinmeng-ios/yinmeng-ios/Base/UI/InputView/Emoji/emoji_91@2x.png new file mode 100755 index 0000000..4fa5719 Binary files /dev/null and b/yinmeng-ios/yinmeng-ios/Base/UI/InputView/Emoji/emoji_91@2x.png differ diff --git a/yinmeng-ios/yinmeng-ios/Base/UI/InputView/Emoji/emoji_92@2x.png b/yinmeng-ios/yinmeng-ios/Base/UI/InputView/Emoji/emoji_92@2x.png new file mode 100755 index 0000000..b551256 Binary files /dev/null and b/yinmeng-ios/yinmeng-ios/Base/UI/InputView/Emoji/emoji_92@2x.png differ diff --git a/yinmeng-ios/yinmeng-ios/Base/UI/InputView/Emoji/emoji_93@2x.png b/yinmeng-ios/yinmeng-ios/Base/UI/InputView/Emoji/emoji_93@2x.png new file mode 100755 index 0000000..7a2fbc1 Binary files /dev/null and b/yinmeng-ios/yinmeng-ios/Base/UI/InputView/Emoji/emoji_93@2x.png differ diff --git a/yinmeng-ios/yinmeng-ios/Base/UI/InputView/Emoji/emoji_94@2x.png b/yinmeng-ios/yinmeng-ios/Base/UI/InputView/Emoji/emoji_94@2x.png new file mode 100755 index 0000000..bc30b62 Binary files /dev/null and b/yinmeng-ios/yinmeng-ios/Base/UI/InputView/Emoji/emoji_94@2x.png differ diff --git a/yinmeng-ios/yinmeng-ios/Base/UI/InputView/Emoji/emoji_95@2x.png b/yinmeng-ios/yinmeng-ios/Base/UI/InputView/Emoji/emoji_95@2x.png new file mode 100755 index 0000000..69863a0 Binary files /dev/null and b/yinmeng-ios/yinmeng-ios/Base/UI/InputView/Emoji/emoji_95@2x.png differ diff --git a/yinmeng-ios/yinmeng-ios/Base/UI/InputView/Emoji/emoji_96@2x.png b/yinmeng-ios/yinmeng-ios/Base/UI/InputView/Emoji/emoji_96@2x.png new file mode 100755 index 0000000..0b6f175 Binary files /dev/null and b/yinmeng-ios/yinmeng-ios/Base/UI/InputView/Emoji/emoji_96@2x.png differ diff --git a/yinmeng-ios/yinmeng-ios/Base/UI/InputView/Emoji/emoji_97@2x.png b/yinmeng-ios/yinmeng-ios/Base/UI/InputView/Emoji/emoji_97@2x.png new file mode 100755 index 0000000..01fa593 Binary files /dev/null and b/yinmeng-ios/yinmeng-ios/Base/UI/InputView/Emoji/emoji_97@2x.png differ diff --git a/yinmeng-ios/yinmeng-ios/Base/UI/InputView/Emoji/emoji_98@2x.png b/yinmeng-ios/yinmeng-ios/Base/UI/InputView/Emoji/emoji_98@2x.png new file mode 100755 index 0000000..1c7b12f Binary files /dev/null and b/yinmeng-ios/yinmeng-ios/Base/UI/InputView/Emoji/emoji_98@2x.png differ diff --git a/yinmeng-ios/yinmeng-ios/Base/UI/InputView/Emoji/emoji_99@2x.png b/yinmeng-ios/yinmeng-ios/Base/UI/InputView/Emoji/emoji_99@2x.png new file mode 100755 index 0000000..e009248 Binary files /dev/null and b/yinmeng-ios/yinmeng-ios/Base/UI/InputView/Emoji/emoji_99@2x.png differ diff --git a/yinmeng-ios/yinmeng-ios/Base/UI/InputView/Emoji/emoji_del_normal@2x.png b/yinmeng-ios/yinmeng-ios/Base/UI/InputView/Emoji/emoji_del_normal@2x.png new file mode 100755 index 0000000..a2f1e0d Binary files /dev/null and b/yinmeng-ios/yinmeng-ios/Base/UI/InputView/Emoji/emoji_del_normal@2x.png differ diff --git a/yinmeng-ios/yinmeng-ios/Base/UI/InputView/Emoji/emoji_del_pressed@2x.png b/yinmeng-ios/yinmeng-ios/Base/UI/InputView/Emoji/emoji_del_pressed@2x.png new file mode 100755 index 0000000..260aa0c Binary files /dev/null and b/yinmeng-ios/yinmeng-ios/Base/UI/InputView/Emoji/emoji_del_pressed@2x.png differ diff --git a/yinmeng-ios/yinmeng-ios/Base/UI/InputView/InputView/QEEmotionImageView.h b/yinmeng-ios/yinmeng-ios/Base/UI/InputView/InputView/QEEmotionImageView.h new file mode 100644 index 0000000..b68dacf --- /dev/null +++ b/yinmeng-ios/yinmeng-ios/Base/UI/InputView/InputView/QEEmotionImageView.h @@ -0,0 +1,16 @@ +// +// QEEmotionImageView.h +// xplan-ios +// +// Created by 冯硕 on 2022/8/17. +// + +#import + +NS_ASSUME_NONNULL_BEGIN + +@interface QEEmotionImageView : UIImageView +@property (nonatomic, strong) NSString *displayText; +@end + +NS_ASSUME_NONNULL_END diff --git a/yinmeng-ios/yinmeng-ios/Base/UI/InputView/InputView/QEEmotionImageView.m b/yinmeng-ios/yinmeng-ios/Base/UI/InputView/InputView/QEEmotionImageView.m new file mode 100644 index 0000000..1643f67 --- /dev/null +++ b/yinmeng-ios/yinmeng-ios/Base/UI/InputView/InputView/QEEmotionImageView.m @@ -0,0 +1,20 @@ +// +// QEEmotionImageView.m +// xplan-ios +// +// Created by 冯硕 on 2022/8/17. +// + +#import "QEEmotionImageView.h" + +@implementation QEEmotionImageView + +/* +// Only override drawRect: if you perform custom drawing. +// An empty implementation adversely affects performance during animation. +- (void)drawRect:(CGRect)rect { + // Drawing code +} +*/ + +@end diff --git a/yinmeng-ios/yinmeng-ios/Base/UI/InputView/InputView/QEmotion.h b/yinmeng-ios/yinmeng-ios/Base/UI/InputView/InputView/QEmotion.h new file mode 100644 index 0000000..2aa0a34 --- /dev/null +++ b/yinmeng-ios/yinmeng-ios/Base/UI/InputView/InputView/QEmotion.h @@ -0,0 +1,35 @@ +// +// QEmotion.h +// QKeyboardEmotionView +// +// Created by DongJin on 2022/3/26. +// + +#import + +NS_ASSUME_NONNULL_BEGIN + +/** + * 代表一个表情的数据对象 + */ +@interface QEmotion : NSObject + +/// 当前表情的标识符,可用于区分不同表情 +@property(nonatomic, copy) NSString *identifier; + +/// 当前表情展示出来的名字,可用于输入框里的占位文字,请务必使用统一的左右标识符将表情名称包裹起来(例如常见的“[]”),否则在 `QMUIEmotionInputManager` 里会因为找不到标识符而无法准确识别出一串文本里的哪些字符是代表一个表情。合法的 displayName 例子:“[委屈]” +@property(nonatomic, copy) NSString *displayName; + +/// 表情对应的图片。若表情图片存放于项目内,则建议用当前表情的`identifier`作为图片名 +@property(nonatomic, strong) UIImage *image; + +/** + * 快速生成一个`QMUIEmotion`对象,并且以`identifier`为图片名在当前项目里查找,作为表情的图片 + * @param identifier 表情的标识符,也会被当成图片的名字 + * @param displayName 表情展示出来的名字 + */ ++ (instancetype)emotionWithIdentifier:(NSString *)identifier displayName:(NSString *)displayName; + +@end + +NS_ASSUME_NONNULL_END diff --git a/yinmeng-ios/yinmeng-ios/Base/UI/InputView/InputView/QEmotion.m b/yinmeng-ios/yinmeng-ios/Base/UI/InputView/InputView/QEmotion.m new file mode 100644 index 0000000..b409ede --- /dev/null +++ b/yinmeng-ios/yinmeng-ios/Base/UI/InputView/InputView/QEmotion.m @@ -0,0 +1,30 @@ +// +// QEmotion.m +// QKeyboardEmotionView +// +// Created by DongJin on 2022/3/26. +// + +#import "QEmotion.h" + +@implementation QEmotion + ++ (instancetype)emotionWithIdentifier:(NSString *)identifier displayName:(NSString *)displayName { + QEmotion *emotion = [[self alloc] init]; + emotion.identifier = identifier; + emotion.displayName = displayName; + return emotion; +} + +- (BOOL)isEqual:(id)object { + if (!object) return NO; + if (self == object) return YES; + if (![object isKindOfClass:[self class]]) return NO; + return [self.identifier isEqualToString:((QEmotion *)object).identifier]; +} + +- (NSString *)description { + return [NSString stringWithFormat:@"%@, identifier: %@, displayName: %@", [super description], self.identifier, self.displayName]; +} + +@end diff --git a/yinmeng-ios/yinmeng-ios/Base/UI/InputView/InputView/QEmotionAttachment.h b/yinmeng-ios/yinmeng-ios/Base/UI/InputView/InputView/QEmotionAttachment.h new file mode 100644 index 0000000..64ccd42 --- /dev/null +++ b/yinmeng-ios/yinmeng-ios/Base/UI/InputView/InputView/QEmotionAttachment.h @@ -0,0 +1,19 @@ +// +// QEmotionAttachment.h +// QKeyboardEmotionView +// +// Created by DongJin on 2022/3/25. +// + +#import + +NS_ASSUME_NONNULL_BEGIN + +//为了获取输入框里的纯文本,只能自己新建一个类 +@interface QEmotionAttachment : NSTextAttachment + +@property (nonatomic, strong) NSString *displayText; + +@end + +NS_ASSUME_NONNULL_END diff --git a/yinmeng-ios/yinmeng-ios/Base/UI/InputView/InputView/QEmotionAttachment.m b/yinmeng-ios/yinmeng-ios/Base/UI/InputView/InputView/QEmotionAttachment.m new file mode 100644 index 0000000..657cbdd --- /dev/null +++ b/yinmeng-ios/yinmeng-ios/Base/UI/InputView/InputView/QEmotionAttachment.m @@ -0,0 +1,12 @@ +// +// QEmotionAttachment.m +// QKeyboardEmotionView +// +// Created by DongJin on 2022/3/25. +// + +#import "QEmotionAttachment.h" + +@implementation QEmotionAttachment + +@end diff --git a/yinmeng-ios/yinmeng-ios/Base/UI/InputView/InputView/QEmotionBoardView.h b/yinmeng-ios/yinmeng-ios/Base/UI/InputView/InputView/QEmotionBoardView.h new file mode 100644 index 0000000..5017c96 --- /dev/null +++ b/yinmeng-ios/yinmeng-ios/Base/UI/InputView/InputView/QEmotionBoardView.h @@ -0,0 +1,122 @@ +// +// QMUIEmotionView.h +// qmui +// +// Created by QMUI Team on 16/9/6. +// 本库修改了修复QMUI的两个BUG,1:计算半透明表情的计算方式有问题,2:重新优化点击后的灰色背景的大小改为计算,而不是设置死 +// + +#import +#import "QEmotion.h" + +@class QEmotionBoardView; + +@protocol QEmotionBoardViewDelegate + +@optional +/** + * 选中表情时的回调 + * @param index 被选中的表情在`emotions`里的索引 + * @param emotion 被选中的表情对应的`QMUIEmotion`对象 + */ +- (void)emotionView:(QEmotionBoardView *)emotionView didSelectEmotion:(QEmotion *)emotion atIndex:(NSInteger)index; + +// 删除按钮的点击事件回调 +- (void)emotionViewDidSelectDeleteButton:(QEmotionBoardView *)emotionView; + +// 发送按钮的点击事件回调 +- (void)emotionViewDidSelectSendButton:(QEmotionBoardView *)emotionView; + +@end + +/** + * 表情控件,支持任意表情的展示,每个表情以相同的大小显示。 + * + * 使用方式: + * + * - 通过`initWithFrame:`初始化,如果面板高度不变,建议在init时就设置好,若最终布局以父类的`layoutSubviews`为准,则也可通过`init`方法初始化,再在`layoutSubviews`里计算布局 + * - 通过调整`paddingInPage`、`emotionSize`等变量来自定义UI + * - 通过`emotions`设置要展示的表情 + * - 通过`didSelectEmotionBlock`设置选中表情时的回调,通过`didSelectDeleteButtonBlock`来响应面板内的删除按钮 + * - 为`sendButton`添加`addTarget:action:forState:`事件,从而触发发送逻辑 + * + * 本控件支持通过`UIAppearance`设置全局的默认样式。若要修改控件内的`UIPageControl`的样式,可通过`[UIPageControl appearanceWhenContainedInInstancesOfClasses:@[[QMUIEmotionView class]]]`的方式来修改。 + */ +@interface QEmotionBoardView : UIView + +/// 要展示的所有表情 +@property(nonatomic, copy) NSArray *emotions; + +/** + * 选中表情时的回调 + * @argv index 被选中的表情在`emotions`里的索引 + * @argv emotion 被选中的表情对应的`QMUIEmotion`对象 + * @see QMUIEmotion + */ +//@property(nonatomic, copy) void (^didSelectEmotionBlock)(NSInteger index, QMUIEmotion *emotion); +// +///// 删除按钮的点击事件回调 +//@property(nonatomic, copy) void (^didSelectDeleteButtonBlock)(void); + + +@property(nonatomic, weak) id delegate; + +/// 用于展示表情面板的竖向滚动的 scrollView,布局撑满整个控件 +@property(nonatomic, strong, readonly) UIScrollView *scrollView; + +/// 表情与表情之间的垂直间距,默认为10,仅在 verticalAlignment 为 YES 时生效,当 verticalAlignment 为 N0 时,表情的垂直间距由 numberOfRowsPerPage 决定 +@property(nonatomic, assign) CGFloat emotionVerticalSpacing UI_APPEARANCE_SELECTOR; + +/// 控件右下角的发送按钮 +@property(nonatomic, strong, readonly) UIButton *sendButton; + +/// 控件右下角的删除按钮 +@property(nonatomic, strong, readonly) UIButton *deleteButton; + +/// 每一页表情的上下左右padding,默认为{18, 18, 65, 18} +@property(nonatomic, assign) UIEdgeInsets paddingInPage UI_APPEARANCE_SELECTOR; + +/// 每一页表情允许的最大行数,默认为4 +@property(nonatomic, assign) NSInteger numberOfRowsPerPage UI_APPEARANCE_SELECTOR; + +/// 表情的图片大小,不管`QMUIEmotion.image.size`多大,都会被缩放到`emotionSize`里显示,默认为{30, 30} +@property(nonatomic, assign) CGSize emotionSize UI_APPEARANCE_SELECTOR; + +/// 表情点击时的背景遮罩相对于`emotionSize`往外拓展的区域,负值表示遮罩比表情还大,正值表示遮罩比表情还小,默认为{-3, -3, -3, -3} +@property(nonatomic, assign) UIEdgeInsets emotionSelectedBackgroundExtension UI_APPEARANCE_SELECTOR; + +/// 表情与表情之间的最小水平间距,默认为10 +@property(nonatomic, assign) CGFloat minimumEmotionHorizontalSpacing UI_APPEARANCE_SELECTOR; + +/// 表情面板右下角的删除按钮的图片,默认为`[QMUIHelper imageWithName:@"QMUI_emotion_delete"]` +@property(nonatomic, strong) UIImage *deleteButtonImage UI_APPEARANCE_SELECTOR; + +/// 删除按钮的背景色,默认为 nil +@property(nonatomic, strong) UIColor *deleteButtonBackgroundColor UI_APPEARANCE_SELECTOR; + +/// 删除按钮位置的 (x,y) 的偏移,默认为 CGPointZero +@property(nonatomic, assign) CGPoint deleteButtonOffset UI_APPEARANCE_SELECTOR; + +/// 删除按钮的圆角大小,默认为4 +@property(nonatomic, assign) CGFloat deleteButtonCornerRadius UI_APPEARANCE_SELECTOR; + +/// 发送按钮的文字样式,默认为{NSFontAttributeName: UIFontMake(15), NSForegroundColorAttributeName: UIColorWhite} +@property(nonatomic, strong) NSDictionary *sendButtonTitleAttributes UI_APPEARANCE_SELECTOR; + +/// 发送按钮的背景色,默认为`UIColorBlue` +@property(nonatomic, strong) UIColor *sendButtonBackgroundColor UI_APPEARANCE_SELECTOR; + +/// 发送按钮的圆角大小,默认为4 +@property(nonatomic, assign) CGFloat sendButtonCornerRadius UI_APPEARANCE_SELECTOR; + +/// 发送按钮布局时的外边距,相对于控件右下角。仅right/bottom有效,默认为{0, 0, 16, 16} +@property(nonatomic, assign) UIEdgeInsets sendButtonMargins UI_APPEARANCE_SELECTOR; + +/// 分页控件距离底部的间距,默认为22 +@property(nonatomic, assign) CGFloat pageControlMarginBottom UI_APPEARANCE_SELECTOR; + +/// 顶部那条细线 +@property(nonatomic, strong) UIView *topLineView; + + +@end diff --git a/yinmeng-ios/yinmeng-ios/Base/UI/InputView/InputView/QEmotionBoardView.m b/yinmeng-ios/yinmeng-ios/Base/UI/InputView/InputView/QEmotionBoardView.m new file mode 100644 index 0000000..745c304 --- /dev/null +++ b/yinmeng-ios/yinmeng-ios/Base/UI/InputView/InputView/QEmotionBoardView.m @@ -0,0 +1,531 @@ +// +// QEmotionView.m +// qmui +// +// Created by QMUI Team on 16/9/6. +// 作者DQ:这里的代码我是从QMUI里摘抄出来再做了删减。然后我修改了修复QMUI的两个BUG,1:半透明表情的Rect计算方式有问题,2:重新优化点击后的灰色背景的大小改为计算,而不是设置死,3:添加了顶部的一条细线 +// + +#import "QEmotionBoardView.h" + + +@class UIEmotionPageView; + +@protocol UIEmotionPageViewDelegate + +@optional +- (void)emotionPageView:(UIEmotionPageView *)emotionPageView didSelectEmotion:(QEmotion *)emotion atIndex:(NSInteger)index; +- (void)emotionPageViewDidLayoutEmotions:(UIEmotionPageView *)emotionPageView; +@end + +/// 表情面板每一页的cell,在drawRect里将所有表情绘制上去,同时自带一个末尾的删除按钮 +@interface UIEmotionPageView : UIView + +@property(nonatomic, weak) QEmotionBoardView *delegate; + +/// 表情被点击时盖在表情上方用于表示选中的遮罩 +@property(nonatomic, strong) UIView *emotionSelectedBackgroundView; + +/// 表情面板右下角的删除按钮 +@property(nonatomic, weak) UIButton *deleteButton; + +/// 删除按钮位置的 (x,y) 的偏移 +@property(nonatomic, assign) CGPoint deleteButtonOffset; + +/// 所有表情的 Layer +@property(nonatomic, strong) NSMutableArray *emotionLayers; + +/// 分配给当前pageView的所有表情 +@property(nonatomic, copy) NSArray *emotions; + +/// 记录当前pageView里所有表情的可点击区域的rect,在drawRect:里更新,在tap事件里使用 +@property(nonatomic, strong) NSMutableArray *emotionHittingRects; + +/// 负责实现表情的点击 +@property(nonatomic, strong) UITapGestureRecognizer *tapGestureRecognizer; + +/// 整个pageView内部的padding +@property(nonatomic, assign) UIEdgeInsets padding; + +/// 每个pageView能展示表情的行数 +@property(nonatomic, assign) NSInteger numberOfRows; + +/// 每个表情的绘制区域大小,表情图片最终会以UIViewContentModeScaleAspectFit的方式撑满这个大小。表情计算布局时也是基于这个大小来算的。 +@property(nonatomic, assign) CGSize emotionSize; + +/// 点击表情时出现的遮罩要在表情所在的矩形位置拓展多少空间,负值表示遮罩比emotionSize更大,正值表示遮罩比emotionSize更小。最终判断表情点击区域时也是以拓展后的区域来判定的 +@property(nonatomic, assign) UIEdgeInsets emotionSelectedBackgroundExtension; + +/// 表情与表情之间的水平间距的最小值,实际值可能比这个要大一点(pageView会把剩余空间分配到表情的水平间距里) +@property(nonatomic, assign) CGFloat minimumEmotionHorizontalSpacing; + +/// debug模式会把表情的绘制矩形显示出来 +@property(nonatomic, assign) BOOL debug; + +@property(nonatomic, assign, readonly) BOOL needsLayoutEmotions; + +@property(nonatomic, assign) CGRect previousLayoutFrame; + +@end + +@implementation UIEmotionPageView + +//发送按钮,删除按钮的宽高 +const int UISendButtonWidth = 52; +const int UISendButtonHeight = 41; + +- (instancetype)initWithFrame:(CGRect)frame { + self = [super initWithFrame:frame]; + if (self) { + self.emotionSelectedBackgroundView = [[UIView alloc] init]; + self.emotionSelectedBackgroundView.userInteractionEnabled = NO; + self.emotionSelectedBackgroundView.backgroundColor = [UIColor colorWithRed:0 green:0 blue:0 alpha:.16]; + self.emotionSelectedBackgroundView.layer.cornerRadius = 3; + self.emotionSelectedBackgroundView.alpha = 0; + [self addSubview:self.emotionSelectedBackgroundView]; + + self.emotionHittingRects = [[NSMutableArray alloc] init]; + self.tapGestureRecognizer = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(handleTapGestureRecognizer:)]; + [self addGestureRecognizer:self.tapGestureRecognizer]; + } + return self; +} + +- (CGRect)frameForDeleteButton:(__kindof UIView *)deleteButton { + CGRect rect = deleteButton.frame; + CGFloat x = CGRectGetWidth(self.bounds) - self.padding.right - CGRectGetWidth(deleteButton.frame) - (self.emotionSize.width - CGRectGetWidth(deleteButton.frame)) / 2.0 + self.deleteButtonOffset.x; + CGFloat y = CGRectGetHeight(self.bounds) - self.padding.bottom - CGRectGetHeight(deleteButton.frame) - (self.emotionSize.height - CGRectGetHeight(deleteButton.frame)) / 2.0 + self.deleteButtonOffset.y; + rect.origin.x = x; + rect.origin.y = y; + return rect; +} + +- (void)layoutSubviews { + [super layoutSubviews]; + if (self.deleteButton.superview == self) { + // 删除按钮必定布局到最后一个表情的位置,且与表情上下左右居中 + self.deleteButton.frame = [self frameForDeleteButton:self.deleteButton]; + } + BOOL isSizeChanged = !CGSizeEqualToSize(self.previousLayoutFrame.size, self.frame.size); + self.previousLayoutFrame = self.frame; + if (isSizeChanged) { + [self setNeedsLayoutEmotions]; + } + [self layoutEmotionsIfNeeded]; +} + +- (void)setNeedsLayoutEmotions { + _needsLayoutEmotions = YES; +} + +- (void)setEmotions:(NSArray *)emotions { + if ([_emotions isEqualToArray:emotions]) return; + _emotions = emotions; + [self setNeedsLayoutEmotions]; + [self setNeedsLayout]; +} + +- (void)layoutEmotionsIfNeeded { + if (!self.needsLayoutEmotions) return; + _needsLayoutEmotions = NO; + [self.emotionHittingRects removeAllObjects]; + + CGSize contentSize = UIEdgeInsetsInsetRect(self.bounds, self.padding).size; + //根据小表情的自身大小+水平最小间距,算出来一行有多少个表情 + NSInteger emotionCountPerRow = (contentSize.width + self.minimumEmotionHorizontalSpacing) / (self.emotionSize.width + self.minimumEmotionHorizontalSpacing); + //最后算出来的 实际表情之间的水平间距 + CGFloat emotionHorizontalSpacing = (contentSize.width - emotionCountPerRow * self.emotionSize.width) / (emotionCountPerRow - 1); + //最后算出来的 实际表情之间的垂直间距 + CGFloat emotionVerticalSpacing = (contentSize.height - self.numberOfRows * self.emotionSize.height) / (self.numberOfRows - 1); + //最后计算出来,点击表情的扩展点击范围 ;dqdebug + self.emotionSelectedBackgroundExtension = UIEdgeInsetsMake(-emotionVerticalSpacing/2, -emotionHorizontalSpacing/2, -emotionVerticalSpacing/2, -emotionHorizontalSpacing/2); + CGPoint emotionOrigin = CGPointZero; + NSInteger emotionCount = self.emotions.count; + if (!self.emotionLayers) { + self.emotionLayers = [NSMutableArray arrayWithCapacity:emotionCount]; + } + for (NSInteger i = 0; i < emotionCount; i++) { + CALayer *emotionlayer = nil; + if (i < self.emotionLayers.count) { + emotionlayer = self.emotionLayers[i]; + } else { + emotionlayer = [CALayer layer]; + emotionlayer.contentsScale = [[UIScreen mainScreen] scale]; + [self.emotionLayers addObject:emotionlayer]; + [self.layer addSublayer:emotionlayer]; + } + + emotionlayer.contents = (__bridge id)(self.emotions[i].image.CGImage);//使用layer效率更高 + NSInteger row = i / emotionCountPerRow; + emotionOrigin.x = self.padding.left + (self.emotionSize.width + emotionHorizontalSpacing) * (i % emotionCountPerRow); + emotionOrigin.y = self.padding.top + (self.emotionSize.height + emotionVerticalSpacing) * row; + CGRect emotionRect = CGRectMake(emotionOrigin.x, emotionOrigin.y, self.emotionSize.width, self.emotionSize.height); + CGRect emotionHittingRect = UIEdgeInsetsInsetRect(emotionRect, self.emotionSelectedBackgroundExtension); + [self.emotionHittingRects addObject:[NSValue valueWithCGRect:emotionHittingRect]]; + emotionlayer.frame = emotionRect; + emotionlayer.hidden = NO; + } + + if (self.emotionLayers.count > emotionCount) { + for (NSInteger i = self.emotionLayers.count - emotionCount - 1; i < self.emotionLayers.count; i++) { + self.emotionLayers[i].hidden = YES; + } + } + if ([self.delegate respondsToSelector:@selector(emotionPageViewDidLayoutEmotions:)]) { + [self.delegate emotionPageViewDidLayoutEmotions:self]; + } +} + +//监听整个大面板的点击事件,然后找到具体的某个表情 +- (void)handleTapGestureRecognizer:(UITapGestureRecognizer *)gestureRecognizer { + CGPoint location = [gestureRecognizer locationInView:self]; + for (NSInteger i = 0; i < self.emotionHittingRects.count; i ++) { + CGRect rect = [self.emotionHittingRects[i] CGRectValue]; + if (CGRectContainsPoint(rect, location)) { + CALayer *layer = self.emotionLayers[i]; + if (layer.opacity < 0.2) return; + QEmotion *emotion = self.emotions[i]; + self.emotionSelectedBackgroundView.frame = rect; + [UIView animateWithDuration:.08 animations:^{ + self.emotionSelectedBackgroundView.alpha = 1; + } completion:^(BOOL finished) { + [UIView animateWithDuration:.08 animations:^{ + self.emotionSelectedBackgroundView.alpha = 0; + } completion:nil]; + }]; + if ([self.delegate respondsToSelector:@selector(emotionPageView:didSelectEmotion:atIndex:)]) { + [self.delegate emotionPageView:self didSelectEmotion:emotion atIndex:i]; + } + if (self.debug) { +// QMUILog(NSStringFromClass(self.class), @"点击的是当前页里的第 %@ 个表情,%@", @(i), emotion); + } + return; + } + } +} + +- (CGSize)verticalSizeThatFits:(CGSize)size emotionVerticalSpacing:(CGFloat)emotionVerticalSpacing { + CGSize contentSize = UIEdgeInsetsInsetRect(CGRectMake(0, 0, size.width, size.height), self.padding).size; + NSInteger emotionCountPerRow = (contentSize.width + self.minimumEmotionHorizontalSpacing) / (self.emotionSize.width + self.minimumEmotionHorizontalSpacing); + NSInteger row = ceil(self.emotions.count / (emotionCountPerRow * 1.0)); + CGFloat height = (self.emotionSize.height + emotionVerticalSpacing) * row - emotionVerticalSpacing + ( self.padding.top + self.padding.bottom); + return CGSizeMake(size.width, height); +} + +- (void)updateDeleteButton:(UIButton *)deleteButton { + _deleteButton = deleteButton; + [self addSubview:deleteButton]; +} + +- (void)setDeleteButtonOffset:(CGPoint)deleteButtonOffset { + _deleteButtonOffset = deleteButtonOffset; + [self setNeedsLayout]; +} + + +@end + +@interface UIEmotionVerticalScrollView : UIScrollView +@property(nonatomic, strong) UIEmotionPageView *pageView; +@end + +@implementation UIEmotionVerticalScrollView + +- (instancetype)initWithFrame:(CGRect)frame { + if (self = [super initWithFrame:frame]) { + _pageView = [[UIEmotionPageView alloc] init]; + self.pageView.deleteButton.hidden = YES; + [self addSubview:self.pageView]; + } + return self; +} + +- (void)setEmotions:(NSArray *)emotions + emotionSize:(CGSize)emotionSize + minimumEmotionHorizontalSpacing:(CGFloat)minimumEmotionHorizontalSpacing + emotionVerticalSpacing:(CGFloat)emotionVerticalSpacing + emotionSelectedBackgroundExtension:(UIEdgeInsets)emotionSelectedBackgroundExtension + paddingInPage:(UIEdgeInsets)paddingInPage { + UIEmotionPageView *pageView = self.pageView; + pageView.emotions = emotions; + pageView.padding = paddingInPage; + CGSize contentSize = CGSizeMake(self.bounds.size.width - [self edgeInsetsGetHorizontalValue:paddingInPage], self.bounds.size.height - [self edgeInsetsGetVerticalValue:paddingInPage]); + NSInteger emotionCountPerRow = (contentSize.width + minimumEmotionHorizontalSpacing) / (emotionSize.width + minimumEmotionHorizontalSpacing); + pageView.numberOfRows = ceil(emotions.count / (CGFloat)emotionCountPerRow); + pageView.emotionSize =emotionSize; + pageView.emotionSelectedBackgroundExtension = emotionSelectedBackgroundExtension; + pageView.minimumEmotionHorizontalSpacing = minimumEmotionHorizontalSpacing; + [pageView setNeedsLayout]; + CGSize size = [pageView verticalSizeThatFits:self.bounds.size emotionVerticalSpacing:emotionVerticalSpacing]; + self.pageView.frame = CGRectMake(0, 0, size.width, size.height); + self.contentSize = size; +} + +- (void)adjustEmotionsAlphaWithFloatingRect:(CGRect)floatingRect { + CGSize contentSize = CGSizeMake(self.contentSize.width - [self edgeInsetsGetHorizontalValue:self.pageView.padding], self.contentSize.height - [self edgeInsetsGetVerticalValue:self.pageView.padding]); + NSInteger emotionCountPerRow = (contentSize.width + self.pageView.minimumEmotionHorizontalSpacing) / (self.pageView.emotionSize.width + self.pageView.minimumEmotionHorizontalSpacing); + CGFloat emotionVerticalSpacing = (contentSize.height - self.pageView.numberOfRows * self.pageView.emotionSize.height) / (self.pageView.numberOfRows - 1); + //最后算出来的 实际表情之间的水平间距 + CGFloat emotionHorizontalSpacing = (contentSize.width - emotionCountPerRow * self.pageView.emotionSize.width) / (emotionCountPerRow - 1); + NSInteger columnIndexLeft = ceil((floatingRect.origin.x - self.pageView.padding.left) / (self.pageView.emotionSize.width + emotionHorizontalSpacing)) - 1; + NSInteger columnIndexRight = emotionCountPerRow - 1; + CGFloat rowIndexTop = ((floatingRect.origin.y - self.pageView.padding.top) / (self.pageView.emotionSize.height + emotionVerticalSpacing)) - 1; + for (NSInteger i = 0; i < self.pageView.emotionLayers.count; i++) { + NSInteger row = (i / emotionCountPerRow); + NSInteger column = (i % emotionCountPerRow); + + [CATransaction begin]; + [CATransaction setDisableActions:YES]; + if (column >= columnIndexLeft && column <= columnIndexRight && row > rowIndexTop) { + if (row == ceil(rowIndexTop)) { + CGFloat intersectAreaHeight = floatingRect.origin.y - self.pageView.emotionLayers[i].frame.origin.y; + CGFloat percent = intersectAreaHeight / self.pageView.emotionSize.height; + self.pageView.emotionLayers[i].opacity = percent * percent; + } else { + self.pageView.emotionLayers[i].opacity = 0; + } + } else { + self.pageView.emotionLayers[i].opacity = 1.0f; + } + [CATransaction commit]; + } +} + + +- (CGFloat)edgeInsetsGetVerticalValue:(UIEdgeInsets )insets { + return insets.top + insets.bottom; +} + +- (CGFloat)edgeInsetsGetHorizontalValue:(UIEdgeInsets )insets { + return insets.left + insets.right; +} + + +@end + +@interface QEmotionBoardView () +/// 用于展示表情面板的竖向滚动 scrollView,布局撑满整个控件 +@property(nonatomic, strong, readonly) UIEmotionVerticalScrollView *verticalScrollView; +@property(nonatomic, strong) NSMutableArray *> *pagedEmotions; +@property(nonatomic, assign) BOOL debug; +@end + +@implementation QEmotionBoardView + +- (instancetype)initWithFrame:(CGRect)frame { + self = [super initWithFrame:frame]; + if (self) { + [self didInitializedWithFrame:frame]; + } + return self; +} + +- (instancetype)initWithCoder:(NSCoder *)aDecoder { + if (self = [super initWithCoder:aDecoder]) { + [self didInitializedWithFrame:CGRectZero]; + } + return self; +} + +- (void)didInitializedWithFrame:(CGRect)frame { + self.debug = NO; + + self.pagedEmotions = [[NSMutableArray alloc] init]; + + _verticalScrollView = [[UIEmotionVerticalScrollView alloc] init]; + if (@available(iOS 11, *)) { + self.verticalScrollView.contentInsetAdjustmentBehavior = UIScrollViewContentInsetAdjustmentNever; + } + _verticalScrollView.delegate = self; + [self addSubview:self.verticalScrollView]; + + _sendButton = [[UIButton alloc] init]; + [self.sendButton setTitle:@"发送" forState:UIControlStateNormal]; + [self.sendButton addTarget:self action:@selector(didSelectSendButton:) forControlEvents:UIControlEventTouchUpInside]; +// self.sendButton.contentEdgeInsets = UIEdgeInsetsMake(5, 17, 5, 17); + [self addSubview:self.sendButton]; + + _deleteButton = [[UIButton alloc] init]; + + NSBundle *bundle = [NSBundle bundleForClass:[self class]]; + [_deleteButton setImage:self.deleteButtonImage forState:UIControlStateNormal]; + [_deleteButton setBackgroundImage:[UIImage imageNamed:@"q_white_btn" inBundle:bundle compatibleWithTraitCollection:nil] forState:UIControlStateNormal]; + [_deleteButton addTarget:self action:@selector(didSelectDeleteButton:) forControlEvents:UIControlEventTouchUpInside]; +// _deleteButton.layer.cornerRadius = 6; +// _deleteButton.layer.masksToBounds = YES; + [self addSubview:_deleteButton]; + + + //输入条的上方添加一行细线 + UIView *lineView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, CGRectGetWidth(self.bounds), 1 / [UIScreen mainScreen].scale)]; + if (@available(iOS 11.0, *)) { + NSBundle *bundle = [NSBundle bundleForClass:[UIEmotionPageView class]]; + lineView.backgroundColor = [UIColor colorNamed:@"q_border223" inBundle:bundle compatibleWithTraitCollection:nil]; + } else { + lineView.backgroundColor = [UIColor colorWithRed:223/255.0f green:223/255.0f blue:223/255.0f alpha:1]; + } + [self addSubview:lineView]; + self.topLineView = lineView; +} + +- (void)setEmotions:(NSArray *)emotions { + _emotions = emotions; + [self setNeedsLayout]; +} + +- (void)layoutSubviews { + [super layoutSubviews]; + self.sendButton.frame = CGRectMake(CGRectGetWidth(self.frame) - self.sendButtonMargins.right - UISendButtonWidth, CGRectGetHeight(self.frame) - self.qmui_safeAreaInsets.bottom - self.sendButtonMargins.bottom - UISendButtonHeight, UISendButtonWidth, UISendButtonHeight); + + UIEdgeInsets paddingInPage = self.paddingInPage; + paddingInPage.bottom = self.paddingInPage.bottom + self.qmui_safeAreaInsets.bottom; + + CGRect verticalScrollViewFrame = UIEdgeInsetsInsetRect(self.bounds, UIEdgeInsetsZero); + self.verticalScrollView.frame = verticalScrollViewFrame; + [self.verticalScrollView setEmotions:self.emotions + emotionSize:self.emotionSize + minimumEmotionHorizontalSpacing:self.minimumEmotionHorizontalSpacing + emotionVerticalSpacing:self.emotionVerticalSpacing + emotionSelectedBackgroundExtension:self.emotionSelectedBackgroundExtension + paddingInPage:paddingInPage]; + self.verticalScrollView.pageView.delegate = self; + + static CGFloat spacingBetweenDeleteButtonAndSendButton = 10.0f; + + self.deleteButton.frame = CGRectMake(CGRectGetMinX(self.sendButton.frame) - spacingBetweenDeleteButtonAndSendButton - self.deleteButtonOffset.x - UISendButtonWidth, self.sendButton.frame.origin.y, UISendButtonWidth, UISendButtonHeight); + + self.topLineView.frame = CGRectMake(0, 0, CGRectGetWidth(self.bounds), 1 / [UIScreen mainScreen].scale); +} + + +- (void)adjustEmotionsAlpha { + CGFloat x = MIN(self.deleteButton.frame.origin.x, self.sendButton.frame.origin.x); + CGFloat y = MIN(self.deleteButton.frame.origin.y, self.sendButton.frame.origin.y); + CGFloat width = CGRectGetMaxX(self.sendButton.frame) - CGRectGetMinX(self.deleteButton.frame); + CGFloat height = MAX(CGRectGetMaxY(self.deleteButton.frame), CGRectGetMaxY(self.sendButton.frame)) - MIN(CGRectGetMinY(self.deleteButton.frame), CGRectGetMinY(self.sendButton.frame)); + CGRect buttonGruopRect = CGRectMake(x, y, width, height); + CGRect floatingRect = [self.verticalScrollView convertRect:buttonGruopRect fromView:self]; + [self.verticalScrollView adjustEmotionsAlphaWithFloatingRect:floatingRect]; +} + +- (UIEdgeInsets)qmui_safeAreaInsets { + if (@available(iOS 11.0, *)) { + return self.safeAreaInsets; + } + return UIEdgeInsetsZero; +} + +- (IBAction)didSelectDeleteButton:(UIButton *)sender +{ + if ([_delegate respondsToSelector:@selector(emotionViewDidSelectDeleteButton:)]){ + [_delegate emotionViewDidSelectDeleteButton:self]; + } +} + +- (IBAction)didSelectSendButton:(UIButton *)sender +{ + if ([_delegate respondsToSelector:@selector(emotionViewDidSelectSendButton:)]){ + [_delegate emotionViewDidSelectSendButton:self]; + } +} + +#pragma mark - UIAppearance Setter + +- (void)setSendButtonTitleAttributes:(NSDictionary *)sendButtonTitleAttributes { + _sendButtonTitleAttributes = sendButtonTitleAttributes; + [self.sendButton setAttributedTitle:[[NSAttributedString alloc] initWithString:[self.sendButton currentTitle] attributes:_sendButtonTitleAttributes] forState:UIControlStateNormal]; +} + +- (void)setSendButtonBackgroundColor:(UIColor *)sendButtonBackgroundColor { + _sendButtonBackgroundColor = sendButtonBackgroundColor; + self.sendButton.backgroundColor = _sendButtonBackgroundColor; +} + +- (void)setSendButtonCornerRadius:(CGFloat)sendButtonCornerRadius { + _sendButtonCornerRadius = sendButtonCornerRadius; + self.sendButton.layer.cornerRadius = _sendButtonCornerRadius; + self.sendButton.layer.masksToBounds = YES; +} + +- (void)setDeleteButtonBackgroundColor:(UIColor *)deleteButtonBackgroundColor { + _deleteButtonBackgroundColor = deleteButtonBackgroundColor; + self.deleteButton.backgroundColor = deleteButtonBackgroundColor; +} + +- (void)setDeleteButtonImage:(UIImage *)deleteButtonImage { + _deleteButtonImage = deleteButtonImage; + [self.deleteButton setImage:self.deleteButtonImage forState:UIControlStateNormal]; +} + +- (void)setDeleteButtonCornerRadius:(CGFloat)deleteButtonCornerRadius { + _deleteButtonCornerRadius = deleteButtonCornerRadius; + self.deleteButton.layer.cornerRadius = deleteButtonCornerRadius; + self.deleteButton.layer.masksToBounds = YES; +} + +#pragma mark - + +- (void)scrollViewDidScroll:(UIScrollView *)scrollView { + if (scrollView == self.verticalScrollView) { + [self adjustEmotionsAlpha]; + } +} + +#pragma mark - +- (void)emotionPageView:(UIEmotionPageView *)emotionPageView didSelectEmotion:(QEmotion *)emotion atIndex:(NSInteger)index { + //再回调给vc,之前QMUI官方demo里这里是用的block,为了兼容swift和代码清晰,我修改成了delegate + if ([self.delegate respondsToSelector:@selector(emotionView:didSelectEmotion:atIndex:)]){ + NSInteger index = [self.emotions indexOfObject:emotion]; + [self.delegate emotionView:self didSelectEmotion:emotion atIndex:index]; + } +} + +- (void)emotionPageViewDidLayoutEmotions:(UIEmotionPageView *)emotionPageView { + [self adjustEmotionsAlpha]; +} + +#pragma mark - Getter + +- (UIScrollView *)scrollView { + return self.verticalScrollView; +} + +@end + +@interface QEmotionBoardView (UIAppearance) + +@end + +@implementation QEmotionBoardView (UIAppearance) + ++ (void)initialize { + static dispatch_once_t onceToken; + dispatch_once(&onceToken, ^{ + [self setDefaultAppearance]; + }); +} + ++ (void)setDefaultAppearance { + + NSBundle *bundle = [NSBundle bundleForClass:[QEmotionBoardView class]]; + + QEmotionBoardView *appearance = [QEmotionBoardView appearance]; + appearance.backgroundColor = nil; + appearance.deleteButtonImage = [UIImage imageNamed:@"q_emotion_delete" inBundle:bundle compatibleWithTraitCollection:nil]; + appearance.paddingInPage = UIEdgeInsetsMake(18, 18, 65, 18); //65是滚到底部时候的一大片空白,微信也有 + appearance.emotionSize = CGSizeMake(34, 34); + appearance.minimumEmotionHorizontalSpacing = 16; + appearance.sendButtonTitleAttributes = @{NSFontAttributeName: [UIFont systemFontOfSize:17], NSForegroundColorAttributeName: [UIColor whiteColor]}; + appearance.sendButtonBackgroundColor = [UIColor colorWithRed:32/255.0 green:191/255.0 blue:100/255.0 alpha:1];; + appearance.sendButtonCornerRadius = 4; + appearance.sendButtonMargins = UIEdgeInsetsMake(0, 0, 18, 18);//要和上面的paddingInPage一致 + appearance.pageControlMarginBottom = 22; + appearance.deleteButtonCornerRadius = 4; + appearance.emotionVerticalSpacing = 16; + + UIPageControl *pageControlAppearance = [UIPageControl appearanceWhenContainedInInstancesOfClasses:@[[QEmotionBoardView class]]]; + pageControlAppearance.pageIndicatorTintColor = [UIColor colorWithRed:210/255.0 green:210/255.0 blue:210/255.0 alpha:1]; + pageControlAppearance.currentPageIndicatorTintColor = [UIColor colorWithRed:162/255.0 green:162/255.0 blue:162/255.0 alpha:1]; +} + +@end diff --git a/yinmeng-ios/yinmeng-ios/Base/UI/InputView/InputView/QEmotionHelper.h b/yinmeng-ios/yinmeng-ios/Base/UI/InputView/InputView/QEmotionHelper.h new file mode 100644 index 0000000..5d1ca39 --- /dev/null +++ b/yinmeng-ios/yinmeng-ios/Base/UI/InputView/InputView/QEmotionHelper.h @@ -0,0 +1,31 @@ +// +// FaceManager.h +// pinpin +// +// Created by DongJin on 15-7-15. +// Copyright (c) 2015年 ibluecollar. All rights reserved. +// + +#import +#import "QEmotionBoardView.h" +#import + +//表情转换类 +@interface QEmotionHelper : NSObject +{ + +} + ++ (QEmotionHelper *)sharedEmotionHelper; + +//显示表情键盘面板的时候,用这个。测试结果是占用0.5MB的内存(永驻) +@property (strong, nonatomic) NSArray *emotionArray; + +//imageKey:[微笑] font:label的Font,返回😊 +//把 @"[微笑]" 转为 @"😊" +- (NSAttributedString *)obtainAttributedStringByImageKey:(NSString *)imageKey font:(UIFont *)font useCache:(BOOL)useCache; + +//把 @"害~你好啊[微笑]" 转为 @"害~你好啊😊" +- (NSMutableAttributedString *)attributedStringByText:(NSString *)text font:(UIFont *)font; + +@end diff --git a/yinmeng-ios/yinmeng-ios/Base/UI/InputView/InputView/QEmotionHelper.m b/yinmeng-ios/yinmeng-ios/Base/UI/InputView/InputView/QEmotionHelper.m new file mode 100644 index 0000000..67c015b --- /dev/null +++ b/yinmeng-ios/yinmeng-ios/Base/UI/InputView/InputView/QEmotionHelper.m @@ -0,0 +1,171 @@ +// +// FaceManager.m +// pinpin +// +// Created by DongJin on 15-7-15. +// Copyright (c) 2015年 ibluecollar. All rights reserved. +// + +#import "QEmotionHelper.h" +#import "QEEmotionImageView.h" +#import + +@interface QEmotionHelper() + +//key是 图片名:比如:[微笑] ; value是😊(Image) +//把[微笑]转为😊的时候,用这个。//占用内存0.2M +@property (strong, nonatomic) NSDictionary *cacheTotalImageDictionary; + +//key是 图片名+font:比如:[微笑]17 ; value是😊(NSAttributedString) +//Tips:ios15用不到这个 +@property (strong, nonatomic) NSMutableDictionary *cacheAttributedDictionary; + +//把[微笑]转为😊的正则 +@property (strong, nonatomic) NSRegularExpression * regularExpression; + + +@end + +@implementation QEmotionHelper + ++ (QEmotionHelper *)sharedEmotionHelper { + static QEmotionHelper *_sharedFaceManager = nil; + static dispatch_once_t predUser; + dispatch_once(&predUser, ^{ + _sharedFaceManager = [[QEmotionHelper alloc] init]; + + _sharedFaceManager.regularExpression = + [NSRegularExpression regularExpressionWithPattern:@"\\[[a-zA-Z0-9\\u4e00-\\u9fa5]+\\]" + options:kNilOptions + error:nil]; + + _sharedFaceManager.cacheAttributedDictionary = [NSMutableDictionary dictionary]; + }); + return _sharedFaceManager; +} + +#pragma mark - public +//本方法我这里只是demo演示;实际开发中,可以改为你自己的获取表情列表的写法 +//由于emotionArray包含Image,测试结果是占用0.5MB的内存(永驻) +- (void)setEmotionArray:(NSArray *)emotionArray { + + _emotionArray = emotionArray; + + //重置Image字典 + _cacheTotalImageDictionary = nil; + [self cacheTotalImageDictionary]; +} + +//懒加载;key是 图片名:比如:[微笑] ; value是😊(Image) +- (NSDictionary *)cacheTotalImageDictionary { + if (!_cacheTotalImageDictionary) { + NSMutableDictionary *emotionImageDictionary = [[NSMutableDictionary alloc] init]; + for (QEmotion *e in _emotionArray) { + if (!e.image) { + //建议在外部AppDelegate里就设置好image,不建议走这里 + e.image = [UIImage imageNamed:e.identifier]; + } + [emotionImageDictionary setObject:e.image forKey:e.displayName]; + } + _cacheTotalImageDictionary = emotionImageDictionary; + } + return _cacheTotalImageDictionary; +} + +//把整段String:@"害~你好[微笑]" 转为 @"害~你好😊" +- (NSMutableAttributedString *)attributedStringByText:(NSString *)text font:(UIFont *)font { + + NSArray *emojis = [self.regularExpression matchesInString:text options:NSMatchingWithTransparentBounds range:NSMakeRange(0, [text length])]; + + NSMutableAttributedString *intactAttributeString = [[NSMutableAttributedString alloc] initWithString:text]; + + // 逆序遍历数组 + [emojis enumerateObjectsWithOptions:NSEnumerationReverse usingBlock:^(id _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) { + + NSTextCheckingResult *result = (NSTextCheckingResult *)obj; + + NSString *emojiKey = [text substringWithRange:result.range]; + + BOOL useCache = YES; + if (@available(iOS 15.0, *)) { + //在ios15上不可以用缓存的NSAttributedString,会只出现1个表情,在ios14以及之前是可以。 + //ios15他采用了NSTextAttachmentViewProvider,具体我没研究 + useCache = NO; + } + NSAttributedString *imageAttributedString = [self obtainAttributedStringByImageKey:emojiKey font:font useCache:useCache]; + if (imageAttributedString) { + [intactAttributeString replaceCharactersInRange:result.range withAttributedString:imageAttributedString]; + } + }]; + + // 修复由于插入AttributeString而导致font改变的问题;防止插入表情后textView的font变小 + [intactAttributeString addAttributes:@{NSFontAttributeName: font} range:NSMakeRange(0, intactAttributeString.length)]; + + return intactAttributeString; +} + +#pragma mark - public +//把只是单纯的一个表情转为AttributedString +//imageKey:[微笑] ,font:label的Font,返回😊 +//把 @"[微笑]" 转为 @"😊" +- (NSAttributedString *)obtainAttributedStringByImageKey:(NSString *)imageKey font:(UIFont *)font useCache:(BOOL)useCache { + + if (!useCache) { + //不从缓存中取AttributedString,(因为输入栏中的AttributedString如果是同一个对象,在ios12上会有长按bug) + UIImage *image = self.cacheTotalImageDictionary[imageKey]; + if (!image){ + //说明压根就没匹配上,比如:[随便打的字] + return nil; + } + QEEmotionImageView *imageView = [[QEEmotionImageView alloc] init]; + imageView.layer.masksToBounds = YES; + imageView.contentMode = UIViewContentModeScaleAspectFit; + imageView.displayText = imageKey; + imageView.image = image; + if (image) { + CGFloat scale = image.size.width / image.size.height; + imageView.bounds = CGRectMake(0, 0, 20 * scale, 20); + } else { + imageView.bounds = CGRectMake(0, 0, 20, 20); + } + imageView.bounds = CGRectMake(0, 0, font.lineHeight, font.lineHeight); + NSMutableAttributedString * attrString = [NSMutableAttributedString yy_attachmentStringWithContent:imageView contentMode:UIViewContentModeScaleAspectFit attachmentSize:CGSizeMake(imageView.bounds.size.width, imageView.bounds.size.height) alignToFont:[UIFont systemFontOfSize:15.0] alignment:YYTextVerticalAlignmentCenter]; + return attrString; + } + + + + //keyFont 是: [微笑]17 、[旺柴]17 + NSString *keyFont = [NSString stringWithFormat:@"%@%.1f", imageKey, font.pointSize]; + //在ios15上不可以用缓存的NSAttributedString,在ios14以及之前是可以 + NSAttributedString *result = _cacheAttributedDictionary[keyFont]; + if (result){ + //从缓存中取 + return result; + } + + UIImage *image = self.cacheTotalImageDictionary[imageKey]; + if (!image){ + //说明压根就没匹配上,比如:[随便打的字] + return nil; + } + QEEmotionImageView *imageView = [[QEEmotionImageView alloc] init]; + imageView.layer.masksToBounds = YES; + imageView.contentMode = UIViewContentModeScaleAspectFit; + imageView.displayText = imageKey; + imageView.image = image; + if (image) { + CGFloat scale = image.size.width / image.size.height; + imageView.bounds = CGRectMake(0, 0, 20 * scale, 20); + } else { + imageView.bounds = CGRectMake(0, 0, 20, 20); + } + imageView.bounds = CGRectMake(0, 0, font.lineHeight, font.lineHeight); + NSMutableAttributedString * attrString = [NSMutableAttributedString yy_attachmentStringWithContent:imageView contentMode:UIViewContentModeScaleAspectFit attachmentSize:CGSizeMake(imageView.bounds.size.width, imageView.bounds.size.height) alignToFont:[UIFont systemFontOfSize:15.0] alignment:YYTextVerticalAlignmentCenter]; + //[微笑]17 对应的NSAttributedString 缓存到Dictionary中 + [_cacheAttributedDictionary setObject:attrString forKey:keyFont]; + return result; +} + + +@end diff --git a/yinmeng-ios/yinmeng-ios/Base/UI/InputView/InputView/QExtendBoardView.h b/yinmeng-ios/yinmeng-ios/Base/UI/InputView/InputView/QExtendBoardView.h new file mode 100755 index 0000000..063b8b7 --- /dev/null +++ b/yinmeng-ios/yinmeng-ios/Base/UI/InputView/InputView/QExtendBoardView.h @@ -0,0 +1,67 @@ +// +// QExtendBoardView.h +// QKeyBoardDemo +// +// Created by QDong on 14-5-1. +// Copyright (c) 2021年 QDong QQ:285275534@qq.com. All rights reserved. +// + +#import + + +@interface QExtendBoardItemModel : NSObject + +/** + * Cell图片 + */ +@property (nonatomic, strong) UIImage *normalIconImage; + +/** + * Cell标题 + */ +@property (nonatomic, strong) NSString *title; + +/** + * 根据正常图片和标题初始化一个Model对象 + * + * @param normalIconImage 正常图片 + * @param title 标题 + * + * @return 返回一个Model对象 + */ +- (instancetype)initWithNormalIconImage:(UIImage *)normalIconImage + title:(NSString *)title; + +@end + + +@protocol QExtendBoardViewDelegate + +@optional +/** + * 点击拓展面板的cell + * + * @param shareMenuItem 被点击的第三方Model对象,可以在这里做一些特殊的定制 + * @param index 被点击的位置 + */ +- (void)didSelectExtendBoardItem:(QExtendBoardItemModel *)shareMenuItem atIndex:(NSInteger)index; + +@end + + +@interface QExtendBoardView : UIView + +//第三方功能Models +@property (nonatomic, strong) NSArray *extendBoardItems; + +@property (nonatomic, weak) id delegate; + +/** + * 根据数据源刷新第三方功能按钮的布局 + */ +- (void)reloadData; + + +- (void)reloadItemOfIndex:(int)index withNormalIconImage:(UIImage *)image withTitle:(NSString *)title ; + +@end diff --git a/yinmeng-ios/yinmeng-ios/Base/UI/InputView/InputView/QExtendBoardView.m b/yinmeng-ios/yinmeng-ios/Base/UI/InputView/InputView/QExtendBoardView.m new file mode 100755 index 0000000..28b6b71 --- /dev/null +++ b/yinmeng-ios/yinmeng-ios/Base/UI/InputView/InputView/QExtendBoardView.m @@ -0,0 +1,279 @@ +// +// QExtendBoardView.m +// QKeyBoardDemo +// +// Created by QDong on 14-5-1. +// Copyright (c) 2021年 QDong QQ:285275534@qq.com. All rights reserved. +// + +#import "QExtendBoardView.h" + +const int UIPageControlHeight = 56; + +const int UIMenuItemCellWidth = 80; + +const int UIMenuItemCellHeight = 90; + +const int UIPerColumItemCount = 2; + +@implementation QExtendBoardItemModel + +- (instancetype)initWithNormalIconImage:(UIImage *)normalIconImage + title:(NSString *)title { + self = [super init]; + if (self) { + self.normalIconImage = normalIconImage; + self.title = title; + } + return self; +} + +- (void)dealloc { + self.normalIconImage = nil; + self.title = nil; +} + +@end + +@interface QExtendBoardCollectionCell : UIView + +/** + * 第三方按钮 + */ +@property (nonatomic, weak) UIButton *extendItemButton; +/** + * 第三方按钮的标题 + */ +@property (nonatomic, weak) UILabel *extendItemTitleLabel; + +/** + * 配置默认控件的方法 + */ +- (void)setup; +@end + +@implementation QExtendBoardCollectionCell + +- (void)setup { + if (!_extendItemButton) { + UIButton *extendItemButton = [UIButton buttonWithType:UIButtonTypeCustom]; + extendItemButton.frame = CGRectMake(0, 0, UIMenuItemCellWidth, UIMenuItemCellWidth); + extendItemButton.backgroundColor = [UIColor clearColor]; + [self addSubview:extendItemButton]; + + self.extendItemButton = extendItemButton; + } + + if (!_extendItemTitleLabel) { + + UILabel *extendItemTitleLabel = [[UILabel alloc] initWithFrame:CGRectMake(0, CGRectGetMaxY(self.extendItemButton.frame), UIMenuItemCellWidth, 17)]; + extendItemTitleLabel.backgroundColor = [UIColor clearColor]; + if (@available(iOS 11.0, *)) { + NSBundle *bundle = [NSBundle bundleForClass:[self class]]; + extendItemTitleLabel.textColor = [UIColor colorNamed:@"q_text_black_gray" inBundle:bundle compatibleWithTraitCollection:nil]; + } else { + extendItemTitleLabel.textColor = [UIColor colorWithRed:91/255.0f green:91/255.0f blue:91/255.0f alpha:1]; + } + extendItemTitleLabel.font = [UIFont systemFontOfSize:15]; + extendItemTitleLabel.textAlignment = NSTextAlignmentCenter; + [self addSubview:extendItemTitleLabel]; + + self.extendItemTitleLabel = extendItemTitleLabel; + } +} + +- (void)awakeFromNib { + [self setup]; + [super awakeFromNib]; +} + +- (instancetype)initWithFrame:(CGRect)frame { + self = [super initWithFrame:frame]; + if (self) { + [self setup]; + } + return self; +} + +@end + +@interface QExtendBoardView () + +/** + * 这是背景滚动视图 + */ +@property (nonatomic, weak) UIScrollView *extendScrollView; + +/** + * 显示页码的视图 + */ +@property (nonatomic, weak) UIPageControl *extendPageControl; + +/** + * 第三方按钮点击的事件 + * + * @param sender 第三方按钮对象 + */ +- (void)extendItemButtonClicked:(UIButton *)sender; + +/** + * 配置默认控件 + */ +- (void)setup; + +@end + +@implementation QExtendBoardView + +- (void)extendItemButtonClicked:(UIButton *)sender { + if ([self.delegate respondsToSelector:@selector(didSelectExtendBoardItem:atIndex:)]) { + NSInteger index = sender.tag; + if (index < self.extendBoardItems.count) { + [self.delegate didSelectExtendBoardItem:[self.extendBoardItems objectAtIndex:index] atIndex:index]; + } + } +} + +- (void)reloadItemOfIndex:(int)index withNormalIconImage:(UIImage *)image withTitle:(NSString *)title { + if ([self.extendScrollView.subviews count] > index) { + QExtendBoardCollectionCell *extendItemView = self.extendScrollView.subviews[index]; + [extendItemView.extendItemButton setImage:image forState:UIControlStateNormal]; + extendItemView.extendItemTitleLabel.text = title; + } +} + +- (void)reloadData { + if (!_extendBoardItems.count) + return; + // 每行有4个 + int perRowItemCount = (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad) ? 10 : 4; + + [self.extendScrollView.subviews makeObjectsPerformSelector:@selector(removeFromSuperview)]; + + CGFloat paddingX = 10; + CGFloat paddingY = 10; + for (QExtendBoardItemModel *extendItem in self.extendBoardItems) { + NSInteger index = [self.extendBoardItems indexOfObject:extendItem]; + NSInteger page = index / (perRowItemCount * UIPerColumItemCount); + CGRect extendItemViewFrame = [self getFrameWithPerRowItemCount:perRowItemCount + perColumItemCount:UIPerColumItemCount + itemWidth:UIMenuItemCellWidth + itemHeight:UIMenuItemCellHeight + paddingX:paddingX + paddingY:paddingY + atIndex:index + onPage:page]; + QExtendBoardCollectionCell *extendItemView = [[QExtendBoardCollectionCell alloc] initWithFrame:extendItemViewFrame]; + + extendItemView.extendItemButton.tag = index; + [extendItemView.extendItemButton addTarget:self action:@selector(extendItemButtonClicked:) forControlEvents:UIControlEventTouchUpInside]; + [extendItemView.extendItemButton setImage:extendItem.normalIconImage forState:UIControlStateNormal]; + extendItemView.extendItemTitleLabel.text = extendItem.title; + + [self.extendScrollView addSubview:extendItemView]; + } + + self.extendPageControl.numberOfPages = (self.extendBoardItems.count / (perRowItemCount * 2) + (self.extendBoardItems.count % (perRowItemCount * 2) ? 1 : 0)); + [self.extendScrollView setContentSize:CGSizeMake(((self.extendBoardItems.count / (perRowItemCount * 2) + (self.extendBoardItems.count % (perRowItemCount * 2) ? 1 : 0)) * CGRectGetWidth(self.bounds)), CGRectGetHeight(self.extendScrollView.bounds))]; +} + +/** + * 通过目标的参数,获取一个grid布局 + * + * @param perRowItemCount 每行有多少列 + * @param perColumItemCount 每列有多少行 + * @param itemWidth gridItem的宽度 + * @param itemHeight gridItem的高度 + * @param paddingX gridItem之间的X轴间隔 + * @param paddingY gridItem之间的Y轴间隔 + * @param index 某个gridItem所在的index序号 + * @param page 某个gridItem所在的页码 + * + * @return 返回一个已经处理好的gridItem frame + */ +- (CGRect)getFrameWithPerRowItemCount:(NSInteger)perRowItemCount + perColumItemCount:(NSInteger)perColumItemCount + itemWidth:(CGFloat)itemWidth + itemHeight:(NSInteger)itemHeight + paddingX:(CGFloat)paddingX + paddingY:(CGFloat)paddingY + atIndex:(NSInteger)index + onPage:(NSInteger)page { + CGRect itemFrame = CGRectMake((index % perRowItemCount) * (itemWidth + paddingX) + paddingX + (page * CGRectGetWidth(self.bounds)), ((index / perRowItemCount) - perColumItemCount * page) * (itemHeight + paddingY) + paddingY, itemWidth, itemHeight); + return itemFrame; +} + +#pragma mark - Life cycle + +- (void)setup { + + if (!_extendScrollView) { + UIScrollView *extendScrollView = [[UIScrollView alloc] initWithFrame:CGRectMake(0, 0, CGRectGetWidth(self.bounds), CGRectGetHeight(self.bounds) - UIPageControlHeight)]; + extendScrollView.delegate = self; + extendScrollView.canCancelContentTouches = NO; + extendScrollView.delaysContentTouches = YES; + extendScrollView.backgroundColor = self.backgroundColor; + extendScrollView.showsHorizontalScrollIndicator = NO; + extendScrollView.showsVerticalScrollIndicator = NO; + [extendScrollView setScrollsToTop:NO]; + extendScrollView.pagingEnabled = YES; + [self addSubview:extendScrollView]; + + self.extendScrollView = extendScrollView; + } + + if (!_extendPageControl) { + UIPageControl *extendPageControl = [[UIPageControl alloc] initWithFrame:CGRectMake(0, CGRectGetMaxY(self.extendScrollView.frame), CGRectGetWidth(self.bounds), UIPageControlHeight)]; + extendPageControl.backgroundColor = self.backgroundColor; + extendPageControl.hidesForSinglePage = YES; + extendPageControl.defersCurrentPageDisplay = YES; + [self addSubview:extendPageControl]; + + self.extendPageControl = extendPageControl; + } +} + +- (void)layoutSubviews { + [super layoutSubviews]; + self.extendScrollView.frame = CGRectMake(0, 0, CGRectGetWidth(self.bounds), CGRectGetHeight(self.bounds) - UIPageControlHeight); + self.extendPageControl.frame = CGRectMake(0, CGRectGetMaxY(self.extendScrollView.frame), CGRectGetWidth(self.bounds), UIPageControlHeight); +} + +- (void)awakeFromNib { + [self setup]; + [super awakeFromNib]; +} + +- (id)initWithFrame:(CGRect)frame { + self = [super initWithFrame:frame]; + if (self) { + // Initialization code + [self setup]; + } + return self; +} + +- (void)dealloc { + self.extendBoardItems = nil; +// self.extendScrollView.delegate = self; + self.extendScrollView = nil; + self.extendPageControl = nil; +} + +- (void)willMoveToSuperview:(UIView *)newSuperview { + if (newSuperview) { + [self reloadData]; + } +} + +#pragma mark - UIScrollView delegate + +- (void)scrollViewDidEndDecelerating:(UIScrollView *)scrollView { + //每页宽度 + CGFloat pageWidth = scrollView.frame.size.width; + //根据当前的坐标与页宽计算当前页码 + NSInteger currentPage = floor((scrollView.contentOffset.x - pageWidth/2)/pageWidth)+1; + [self.extendPageControl setCurrentPage:currentPage]; +} + +@end diff --git a/yinmeng-ios/yinmeng-ios/Base/UI/InputView/InputView/QInputBarView.h b/yinmeng-ios/yinmeng-ios/Base/UI/InputView/InputView/QInputBarView.h new file mode 100755 index 0000000..335c284 --- /dev/null +++ b/yinmeng-ios/yinmeng-ios/Base/UI/InputView/InputView/QInputBarView.h @@ -0,0 +1,102 @@ +// +// QInputBarView.h +// QKeyBoardDemo +// +// Created by QDong on 14-4-24. +// Copyright (c) 2021年 QDong QQ:285275534@qq.com. All rights reserved. +// + +#import +#import "SZTextView.h" +#import "QInputBarViewConfiguration.h" + +//整个Bar的最小高度(即文字只有1行时候的高度) +extern const int UIInputBarViewMinHeight; + +@class QInputBarView; + +@protocol QInputBarViewDataSource +@optional + +//@return 输入条上的UITextView,返回你自定义的UITextView;如果不实现这个方法,本类会自己创建一个UITextView +- (UITextView *)textViewForInputBarView:(QInputBarView *)inputBarView; + +@end + +@protocol QInputBarViewDelegate + +@optional + + +// 输入框刚好开始编辑 +- (void)inputBarView:(QInputBarView *)inputBarView inputTextViewDidBeginEditing:(UITextView *)inputTextView; + +// 输入框将要开始编辑 +- (void)inputBarView:(QInputBarView *)inputBarView inputTextViewShouldBeginEditing:(UITextView *)inputTextView; + +// 输入框的高度发生了改变(因为输入了值) +- (void)inputBarView:(QInputBarView *)inputBarView inputTextView:(UITextView *)inputTextView heightDidChange:(CGFloat)changeValue becauseSendText:(BOOL)becauseSendText; + +/** + * 在发送文本和语音之间发送改变时,会触发这个回调函数 + */ +- (void)inputBarView:(QInputBarView *)inputBarView onVoiceSwitchButtonClick:(UIButton *)voiceSwitchButton; + +/** + * 点击了系统键盘的发送按钮 + * @param inputNormalText :"害~你好啊[微笑]" + */ +- (void)inputBarView:(QInputBarView *)inputBarView onKeyboardSendClick:(NSString *)inputNormalText; + +/** + * 点击+号按钮Action + */ +- (void)inputBarView:(QInputBarView *)inputBarView onExtendButtonClick:(UIButton *)extendSwitchButton; + +/** + * 发送第三方表情 + */ +- (void)inputBarView:(QInputBarView *)inputBarView onEmotionButtonClick:(UIButton *)emotionSwitchButton; + +@end + +//输入条View,不包含表情面板 +@interface QInputBarView : UIView + +@property (nonatomic, strong, readonly) SZTextView *inputTextView; + +@property (nonatomic, strong, readonly) UIButton *recordButton; + +@property (nonatomic, weak) id delegate; + +@property (nonatomic, weak) id dataSource; + +// 根据配置设置UI,本方法只需要调用一次 +- (void)setupWithConfiguration:(QInputBarViewConfiguration *)configuration; + + +// 让textView获取焦点 +- (void)textViewBecomeFirstResponder; + +// 让textView失去焦点 +- (void)textViewResignFirstResponder; + +// 获取textView的内容文本 +- (NSString *)textViewInputNormalText; + +// 给textView插入表情图片,比如😊 +- (void)insertEmotionAttributedString:(NSAttributedString *)emotionAttributedString; + +// 给textView插入表情的文本,比如[微笑] +- (void)insertEmotion:(NSString *)emotionKey; + +// textView删除表情 +// @return YES 表示刚才成功删除了一个表情; +// @return NO 表示刚才没删掉表情(于是本类就什么都不操作,由外部vc实现删除操作。这样做因为vc的自定义tv可能要实现文字块删除,比如 @人名) +- (BOOL)deleteEmotion; + +// 清除输入的文本,不建议你自己用inputTextView.text = nil来情况文本。因为那样的话如果输入栏的文字>1行,你调用tableView.reload再scrollToBottom会出现tableView滚动不流畅 +//之所以不流畅是因为tableView的scrollToBottom动画和onWholeInputViewHeightDidChange里的动画同时被调用 +- (NSTimeInterval)clearInputTextBySend; //@return 0:当前inputText只有一行;非0:动画时长 + +@end diff --git a/yinmeng-ios/yinmeng-ios/Base/UI/InputView/InputView/QInputBarView.m b/yinmeng-ios/yinmeng-ios/Base/UI/InputView/InputView/QInputBarView.m new file mode 100755 index 0000000..c08f0e6 --- /dev/null +++ b/yinmeng-ios/yinmeng-ios/Base/UI/InputView/InputView/QInputBarView.m @@ -0,0 +1,478 @@ +// +// QInputBarView.m +// QKeyBoardDemo +// +// Created by QDong on 2021-8-3. +// Copyright (c) 2021年 QDong QQ:285275534@qq.com. All rights reserved. +// + +//整个Bar的最小高度(即文字只有1行时候的整条Bar的高度) +const int UIInputBarViewMinHeight = 58; + +//Bar里面的UITextView的最小高度(即文字只有1行时候的UITextView高度) +const int UIInputTextViewMinHeight = 42; + +//Bar里面的UITextView的最大高度(即文字有超多行时候的高度) +const int UIInputTextViewMaxHeight = 147; + +#import "QInputBarView.h" +#import "UITextView+QEmotion.h" + +//默认的输入bar,包含了:左侧的语音切换按钮,中间的textview和按住录音按钮,右侧的表情和拓展按钮,(总之,仿微信的输入条) +//上述按钮都可以设置隐藏,如果还是无法满足你的需求,请自定义UIView,参考TextFieldViewController +@interface QInputBarView () +{ +} +@property (nonatomic, strong) SZTextView *inputTextView; +@property (nonatomic, strong) UIButton *voiceSwitchButton; +@property (nonatomic, strong) UIButton *extendSwitchButton; +@property (nonatomic, strong) UIButton *emotionSwitchButton; +@property (nonatomic, strong) UIButton *recordButton; //按住不松录音的长条按钮 + +/// 输入栏TextView的高度发生变化的动画时长(秒) +@property (nonatomic, assign) NSTimeInterval inputBarHeightChangeAnimationDuration; // default is 0.2 + +/// 点击“发送”按钮时候会清空输入栏,进而导致TextView的高度变化的动画时长(秒) +@property (nonatomic, assign) NSTimeInterval inputBarHeightChangeAnimationWhenSendDuration; //0.1 + +// 点击键盘右下角的按钮是否是发送,NO表示普通回车换行,YES表示回调Delegate的Send方法 +@property (nonatomic, assign) BOOL keyboardSendEnabled; // default is YES + +//在切换语音和文本消息的时候,需要保存原本已经输入的文本 +@property (nonatomic, strong) NSString *inputedText; + +//记录旧的textView Heigth +@property (nonatomic, assign) CGFloat previousTextViewContentHeight; + +//刚才清空文本框是因为点击了”发送“按钮。加入这个全局变量是为了Delegate的heightDidChange方法可以回调特殊的返回值 +@property (nonatomic, assign) BOOL clearInputTextBySendSoon; + +@end + +@implementation QInputBarView + +#pragma mark - Init +- (void)awakeFromNib { + [super awakeFromNib]; +} + +- (void)setupWithConfiguration:(QInputBarViewConfiguration *)configuration +{ + self.keyboardSendEnabled = configuration.keyboardSendEnabled; + + const int UISwitchButtonWidth = 40; // 3个按钮固定宽高 + const int horizontalPadding = 6; // 水平间隔 + const CGFloat verticalPadding = (UIInputBarViewMinHeight - UISwitchButtonWidth )/2;// 垂直间隔 + CGFloat textViewFrameX = 0;// 输入框的frame.x + CGFloat rightViewsMinX = 0;// 输入框右边的按钮的minY,为了计算textView的宽度 + const CGFloat textViewHorizontalMargin = 8; //输入框的左右margin + CGFloat safeAreaInsetsLeft = 0; + CGFloat safeAreaInsetsRight = 0; + if (@available(iOS 11.0, *)) { + safeAreaInsetsLeft = UIApplication.sharedApplication.windows.firstObject.safeAreaInsets.left; + safeAreaInsetsRight = UIApplication.sharedApplication.windows.firstObject.safeAreaInsets.right; + } + + NSBundle *bundle = [NSBundle bundleForClass:[self class]]; + + // 允许发送语音 + if (!configuration.voiceButtonHidden) { + UIButton *button = [[UIButton alloc] initWithFrame:CGRectMake(0, 0, UISwitchButtonWidth, UISwitchButtonWidth)]; + [button setBackgroundImage:[UIImage imageNamed:@"q_chat_voice_black_normal" inBundle:bundle compatibleWithTraitCollection:nil] forState:UIControlStateNormal]; + [button setBackgroundImage:[UIImage imageNamed:@"q_chat_keyboard_black_normal" inBundle:bundle compatibleWithTraitCollection:nil] forState:UIControlStateSelected]; + [button addTarget:self action:@selector(onVoiceSwitchButtonClick:) forControlEvents:UIControlEventTouchUpInside]; + CGRect buttonFrame = button.frame; + buttonFrame.origin = CGPointMake(horizontalPadding + safeAreaInsetsLeft, verticalPadding); + button.frame = buttonFrame; + [self addSubview:button]; + self.voiceSwitchButton = button; + textViewFrameX = CGRectGetMaxX(button.frame); + } else { + //如果没有左边的语音按钮,输入条太贴左边了,+8提高一些marginLeft + textViewFrameX = safeAreaInsetsLeft + 8; + } + + //是否显示最右侧按钮(最右侧按钮可能是+,也可能是“发送”) + BOOL rightButtonShowed = NO; + + //右边是发送按钮 + if (configuration.rightSendButton) { + UIButton *button = configuration.rightSendButton; + button.autoresizingMask = UIViewAutoresizingFlexibleLeftMargin; + + CGRect buttonFrame = button.frame; + buttonFrame.origin = CGPointMake(CGRectGetWidth(self.bounds) - horizontalPadding - CGRectGetWidth(buttonFrame) - safeAreaInsetsRight, verticalPadding); + button.frame = buttonFrame; + [self addSubview:button]; + rightViewsMinX = CGRectGetMinX(buttonFrame); + rightButtonShowed = YES; + + } else if (!configuration.extendButtonHidden) { + // 允许发送多媒体消息。为什么不是先放表情按钮呢?因为布局的需要 + UIButton *button = [[UIButton alloc] initWithFrame:CGRectMake(0, 0, UISwitchButtonWidth, UISwitchButtonWidth)]; + button.autoresizingMask = UIViewAutoresizingFlexibleLeftMargin; + [button setBackgroundImage:[UIImage imageNamed:@"q_chat_extend_black_normal" inBundle:bundle compatibleWithTraitCollection:nil] forState:UIControlStateNormal]; + [button addTarget:self action:@selector(onExtendSwitchButtonClick:) forControlEvents:UIControlEventTouchUpInside]; + + CGRect buttonFrame = button.frame; + buttonFrame.origin = CGPointMake(CGRectGetWidth(self.bounds) - horizontalPadding - CGRectGetWidth(buttonFrame) - safeAreaInsetsRight, verticalPadding); + button.frame = buttonFrame; + [self addSubview:button]; + rightViewsMinX = CGRectGetMinX(buttonFrame); + self.extendSwitchButton = button; + rightButtonShowed = YES; + + } else { + rightViewsMinX = CGRectGetWidth(self.bounds) - safeAreaInsetsRight; + } + + // 允许发送表情 + if (!configuration.emotionButtonHidden) { + UIButton *button = [[UIButton alloc] initWithFrame:CGRectMake(0, 0, UISwitchButtonWidth, UISwitchButtonWidth)]; + button.autoresizingMask = UIViewAutoresizingFlexibleLeftMargin; + [button setBackgroundImage:[UIImage imageNamed:@"q_chat_emoji_black_normal" inBundle:bundle compatibleWithTraitCollection:nil] forState:UIControlStateNormal]; + [button setBackgroundImage:[UIImage imageNamed:@"q_chat_keyboard_black_normal" inBundle:bundle compatibleWithTraitCollection:nil] forState:UIControlStateSelected]; + [button addTarget:self action:@selector(onEmotionSwitchButtonClick:) forControlEvents:UIControlEventTouchUpInside]; + CGRect buttonFrame = button.frame; + if (rightButtonShowed) { + buttonFrame.origin = CGPointMake(rightViewsMinX - CGRectGetWidth(buttonFrame) - horizontalPadding, verticalPadding); + } else { + buttonFrame.origin = CGPointMake(CGRectGetWidth(self.bounds) - horizontalPadding - CGRectGetWidth(buttonFrame) - safeAreaInsetsRight, verticalPadding); + } + button.frame = buttonFrame; + [self addSubview:button]; + self.emotionSwitchButton = button; + + rightViewsMinX = CGRectGetMinX(buttonFrame); + } else { + //不显示表情按钮,rightViewsMinX已经在上面处理好了 + } + + // 输入框的宽度 + CGFloat textViewWidth = rightViewsMinX - textViewHorizontalMargin - textViewFrameX - textViewHorizontalMargin; + + // 初始化输入框 + UITextView *textView = nil; + if ([self.dataSource respondsToSelector:@selector(textViewForInputBarView:)]) { + //textView 是由vc实现的,本类只设置一下frame + textView = [self.dataSource textViewForInputBarView:self]; + } + + if (!textView){ + //vc没有提供UITextView,我们自己来实现 + textView = [[SZTextView alloc] initWithFrame:CGRectZero]; + textView.font = [UIFont systemFontOfSize:17.5]; + textView.returnKeyType = UIReturnKeySend; + textView.scrollsToTop = NO; + textView.textAlignment = NSTextAlignmentLeft; + textView.layer.cornerRadius = 6.0f; + //top, left, bottom, right + textView.textContainerInset = UIEdgeInsetsMake(10.0f, 8.0f, 10.0f, 8.0f); + //如果我设置了left边距,换行的时候,xcode会弹出提示:requesting caretRectForPosition: while the NSTextStorage has oustanding changes . 但是实际运行没任何影响 + //如果把left(第2、4个参数)设置为0,就不会有警告。原因不明 + + textView.enablesReturnKeyAutomatically = YES; // UITextView内部判断send按钮是否可以用 + } + //本类来控制tv的frame和delegate + textView.autoresizingMask = UIViewAutoresizingFlexibleWidth; + textView.delegate = self; + + //用kvo来监听输入文本的改变,进而改变tv高度和整个bar高度 + [textView addObserver:self forKeyPath:@"contentSize" options:NSKeyValueObservingOptionNew context:nil]; + [self addSubview:textView]; + textView.frame = CGRectMake(textViewFrameX + textViewHorizontalMargin, (UIInputBarViewMinHeight - UIInputTextViewMinHeight)/2, textViewWidth, UIInputTextViewMinHeight); + self.inputTextView = textView; + + //记录初始化时候的textview高度 + self.previousTextViewContentHeight = [self getTextViewContentHeight]; + + // 如果是可以发送语言的,那就需要一个按钮录音的按钮,事件可以在外部添加 + if (!configuration.voiceButtonHidden) { + UIButton *button = [[UIButton alloc] initWithFrame:self.inputTextView.frame]; + button.autoresizingMask = UIViewAutoresizingFlexibleWidth; + [button setBackgroundImage:[UIImage imageNamed:@"q_white_input_btn" inBundle:bundle compatibleWithTraitCollection:nil] forState:UIControlStateNormal]; + [button setBackgroundImage:[UIImage imageNamed:@"q_white_input_press_btn" inBundle:bundle compatibleWithTraitCollection:nil] forState:UIControlStateHighlighted]; + [button setTitle:configuration.speakButtonTitle?:@"按住说话" forState:UIControlStateNormal]; + button.alpha = self.voiceSwitchButton.selected; + [self addSubview:button]; + self.recordButton = button; + } + + //各种颜色 + self.backgroundColor = configuration.inputBarBackgroundColor; + _inputTextView.textColor = configuration.textColor; + _inputTextView.backgroundColor = configuration.textViewBackgroundColor; + [self.recordButton setTitleColor:configuration.recordButtonTitleColor forState:UIControlStateNormal]; + + //两个动画时长 + self.inputBarHeightChangeAnimationDuration = configuration.inputBarHeightChangeAnimationDuration == 0 ? 0.2 : configuration.inputBarHeightChangeAnimationDuration; + self.inputBarHeightChangeAnimationWhenSendDuration = 0.1; + + //输入条的上方添加一行细线 + UIView *topLineView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, CGRectGetWidth(self.bounds), 1 / [UIScreen mainScreen].scale)]; + topLineView.backgroundColor = configuration.inputBarBoardColor; + [self addSubview:topLineView]; +} + +#pragma mark - IBAction +// 左边语音\键盘切换按钮点击 +- (IBAction)onVoiceSwitchButtonClick:(UIButton *)sender +{ + sender.selected = !sender.selected; + self.emotionSwitchButton.selected = NO; + self.extendSwitchButton.selected = NO; + + if (sender.selected) { + self.inputedText = self.inputTextView.text; + self.inputTextView.text = nil; + [self.inputTextView resignFirstResponder]; + } else { + self.inputTextView.text = self.inputedText; + self.inputedText = nil; + [self.inputTextView becomeFirstResponder]; + } + + [UIView animateWithDuration:0.2 delay:0 options:UIViewAnimationOptionCurveEaseInOut animations:^{ + self.recordButton.alpha = sender.selected; + self.inputTextView.alpha = !sender.selected; + } completion:^(BOOL finished) { + + }]; + + if ([self.delegate respondsToSelector:@selector(inputBarView:onVoiceSwitchButtonClick:)]) { + [self.delegate inputBarView:self onVoiceSwitchButtonClick:sender]; + } +} + +// 右边表情\键盘切换按钮点击 +- (IBAction)onEmotionSwitchButtonClick:(UIButton *)sender +{ + sender.selected = !sender.selected; + self.voiceSwitchButton.selected = NO; + self.extendSwitchButton.selected = NO; + + if (!sender.selected) { + [UIView animateWithDuration:0.2 delay:0 options:UIViewAnimationOptionCurveEaseInOut animations:^{ + self.recordButton.alpha = sender.selected; + self.inputTextView.alpha = !sender.selected; + } completion:^(BOOL finished) { + + }]; + } else { + [UIView animateWithDuration:0.2 delay:0 options:UIViewAnimationOptionCurveEaseInOut animations:^{ + self.recordButton.alpha = !sender.selected; + self.inputTextView.alpha = sender.selected; + } completion:^(BOOL finished) { + + }]; + } + + if ([self.delegate respondsToSelector:@selector(inputBarView:onEmotionButtonClick:)]) { + [self.delegate inputBarView:self onEmotionButtonClick:sender]; + } +} + +// 右边表情\键盘切换按钮点击 +- (IBAction)onExtendSwitchButtonClick:(UIButton *)sender +{ + sender.selected = !sender.selected; + self.emotionSwitchButton.selected = NO; + if ([self.delegate respondsToSelector:@selector(inputBarView:onExtendButtonClick:)]) { + [self.delegate inputBarView:self onExtendButtonClick:sender]; + } +} + +#pragma mark - Public +- (void)resetTextViewHeightBy:(CGFloat)textViewHeightShouldChangeValue { + // 动态改变自身的高度和输入框的高度 + CGRect prevFrame = self.inputTextView.frame; + self.inputTextView.frame = CGRectMake(prevFrame.origin.x, + prevFrame.origin.y, + prevFrame.size.width, + prevFrame.size.height + textViewHeightShouldChangeValue); +} + +// 让textView获取焦点 +- (void)textViewBecomeFirstResponder { + [self.inputTextView becomeFirstResponder]; +} + +// 让textView失去焦点 +- (void)textViewResignFirstResponder { + [self.inputTextView resignFirstResponder]; +} + +// 获取textView的内容文本 +- (NSString *)textViewInputNormalText { + return [self.inputTextView normalText]; +} + +// 给textView插入表情图片,比如😊 +- (void)insertEmotionAttributedString:(NSAttributedString *)emotionAttributedString { + [self.inputTextView insertEmotionAttributedString: emotionAttributedString]; +} + +// 给textView插入表情的文本,比如[微笑] +- (void)insertEmotion:(NSString *)emotionKey { + [self.inputTextView insertEmotion: emotionKey]; +} + +// textView删除表情 +// @return YES 表示刚才成功删除了一个表情; +// @return NO 表示刚才没删掉表情(于是本类就什么都不操作,由外部vc实现删除操作。这样做因为vc的自定义tv可能要实现文字块删除,比如 @人名) +- (BOOL)deleteEmotion { + //点的是删除按钮,获得光标所在的位置 + return [self.inputTextView deleteEmotion]; +} + +// 清除输入的文本。不建议你自己用inputTextView.text = nil来情况文本。因为那样的话如果输入栏的文字>1行,你调用tableView.reload再scrollToBottom会出现tableView滚动不流畅 +//之所以不流畅是因为tableView的scrollToBottom动画和onWholeInputViewHeightDidChange里的动画同时被调用 +- (NSTimeInterval)clearInputTextBySend { + + //YES:当前inputText只有一行;NO:大于一行 + BOOL currentIsOneLine = self.inputTextView.frame.size.height == UIInputTextViewMinHeight; + + //临时改成yes,等回调了delegate要立刻设NO + self.clearInputTextBySendSoon = YES; + + //清空输入栏,如果当前输入栏里的文字行数>1会立即触发KVO + self.inputTextView.text = nil; + + //等走完KVO和KVO里的的delegate,再关掉 + self.clearInputTextBySendSoon = NO; + + //@return YES:当前inputText只有一行;NO:大于一行 + return currentIsOneLine ? 0 : _inputBarHeightChangeAnimationWhenSendDuration; +} + +#pragma mark - Private +/** + * 获取某个UITextView对象的content高度 + * @return 返回高度 + */ +- (CGFloat)getTextViewContentHeight +{ + return ceilf([_inputTextView sizeThatFits:_inputTextView.frame.size].height); +} + +#pragma mark - UITextViewDelegate +- (BOOL)textViewShouldBeginEditing:(UITextView *)textView { + if ([self.delegate respondsToSelector:@selector(inputBarView:inputTextViewShouldBeginEditing:)]) { + [self.delegate inputBarView:self inputTextViewShouldBeginEditing:self.inputTextView]; + } + self.emotionSwitchButton.selected = NO; + self.voiceSwitchButton.selected = NO; + self.extendSwitchButton.selected = NO; + return YES; +} + +- (void)textViewDidBeginEditing:(UITextView *)textView { + [textView becomeFirstResponder]; + if (!self.previousTextViewContentHeight) + self.previousTextViewContentHeight = [self getTextViewContentHeight]; + if ([self.delegate respondsToSelector:@selector(inputBarView:inputTextViewDidBeginEditing:)]) { + [self.delegate inputBarView:self inputTextViewDidBeginEditing:self.inputTextView]; + } +} + +- (void)textViewDidEndEditing:(UITextView *)textView { + [textView resignFirstResponder]; +} + +- (BOOL)textView:(UITextView *)textView shouldChangeTextInRange:(NSRange)range replacementText:(NSString *)text { + if (self.keyboardSendEnabled && [text isEqualToString:@"\n"]) { + if ([self.delegate respondsToSelector:@selector(inputBarView:onKeyboardSendClick:)]) { + [self.delegate inputBarView:self onKeyboardSendClick:[textView normalText]]; + } + return NO; + } + return YES; +} + +//只有在发生换行时候才会触发这里 +#pragma mark - Key-value Observing +- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context { + + if (object == _inputTextView && [keyPath isEqualToString:@"contentSize"]) { + //当输入的文本发生<折行>的时候会进入这里,这是ios系统判断的折行,<折行>包括新增文本导致的折行,也包括删除文本 + + UITextView *textView = (UITextView *)object; + CGFloat newContentHeight = [self getTextViewContentHeight]; + + //true表示tv行数减少了 + BOOL heightShouldShrink = newContentHeight < self.previousTextViewContentHeight; + + //由于内容的输入,tv应该发生高度的变化,这个值就是应该tv改变的高度差 + CGFloat textViewHeightShouldChangeValue = newContentHeight - _previousTextViewContentHeight; + + //要根据max和minheight重新计算一下高度变化差 + if (!heightShouldShrink && (self.previousTextViewContentHeight == UIInputTextViewMaxHeight || textView.text.length == 0)) { + textViewHeightShouldChangeValue = 0; + } else { + textViewHeightShouldChangeValue = MIN(textViewHeightShouldChangeValue, UIInputTextViewMaxHeight - self.previousTextViewContentHeight); + } + + if (textViewHeightShouldChangeValue != 0.0f) { + //textView的高度有所改变 + __weak QInputBarView *weakSelf = self; + [UIView animateWithDuration:_clearInputTextBySendSoon ? _inputBarHeightChangeAnimationWhenSendDuration : _inputBarHeightChangeAnimationDuration animations:^{ + + if (heightShouldShrink) { + // 如果需要缩放, 先改变tv的高度,再修改bar的高度 + [weakSelf resetTextViewHeightBy:textViewHeightShouldChangeValue]; + } + + //设置本bar的frame + CGRect inputViewFrame = weakSelf.frame; + weakSelf.frame = CGRectMake(inputViewFrame.origin.x, + inputViewFrame.origin.y - textViewHeightShouldChangeValue, + inputViewFrame.size.width, + inputViewFrame.size.height + textViewHeightShouldChangeValue); + + if (!heightShouldShrink) { + //为了兼容低版本ios系统,所以这句代码,不可以跟上面的合并 + [weakSelf resetTextViewHeightBy:textViewHeightShouldChangeValue]; + } + + //回调给QKeyboardManager + if ([self.delegate respondsToSelector:@selector(inputBarView:inputTextView:heightDidChange:becauseSendText:)]) { + [self.delegate inputBarView:self inputTextView:self.inputView heightDidChange:textViewHeightShouldChangeValue becauseSendText:self.clearInputTextBySendSoon]; + } + + } completion:^(BOOL finished) { + }]; + + self.previousTextViewContentHeight = MIN(newContentHeight, UIInputTextViewMaxHeight); + } + + //这一句可以不写,为了保险还是写了 + self.clearInputTextBySendSoon = NO; + + // 达到最大高度的时候(无论textView的高度是否有所改变),要更新tv的ContentOffset,让他滚起来 + if (self.previousTextViewContentHeight == UIInputTextViewMaxHeight) { + double delayInSeconds = 0.01; + dispatch_time_t popTime = dispatch_time(DISPATCH_TIME_NOW, (int64_t)(delayInSeconds * NSEC_PER_SEC)); + dispatch_after(popTime, dispatch_get_main_queue(), + ^(void) { + CGPoint bottomOffset = CGPointMake(0.0f, newContentHeight - textView.bounds.size.height); + [textView setContentOffset:bottomOffset animated:YES]; + }); + } + } +} + + +- (void)dealloc { + _inputedText = nil; + [_inputTextView removeObserver:self forKeyPath:@"contentSize"]; + _inputTextView.delegate = nil; + _inputTextView = nil; + + _voiceSwitchButton = nil; + _extendSwitchButton = nil; + _emotionSwitchButton = nil; + _recordButton = nil; +} + + +@end diff --git a/yinmeng-ios/yinmeng-ios/Base/UI/InputView/InputView/QInputBarViewConfiguration.h b/yinmeng-ios/yinmeng-ios/Base/UI/InputView/InputView/QInputBarViewConfiguration.h new file mode 100644 index 0000000..3f390cb --- /dev/null +++ b/yinmeng-ios/yinmeng-ios/Base/UI/InputView/InputView/QInputBarViewConfiguration.h @@ -0,0 +1,52 @@ +// +// QInputBarViewConfiguration.h +// QKeyBoardDemo +// +// Created by QDong on 2021-8-3. +// Copyright (c) 2021年 QDong QQ:285275534@qq.com. All rights reserved. +// + +#import + +@interface QInputBarViewConfiguration : NSObject + +- (instancetype)init NS_UNAVAILABLE; + + +/** + 默认相册配置 + */ ++ (instancetype)defaultInputBarViewConfiguration; + + +@property (nonatomic, strong) UIColor *inputBarBackgroundColor;//输入条颜色,默认仿微信的灰色 + +@property (nonatomic, strong) UIColor *inputBarBoardColor;//输入条上方的的那一条细横线的颜色 + +@property (nonatomic, strong) UIColor *textColor;//输入栏textview的颜色 + +@property (nonatomic, strong) UIColor *textViewBackgroundColor;//输入栏textview的背景颜色,默认白色 + +@property (nonatomic, strong) UIColor *recordButtonTitleColor;//按住说话按钮的字体颜色 + +@property (nonatomic, strong) UIButton *rightSendButton;//如果不为nil,那么替换掉右边的"+"按钮 //default is nil + +//语音条上的title,当voiceButtonHidden为No时候才有效 +@property (nonatomic, strong) NSString *speakButtonTitle;//default is nil。nil就显示@"按住说话" + +/// 是否隐藏发送语音 +@property (nonatomic, assign) BOOL voiceButtonHidden; // default is NO + +/// 是否隐藏发送多媒体 +@property (nonatomic, assign) BOOL extendButtonHidden; // default is NO + +/// 是否隐藏发送表情 +@property (nonatomic, assign) BOOL emotionButtonHidden; // default is NO + +/// 点击键盘右下角的按钮是否是发送,NO表示普通回车换行,YES表示回调Delegate的Send方法 +@property (nonatomic, assign) BOOL keyboardSendEnabled; // default is YES + +/// 输入栏TextView的高度发送变化的动画时长(秒) +@property (nonatomic, assign) NSTimeInterval inputBarHeightChangeAnimationDuration; // default is 0.2 + +@end diff --git a/yinmeng-ios/yinmeng-ios/Base/UI/InputView/InputView/QInputBarViewConfiguration.m b/yinmeng-ios/yinmeng-ios/Base/UI/InputView/InputView/QInputBarViewConfiguration.m new file mode 100644 index 0000000..e28b137 --- /dev/null +++ b/yinmeng-ios/yinmeng-ios/Base/UI/InputView/InputView/QInputBarViewConfiguration.m @@ -0,0 +1,41 @@ +// +// QKeyboardConfiguration.m +// QKeyBoardDemo +// +// Created by QDong on 2021-8-3. +// Copyright (c) 2021年 QDong QQ:285275534@qq.com. All rights reserved. +// + +#import "QInputBarViewConfiguration.h" + +@implementation QInputBarViewConfiguration + ++ (instancetype)defaultInputBarViewConfiguration +{ + QInputBarViewConfiguration *configuration = [QInputBarViewConfiguration new]; + +// if (@available(iOS 11.0, *)) { +// NSBundle *bundle = [NSBundle bundleForClass:[QInputBarViewConfiguration class]]; +//// configuration.inputBarBackgroundColor = [UIColor colorNamed:@"q_input_gray_bg" inBundle:bundle compatibleWithTraitCollection:nil]; +// configuration.inputBarBoardColor = [UIColor colorNamed:@"q_border223" inBundle:bundle compatibleWithTraitCollection:nil]; +//// configuration.textColor = [UIColor colorNamed:@"q_black_gray" inBundle:bundle compatibleWithTraitCollection:nil]; +// configuration.textViewBackgroundColor = [UIColor colorNamed:@"q_input" inBundle:bundle compatibleWithTraitCollection:nil]; +// configuration.recordButtonTitleColor = [UIColor colorNamed:@"q_black_white" inBundle:bundle compatibleWithTraitCollection:nil]; +// } else { +// +// +// } + configuration.inputBarBoardColor = [UIColor clearColor]; + configuration.textColor = [UIColor blackColor]; + configuration.recordButtonTitleColor = [UIColor darkGrayColor]; + configuration.inputBarBackgroundColor = [UIColor colorWithRed:242/255.0f green:242/255.0f blue:242/255.0f alpha:1]; + configuration.textViewBackgroundColor = [UIColor whiteColor]; + configuration.inputBarHeightChangeAnimationDuration = 0.2; + configuration.keyboardSendEnabled = YES; + configuration.inputBarHeightChangeAnimationDuration = 0.2; + configuration.keyboardSendEnabled = YES; + + return configuration; +} + +@end diff --git a/yinmeng-ios/yinmeng-ios/Base/UI/InputView/InputView/QKeyboardBaseManager.h b/yinmeng-ios/yinmeng-ios/Base/UI/InputView/InputView/QKeyboardBaseManager.h new file mode 100755 index 0000000..a6b3860 --- /dev/null +++ b/yinmeng-ios/yinmeng-ios/Base/UI/InputView/InputView/QKeyboardBaseManager.h @@ -0,0 +1,21 @@ +// +// QKeyboardBaseManager.h +// QKeyBoardDemo +// +// Created by QDong on 2021-8-3. +// Copyright (c) 2021年 QDong QQ:285275534@qq.com. All rights reserved. +// + +#import +#import "QInputBarViewConfiguration.h" + +@interface QKeyboardBaseManager : NSObject + +- (instancetype)initWithViewController:(UIViewController *)viewController; + +@property (nonatomic, weak) UIViewController *viewController;//当前vc + +// 输入栏TextView的高度发送变化的动画时长(秒) +@property (nonatomic, assign) NSTimeInterval inputBarHeightChangeAnimationDuration; // default is 0.2 + +@end diff --git a/yinmeng-ios/yinmeng-ios/Base/UI/InputView/InputView/QKeyboardBaseManager.m b/yinmeng-ios/yinmeng-ios/Base/UI/InputView/InputView/QKeyboardBaseManager.m new file mode 100755 index 0000000..04b5100 --- /dev/null +++ b/yinmeng-ios/yinmeng-ios/Base/UI/InputView/InputView/QKeyboardBaseManager.m @@ -0,0 +1,102 @@ +// +// QKeyboardBaseManager.m +// QKeyBoardDemo +// +// Created by QDong on 2021-8-3. +// Copyright (c) 2021年 QDong QQ:285275534@qq.com. All rights reserved. +// + +#import "QKeyboardBaseManager.h" + +@interface QKeyboardBaseManager() + +@end + +@implementation QKeyboardBaseManager + +- (instancetype)initWithViewController:(UIViewController *)viewController { + self = [super init]; + if (self) { + self.viewController = viewController; + + // 键盘通知 + [[NSNotificationCenter defaultCenter] addObserver:self + selector:@selector(onKeyboardWillShowNotification:) + name:UIKeyboardWillShowNotification + object:nil]; + + [[NSNotificationCenter defaultCenter] addObserver:self + selector:@selector(onKeyboardWillHideNotification:) + name:UIKeyboardWillHideNotification + object:nil]; + + //经过DQ测试,ios13死活收不到UIKeyboardDidShowNotification,情况不明 + [[NSNotificationCenter defaultCenter] addObserver:self + selector:@selector(onKeyboardDidShowNotification:) + name:UIKeyboardDidShowNotification + object:nil]; + + [[NSNotificationCenter defaultCenter] addObserver:self + selector:@selector(onKeyboardDidHideNotification:) + name:UIKeyboardDidHideNotification + object:nil]; + + // 输入栏TextView的高度发送变化的动画时长(秒) + self.inputBarHeightChangeAnimationDuration = 0.2; + } + return self; +} + +#pragma mark - Keyboard notifications +- (void)onKeyboardDidShowNotification:(NSNotification *)notification { + +} + +- (void)onKeyboardDidHideNotification:(NSNotification *)notification { + +} + +//在模拟器上测试:如果模拟器的键盘无法弹出,那么点击输入栏不会收到WillShowNotification,而是直接收到WillHideNotification,但是这种情况下依然会走textViewShouldBeginEditing +- (void)onKeyboardWillShowNotification:(NSNotification *)notification { + CGRect keyboardRect = [[notification.userInfo objectForKey:UIKeyboardFrameEndUserInfoKey] CGRectValue]; + UIViewAnimationCurve curve = [[notification.userInfo objectForKey:UIKeyboardAnimationCurveUserInfoKey] integerValue]; + double duration = [[notification.userInfo objectForKey:UIKeyboardAnimationDurationUserInfoKey] doubleValue]; + [self onKeyboardWillShowOrHideByNotifications:keyboardRect animationOptions:[self animationOptionsForCurve:curve] duration:duration showKeyboard:YES]; +} + +- (void)onKeyboardWillHideNotification:(NSNotification *)notification { + CGRect keyboardRect = [[notification.userInfo objectForKey:UIKeyboardFrameEndUserInfoKey] CGRectValue]; + UIViewAnimationCurve curve = [[notification.userInfo objectForKey:UIKeyboardAnimationCurveUserInfoKey] integerValue]; + double duration = [[notification.userInfo objectForKey:UIKeyboardAnimationDurationUserInfoKey] doubleValue]; + [self onKeyboardWillShowOrHideByNotifications:keyboardRect animationOptions:[self animationOptionsForCurve:curve] duration:duration showKeyboard:NO]; +} + +#pragma mark - Need Override +- (void)onKeyboardWillShowOrHideByNotifications:(CGRect)keyboardRect animationOptions:(UIViewAnimationOptions)animationOptions duration:(double)duration showKeyboard:(BOOL)showKeyboard { +} + +- (UIViewAnimationOptions)animationOptionsForCurve:(UIViewAnimationCurve)curve { + switch (curve) { + case UIViewAnimationCurveEaseInOut: + return UIViewAnimationOptionCurveEaseInOut; + + case UIViewAnimationCurveEaseIn: + return UIViewAnimationOptionCurveEaseIn; + + case UIViewAnimationCurveEaseOut: + return UIViewAnimationOptionCurveEaseOut; + + case UIViewAnimationCurveLinear: + return UIViewAnimationOptionCurveLinear; + + default: + return kNilOptions; + } +} + + +- (void)dealloc { + [[NSNotificationCenter defaultCenter] removeObserver:self]; +} + +@end diff --git a/yinmeng-ios/yinmeng-ios/Base/UI/InputView/InputView/QKeyboardManager.h b/yinmeng-ios/yinmeng-ios/Base/UI/InputView/InputView/QKeyboardManager.h new file mode 100755 index 0000000..185ba81 --- /dev/null +++ b/yinmeng-ios/yinmeng-ios/Base/UI/InputView/InputView/QKeyboardManager.h @@ -0,0 +1,81 @@ +// +// QKeyboardBaseManager.h +// QKeyboardQKeyboard +// +// Created by QDong on 2021-8-3. +// Copyright (c) 2021年 QDong QQ:285275534@qq.com. All rights reserved. +// + +#import "QKeyboardBaseManager.h" + +@class QKeyboardManager; + +@protocol InputBoardDataSource +@optional + +//@return 点加号按钮弹出的拓展面板View,且无需设置frame +- (UIView *)keyboardManagerExtendBoardView:(QKeyboardManager *)keyboardManager; + +//@return 点表情按钮弹出的表情面板View,且无需设置frame +- (UIView *)keyboardManagerEmotionBoardView:(QKeyboardManager *)keyboardManager; + +//@return 点加号按钮弹出的拓展面板View的高度 +- (CGFloat)keyboardManagerExtendBoardHeight:(QKeyboardManager *)keyboardManager; + +//@return 点表情按钮弹出的表情面板View的高度 +- (CGFloat)keyboardManagerEmotionBoardHeight:(QKeyboardManager *)keyboardManager; + +@end + +//整个”输入View“的高度发生变化的原因(整个输入View包含bar和表情栏或者键盘) +typedef NS_ENUM(NSUInteger, WholeInputViewHeightDidChangeReason) { + WholeInputViewHeightDidChangeReasonWillAddToSuperView = 0, //因为输入条被add到vc中 + WholeInputViewHeightDidChangeReasonTextDidChange,//因为文本框输入的内容高度发生变化 + WholeInputViewHeightDidChangeReasonTextDidSend,//因为点“发送”按钮所以清空了文本框 2022-03-24与上面那条区分开 + WholeInputViewHeightDidChangeReasonBoardDidShow,//显示了 软键盘or面板(表情面板或者拓展面板) + WholeInputViewHeightDidChangeReasonBoardDidHide,//隐藏了 软键盘or面板(表情面板或者拓展面板) +}; + +@protocol InputBoardDelegate + +@optional + +//整个输入View的高度发生变化(整个View包含bar和表情栏或者键盘,但是不包含底部安全区高度) +//会触发这个的原因:1、addBottomInputBarView;2、输入文字换行了;3、切换面板;4、呼出键盘 +//Warning:这个回调方法的触发已经在animate中了,无需再在本方法里写animate +- (void)keyboardManager:(QKeyboardManager *)keyboardManager onWholeInputViewHeightDidChange:(CGFloat)wholeInputViewHeight reason:(WholeInputViewHeightDidChangeReason)reason; + +@end + +@interface QKeyboardManager : QKeyboardBaseManager + +@property (nonatomic, weak) id dataSource; + +@property (nonatomic, weak) id delegate; + +//viewController是否要走viewWillDisappear;为了解决:键盘弹出状态下vc侧滑返回,会触发Notification进而影响inputBarView.frame的bug +@property(nonatomic, assign) BOOL viewControllerWillDisappear; + +/** + * public - 添加底部输入框View + * @param belowViewController :YES表示输入框平时不显示(比如朋友圈);NO表示平时也显示(比如聊天) + */ +- (void)addBottomInputBarView:(UIView *)inputBarView belowViewController:(BOOL)belowViewController; + +// public - 为了方便动画切换,本Manager类需要拿到textview或textField的引用,如果有输入条,请传过来;没有输入条可以不调用该方法 +- (void)bindTextView:(UIResponder *)inputTextView; + +// public - 底部的输入框高度发生变化,becauseSendText: 是因为点击了“发送”按钮清空了文本进而导致了输入栏高度变化 +- (void)inputTextViewHeightDidChange:(BOOL)becauseSendText; + +// public - 隐藏所有面板,包括表情面板和拓展面板 +- (void)hideAllBoardView; + +// public - 表情面板和键盘之间的切换 +- (void)switchToEmotionBoardKeyboard; + +// public - 拓展面板和键盘之间的切换 +- (void)switchToExtendBoardKeyboard; + + +@end diff --git a/yinmeng-ios/yinmeng-ios/Base/UI/InputView/InputView/QKeyboardManager.m b/yinmeng-ios/yinmeng-ios/Base/UI/InputView/InputView/QKeyboardManager.m new file mode 100755 index 0000000..888d6df --- /dev/null +++ b/yinmeng-ios/yinmeng-ios/Base/UI/InputView/InputView/QKeyboardManager.m @@ -0,0 +1,364 @@ +// +// QKeyboardManager.m +// QKeyBoardDemo +// +// Created by QDong on 2021-8-3. +// Copyright (c) 2021年 QDong QQ:285275534@qq.com. All rights reserved. +// + +#import "QKeyboardManager.h" + +typedef NS_ENUM(NSUInteger, InputState) { + InputStateNormal = 0, //默认状态,没弹出键盘 也没弹出表情 也没弹出extend面板 + InputStateText,//弹出软键盘状态 + InputStateEmotion,//弹出表情状态 + InputStateExtend,//弹出extend面板状态 +}; + +@interface QKeyboardManager() + +//true:输入条平时是不显示出来的;false:输入条一直都在vc底部 +@property (nonatomic, assign) BOOL inputBarBelowViewController; + +//当前的输入状态 +@property (nonatomic, assign) InputState currentInputState; + +//输入条,由vc传过来,一般情况下,这个输入框是inputBar的子view,但是也可能不是(比如发微博界面) +@property (nonatomic, weak, nullable) UIResponder *inputTextView; + +//那一条输入框bar,由vc传过来,包含了左右的按钮 +@property (nonatomic, strong, nullable) UIView *inputBarView; + +@property (nonatomic, strong, nullable) UIView *emotionBoardView; + +@property (nonatomic, strong, nullable) UIView *extendBoardView; + +//iPhoneX底部距离 +@property (nonatomic, assign) float safeAreaInsetsBottom; + +//iPhoneX系列手机上,如果手指快速向上滑动tableView,那么会出现0.1秒的"可以透过inputBar和底部安全区中间看到背景tableView"。为了解决这个细小的问题,我加入了这个 +@property (nonatomic, strong, nullable) UIView *belowInputBarXView; + +@end + +@implementation QKeyboardManager + +#pragma mark - public 添加底部输入框View +- (void)addBottomInputBarView:(UIView *)inputBarView belowViewController:(BOOL)belowViewController { + + if (@available(iOS 11.0, *)) { + //如果是x,给底部的34pt添加上背景颜色,颜色和输入条一致 + _safeAreaInsetsBottom = UIApplication.sharedApplication.windows.firstObject.safeAreaInsets.bottom; + if (_safeAreaInsetsBottom > 0 && !belowViewController) { + //iPhoneX 且 聊天界面VC(即输入条固定在底部)就会进入这里 + //我添加了一个和输入条背景颜色一样的普通View在inputView的底部 + _belowInputBarXView = [[UIView alloc] initWithFrame:CGRectMake(0, self.viewController.view.frame.size.height - _safeAreaInsetsBottom , self.viewController.view.frame.size.width, _safeAreaInsetsBottom)]; + _belowInputBarXView.autoresizingMask = (UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleTopMargin); + _belowInputBarXView.backgroundColor = inputBarView.backgroundColor; + [self.viewController.view addSubview:_belowInputBarXView]; + [self.viewController.view bringSubviewToFront:_belowInputBarXView]; + } + } + + //注意这里,系统会自动调整inputBarView的y和width + inputBarView.autoresizingMask = (UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleTopMargin); + + // 工具条的frame + CGRect inputFrame = CGRectMake(0.0f,self.viewController.view.frame.size.height + (belowViewController ? 0 : (- inputBarView.frame.size.height - self.safeAreaInsetsBottom)), + self.viewController.view.frame.size.width, + inputBarView.frame.size.height); + + // vc创建的工具条,本类负责设置frame和addSubview + inputBarView.frame = inputFrame; + + [self.viewController.view addSubview:inputBarView]; + [self.viewController.view bringSubviewToFront:inputBarView]; + + //因为底部添加了输入条;回调给vc,让vc处理界面的tableview的frame + [self callBackWholeInputViewHeightDidChange:belowViewController ? 0 : inputBarView.frame.size.height reason:WholeInputViewHeightDidChangeReasonWillAddToSuperView]; + + self.inputBarView = inputBarView; + self.inputBarBelowViewController = belowViewController; +} + +//public - 由vc调用该方法,让本manager类拿到textView的引用 +- (void)bindTextView:(UIResponder *)inputTextView { + self.inputTextView = inputTextView; +} + +#pragma mark - DataSource - 由ViewController实现表情面板view和拓展面板view +- (UIView * _Nullable)extendBoardView { + if (!_extendBoardView) { + if ([self.dataSource respondsToSelector:@selector(keyboardManagerExtendBoardView:)]) { + _extendBoardView = [self.dataSource keyboardManagerExtendBoardView:self]; + CGFloat extendBoardHeight = 220;//默认高度 + if ([self.dataSource respondsToSelector:@selector(keyboardManagerExtendBoardHeight:)]) { + extendBoardHeight = [self.dataSource keyboardManagerExtendBoardHeight:self]; + } + _extendBoardView.frame = CGRectMake(0, CGRectGetHeight(self.viewController.view.bounds), CGRectGetWidth(self.viewController.view.bounds), extendBoardHeight); + _extendBoardView.alpha = 0.0; + [self.viewController.view addSubview:_extendBoardView]; + [self.viewController.view bringSubviewToFront:_extendBoardView]; + } + } + return _extendBoardView; +} + +- (UIView * _Nullable)emotionBoardView { + if (!_emotionBoardView) { + if ([self.dataSource respondsToSelector:@selector(keyboardManagerEmotionBoardView:)]) { + _emotionBoardView = [self.dataSource keyboardManagerEmotionBoardView:self]; + CGFloat emotionBoardHeight = 220;//默认高度 + if ([self.dataSource respondsToSelector:@selector(keyboardManagerEmotionBoardHeight:)]) { + emotionBoardHeight = [self.dataSource keyboardManagerEmotionBoardHeight:self]; + } + _emotionBoardView.frame = CGRectMake(0, CGRectGetHeight(self.viewController.view.bounds), CGRectGetWidth(self.viewController.view.bounds), emotionBoardHeight); + _emotionBoardView.alpha = 0.0; + [self.viewController.view addSubview:_emotionBoardView]; + [self.viewController.view bringSubviewToFront:_emotionBoardView]; + } + } + return _emotionBoardView; +} + +#pragma mark - Override Keyboard notifications +//Private 只有通过系统的键盘广播触发到这里 +- (void)onKeyboardWillShowOrHideByNotifications:(CGRect)keyboardRect animationOptions:(UIViewAnimationOptions)animationOptions duration:(double)duration showKeyboard:(BOOL)showKeyboard { + + if (![self.inputTextView isFirstResponder]) { + //本次弹出软键盘并不是因为我们的输入框,而是有别的输入框 + return; + } + + if (self.viewControllerWillDisappear) { + //为了解决:键盘弹出状态下vc侧滑返回,会触发Notification进而影响inputBarView.frame的bug + return; + } + + //马上要弹出键盘了,先看看当前的状态是哪个BoardView,一会要把它隐藏掉 + InputState previousInputState = self.currentInputState; + + if (showKeyboard) { + //马上要显示软键盘了,设置当前state为Text模式。 + self.currentInputState = InputStateText; + } + + //如果不做下面这个 if == InputStateText判断,会导致表情板(或拓展面板)和键盘切换时候inputbar会晃动 + //Q:为什么会抖动? + //A:软键盘切换到表情面板时:先调用hideKeyboardAndSwitchToCurrentBoardView方法去做动画,这时候State == InputStateEmotion。但是这时候由于软键盘收到了收起通知,也会进入到这里,这里也做了动画。两个动画冲突了 + //所以加上State == InputStateText,来确保弹出表情板时候不走下面的代码,进而让上述两个动画不会同时执行 + + //Q:为了避免上述抖动问题,为什么不换成if (showKeyboard)? + //A:因为如果是单纯的键盘收起其实还是要走下面的代码的;单纯的收起键盘时候showKeyboard为false,State为InputStateText + + if (self.currentInputState == InputStateText) { + + CGFloat keyboardY = [self.viewController.view convertRect:keyboardRect fromView:nil].origin.y; + + [UIView animateWithDuration:duration + delay:0.0 + options:animationOptions + animations:^{ + + [self layoutInputBarView:keyboardY boardAllHide:!showKeyboard]; + + if (showKeyboard){ + //键盘Notifition要willShow软键盘 + switch (previousInputState) { + case InputStateEmotion: { + [self switchEmotionBoardView:YES]; + break; + } + case InputStateExtend: { + [self switchExtendBoardView:YES]; + break; + } + default: + break; + } + } else { + //当前本来就已经是软键盘输入文本 && 是键盘Notifition要willHide软键盘 + //进入这里的可能性:1、软键盘上的“收起键盘”按钮,2、点击左边的语音按钮,3、vc调用了tv.resignFirstResponder。 而vc调用hideAll的时候,会被hideKeyboardAndSwitchToCurrentBoardView吸收掉,并不会进入这里 + self.currentInputState = InputStateNormal; + } + + //回调给ViewController + [self callBackWholeInputViewHeightDidChange:self.viewController.view.frame.size.height + - self.inputBarView.frame.origin.y - self.safeAreaInsetsBottom reason:showKeyboard ? WholeInputViewHeightDidChangeReasonBoardDidShow : WholeInputViewHeightDidChangeReasonBoardDidHide]; + + } completion:nil]; + } +} + + +#pragma mark - private +/** + * private 切换(或者隐藏)当前面板; --------->>>>>> 如果是切换,调用该方法前需要设置好currentInputState <<<<<<<----------- + * @param allBoardHide yes == 隐藏所有面板,no == 显示currentInputState对应的面板(但是前提是设置好state) + */ +- (void)hideKeyboardAndSwitchToCurrentBoardView:(BOOL)allBoardHide { + + if (allBoardHide && self.currentInputState == InputStateText) { + //隐藏所有面板 && 当前是软键盘,由vc调用->hideAllBoardView(YES)->进入这里 + + //Q:为什么要在这里就把state设置为Normal? + //A:因为下面的resignFirstResponder会触发系统Notifications -> 进入onKeyboardWillShowOrHideByNotifications方法 + // -> if (self.currentInputState == InputStateText) -> self.layoutInputBarView ; self.callBack; + // + // 但是本方法下面已经实现了self.layoutInputBarView ; self.callBack; + // 所以这里把state设置为Normal就是避免再重复走上述方法,上述方法只是处理软键盘上的“收起键盘”按钮 + self.currentInputState = InputStateNormal; + } + + //无论是显示某个面板,还是隐藏所有面板,都要先让输入框失去焦点,然后再进行切换动画 + [self.inputTextView resignFirstResponder]; + //初始化一下面板view。如果在下面的动画代码里才初始化,会导致从左上角飘移进入 + [self extendBoardView]; + [self emotionBoardView]; + + [UIView animateWithDuration:0.2 delay:0 options:UIViewAnimationOptionCurveEaseInOut animations:^{ + + CGRect currentBoardViewFrame = CGRectZero; + if (allBoardHide) { + //表示隐藏掉两个面板 + switch (self.currentInputState) { + case InputStateEmotion: { + currentBoardViewFrame = [self switchEmotionBoardView:allBoardHide]; + break; + } + case InputStateExtend: { + currentBoardViewFrame = [self switchExtendBoardView:allBoardHide]; + break; + } + default: + break; + } + } else { + //这里需要注意方法的执行顺序 + switch (self.currentInputState) { + case InputStateEmotion: { + // 1、先隐藏和自己无关的View + currentBoardViewFrame = [self switchExtendBoardView:!allBoardHide]; + // 2、再显示和自己相关的View + currentBoardViewFrame = [self switchEmotionBoardView:allBoardHide]; + break; + } + case InputStateExtend: { + // 1、先隐藏和自己无关的View + currentBoardViewFrame = [self switchEmotionBoardView:!allBoardHide]; + // 2、再显示和自己相关的View + currentBoardViewFrame = [self switchExtendBoardView:allBoardHide]; + break; + } + default: + break; + } + } + + //重设InputBarView的frame + [self layoutInputBarView:CGRectGetMinY(currentBoardViewFrame) boardAllHide:allBoardHide]; + + //回调给ViewController + [self callBackWholeInputViewHeightDidChange:self.viewController.view.frame.size.height + - self.inputBarView.frame.origin.y - self.safeAreaInsetsBottom reason:allBoardHide ? WholeInputViewHeightDidChangeReasonBoardDidHide : WholeInputViewHeightDidChangeReasonBoardDidShow]; + + } completion:^(BOOL finished) { + if (allBoardHide) { + self.currentInputState = InputStateNormal; + } + }]; +} + +/** + * private 显示(no)或者 隐藏(yes)表情面板 + * @return 表情面板的Frame + **/ +- (CGRect)switchEmotionBoardView:(BOOL)hide { + CGRect prevFrame = self.emotionBoardView.frame; + prevFrame.origin.y = (hide ? CGRectGetHeight(self.viewController.view.frame) : (CGRectGetHeight(self.viewController.view.frame) - CGRectGetHeight(prevFrame))); + self.emotionBoardView.alpha = !hide; + self.emotionBoardView.frame = prevFrame; + return prevFrame; +} + +/** + * private 显示(no)或者 隐藏(yes)拓展面板 + * @return 拓展面板的Frame + **/ +- (CGRect)switchExtendBoardView:(BOOL)hide { + CGRect prevFrame = self.extendBoardView.frame; + prevFrame.origin.y = (hide ? CGRectGetHeight(self.viewController.view.frame) : (CGRectGetHeight(self.viewController.view.frame) - CGRectGetHeight(prevFrame))); + self.extendBoardView.alpha = !hide; + self.extendBoardView.frame = prevFrame; + return prevFrame; +} + +/** + * private 依据当前面板切换,来决定输入条view的frame + * @param currentBoardViewMinY 当前面板的Frame的minY + * @param boardAllHide yes 表示所有面板都是隐藏的状态,no 但凡有一个面板没隐藏 + **/ +- (void)layoutInputBarView:(CGFloat)currentBoardViewMinY boardAllHide:(BOOL)boardAllHide { + CGRect prevInputViewFrame = self.inputBarView.frame; + if (boardAllHide) { + //隐藏掉两个面板 + CGFloat hidedFrameY = CGRectGetHeight(self.viewController.view.bounds); + if (!self.inputBarBelowViewController){ + hidedFrameY -= CGRectGetHeight(prevInputViewFrame); + hidedFrameY -= self.safeAreaInsetsBottom; + } + prevInputViewFrame.origin.y = hidedFrameY; + } else { + prevInputViewFrame.origin.y = currentBoardViewMinY - CGRectGetHeight(prevInputViewFrame); + } + self.inputBarView.frame = prevInputViewFrame; + + CGRect belowInputBarXViewFrame = self.belowInputBarXView.frame; + self.belowInputBarXView.frame = CGRectMake(belowInputBarXViewFrame.origin.x, CGRectGetMaxY(self.inputBarView.frame), belowInputBarXViewFrame.size.width, belowInputBarXViewFrame.size.height); +} + +//private +- (void)callBackWholeInputViewHeightDidChange:(CGFloat)wholeInputViewHeight reason:(WholeInputViewHeightDidChangeReason)reason { + if ([_delegate respondsToSelector:@selector(keyboardManager:onWholeInputViewHeightDidChange:reason:)]){ + [_delegate keyboardManager:self onWholeInputViewHeightDidChange:wholeInputViewHeight reason:reason]; + } +} + +#pragma mark - public +// public - 底部的输入框高度发生变化,changeValue 高度变化值 +- (void)inputTextViewHeightDidChange:(BOOL)becauseSendText { + //回调给ViewController + [self callBackWholeInputViewHeightDidChange: self.viewController.view.frame.size.height + - self.inputBarView.frame.origin.y - _safeAreaInsetsBottom reason: becauseSendText ? WholeInputViewHeightDidChangeReasonTextDidSend : WholeInputViewHeightDidChangeReasonTextDidChange]; +} + +// public - 隐藏所有面板,包括表情面板和拓展面板 和 软键盘 +- (void)hideAllBoardView { + if (self.currentInputState != InputStateNormal) { + //说明当前要么是键盘,要么是表情面板或者拓展面板 + [self hideKeyboardAndSwitchToCurrentBoardView:YES]; + } +} + +// public - 切换到表情面板,toEmotionBoardView +- (void)switchToEmotionBoardKeyboard { + //先设置全局变量State为表情State + self.currentInputState = InputStateEmotion; + + //NO表示是要显示当前面板(即InputStateEmotion) + [self hideKeyboardAndSwitchToCurrentBoardView:NO]; +} + +// public - 切换到拓展面板,toExtendBoardView +- (void)switchToExtendBoardKeyboard { + //先设置全局变量State为拓展State + self.currentInputState = InputStateExtend; + + //NO表示是要显示当前面板(即InputStateExtend) + [self hideKeyboardAndSwitchToCurrentBoardView: NO]; +} + +//顺便提一句:切换到软键盘是靠系统的[textView becomeFirstResponder]; 然后会触发键盘的Notification,然后就进入我上面封装的onKeyboardWillShowOrHideByNotifications方法 + + +@end diff --git a/yinmeng-ios/yinmeng-ios/Base/UI/InputView/InputView/UITextView+QEmotion.h b/yinmeng-ios/yinmeng-ios/Base/UI/InputView/InputView/UITextView+QEmotion.h new file mode 100644 index 0000000..4ec558c --- /dev/null +++ b/yinmeng-ios/yinmeng-ios/Base/UI/InputView/InputView/UITextView+QEmotion.h @@ -0,0 +1,31 @@ +// +// UITextView+QEmotion.h +// QKeyBoardDemo +// +// Created by QDong on 2021-8-3. +// Copyright (c) 2021年 QDong QQ:285275534@qq.com. All rights reserved. +// + + +#import + +NS_ASSUME_NONNULL_BEGIN + +@interface UITextView (QEmotion) + +// 给textView插入表情图片,比如😊 +- (void)insertEmotionAttributedString:(NSAttributedString *)emotionAttributedString; + +// 给textView插入表情的文本,比如[微笑] +- (void)insertEmotion:(NSString *)emotionKey; + +// textView删除表情 +// @return YES 表示刚才成功删除了一个表情; +// @return NO 表示刚才没删掉表情(于是本类就什么都不操作,由外部vc实现删除操作。这样做因为vc的自定义tv可能要实现文字块删除,比如 @人名) +- (BOOL)deleteEmotion; + +- (NSString *)normalText; + +@end + +NS_ASSUME_NONNULL_END diff --git a/yinmeng-ios/yinmeng-ios/Base/UI/InputView/InputView/UITextView+QEmotion.m b/yinmeng-ios/yinmeng-ios/Base/UI/InputView/InputView/UITextView+QEmotion.m new file mode 100644 index 0000000..12d2356 --- /dev/null +++ b/yinmeng-ios/yinmeng-ios/Base/UI/InputView/InputView/UITextView+QEmotion.m @@ -0,0 +1,100 @@ +// +// UITextView+QEmotion.h +// QKeyBoardDemo +// +// Created by QDong on 2021-8-3. +// Copyright (c) 2021年 QDong QQ:285275534@qq.com. All rights reserved. +// + +#import "UITextView+QEmotion.h" +#import "QEEmotionImageView.h" +#import "YYText.h" + +@implementation UITextView (QEmotion) + +// 给textView插入表情图片,比如😊 +- (void)insertEmotionAttributedString:(NSAttributedString *)emotionAttributedString { + if (!emotionAttributedString){ + return; + } + NSMutableAttributedString *content = self.attributedText.mutableCopy; + // 获得光标所在的位置 + int location = (int)self.selectedRange.location; + [content insertAttributedString:emotionAttributedString atIndex:location]; + // 修复由于插入AttributeString而导致font改变的问题;防止插入表情后textView的font变小 + [content addAttributes:@{NSFontAttributeName: self.font, NSForegroundColorAttributeName: self.textColor} range:NSMakeRange(location, emotionAttributedString.length)]; + + self.attributedText = content; + //重新设置光标位置 + NSRange range; + range.location = location + emotionAttributedString.length; + range.length = 0; + self.selectedRange = range; +} + +// 给textView插入表情的文本,比如[微笑] +- (void)insertEmotion:(NSString *)emotionKey { + NSMutableAttributedString *content = self.attributedText.mutableCopy; + // 获得光标所在的位置 + int location = (int)self.selectedRange.location; + [content insertAttributedString:[[NSAttributedString alloc] initWithString:emotionKey attributes:@{NSFontAttributeName:self.font,NSForegroundColorAttributeName:self.textColor}] atIndex:location]; + // 将调整后的字符串添加到UITextView上面 + self.attributedText = content; + //重新设置光标位置 + NSRange range; + range.location = location + emotionKey.length; + range.length = 0; + self.selectedRange = range; +} + +// textView删除表情 +// @return YES 表示刚才成功删除了一个表情; +// @return NO 表示刚才没删掉表情(于是本类就什么都不操作,由外部vc实现删除操作。这样做因为vc的自定义tv可能要实现文字块删除,比如 @人名) +- (BOOL)deleteEmotion { + //点的是删除按钮,获得光标所在的位置 + int location = (int)self.selectedRange.location; + if(location == 0){ + return NO; + } + // 先获取前半段 + NSString *headresult = [self.text substringToIndex:location]; + + if ([headresult hasSuffix:@"]"]) { + //最后一位是] + for (int i = (int)[headresult length]; i>=0 ; i--) { + //往前找,找到"[" + char tempString = [headresult characterAtIndex:(i-1)]; + if (tempString == '[') { + NSMutableAttributedString *content = self.attributedText.mutableCopy; + //砍掉[XXX],重新赋值前半段 + [content deleteCharactersInRange:NSMakeRange(i - 1,location - i + 1)]; + self.attributedText = content; + //重新设置光标位置 + NSRange range; + range.location = [headresult length]; + range.length = 0; + self.selectedRange = range; + return YES; + } + } + } + return NO; +} + +- (NSString *)normalText { + NSMutableString *normalMutableString = self.attributedText.string.mutableCopy; + CGSize maxSize = CGSizeMake(50, MAXFLOAT); + YYTextLayout * layout = [YYTextLayout layoutWithContainerSize:maxSize text:self.attributedText]; + for (int i = 0; i< layout.attachments.count; i++) { + YYTextAttachment * attachment = [layout.attachments objectAtIndex:i]; + if (!attachment || ![attachment.content isKindOfClass:[QEEmotionImageView class]]) continue; + QEEmotionImageView* imageView = attachment.content; + NSValue * value = [layout.attachmentRanges objectAtIndex:i]; + NSRange range = value.rangeValue; + if (!imageView.displayText) continue; + [normalMutableString replaceCharactersInRange:range withString:imageView.displayText]; + } + return normalMutableString; +} + +@end diff --git a/yinmeng-ios/yinmeng-ios/Base/UI/InputView/emoji.plist b/yinmeng-ios/yinmeng-ios/Base/UI/InputView/emoji.plist new file mode 100755 index 0000000..c3b5347 --- /dev/null +++ b/yinmeng-ios/yinmeng-ios/Base/UI/InputView/emoji.plist @@ -0,0 +1,1022 @@ + + + + + + data + + + file + emoji_01.png + id + emoticon_emoji_01 + tag + [可爱] + + + file + emoji_00.png + id + emoticon_emoji_0 + tag + [大笑] + + + file + emoji_02.png + id + emoticon_emoji_02 + tag + [色] + + + file + emoji_03.png + id + emoticon_emoji_03 + tag + [嘘] + + + file + emoji_04.png + id + emoticon_emoji_04 + tag + [亲] + + + file + emoji_05.png + id + emoticon_emoji_05 + tag + [呆] + + + file + emoji_06.png + id + emoticon_emoji_06 + tag + [口水] + + + file + emoji_145.png + id + emoticon_emoji_145 + tag + [汗] + + + file + emoji_07.png + id + emoticon_emoji_07 + tag + [呲牙] + + + file + emoji_08.png + id + emoticon_emoji_08 + tag + [鬼脸] + + + file + emoji_09.png + id + emoticon_emoji_09 + tag + [害羞] + + + file + emoji_10.png + id + emoticon_emoji_10 + tag + [偷笑] + + + file + emoji_11.png + id + emoticon_emoji_11 + tag + [调皮] + + + file + emoji_12.png + id + emoticon_emoji_12 + tag + [可怜] + + + file + emoji_13.png + id + emoticon_emoji_13 + tag + [敲] + + + file + emoji_14.png + id + emoticon_emoji_14 + tag + [惊讶] + + + file + emoji_15.png + id + emoticon_emoji_15 + tag + [流感] + + + file + emoji_16.png + id + emoticon_emoji_16 + tag + [委屈] + + + file + emoji_17.png + id + emoticon_emoji_17 + tag + [流泪] + + + file + emoji_18.png + id + emoticon_emoji_18 + tag + [嚎哭] + + + file + emoji_19.png + id + emoticon_emoji_19 + tag + [惊恐] + + + file + emoji_20.png + id + emoticon_emoji_20 + tag + [怒] + + + file + emoji_21.png + id + emoticon_emoji_21 + tag + [酷] + + + file + emoji_22.png + id + emoticon_emoji_22 + tag + [不说] + + + file + emoji_23.png + id + emoticon_emoji_23 + tag + [鄙视] + + + file + emoji_24.png + id + emoticon_emoji_24 + tag + [阿弥陀佛] + + + file + emoji_25.png + id + emoticon_emoji_25 + tag + [奸笑] + + + file + emoji_26.png + id + emoticon_emoji_26 + tag + [睡着] + + + file + emoji_27.png + id + emoticon_emoji_27 + tag + [口罩] + + + file + emoji_28.png + id + emoticon_emoji_28 + tag + [努力] + + + file + emoji_29.png + id + emoticon_emoji_29 + tag + [抠鼻孔] + + + file + emoji_30.png + id + emoticon_emoji_30 + tag + [疑问] + + + file + emoji_31.png + id + emoticon_emoji_31 + tag + [怒骂] + + + file + emoji_32.png + id + emoticon_emoji_32 + tag + [晕] + + + file + emoji_33.png + id + emoticon_emoji_33 + tag + [呕吐] + + + file + emoji_160.png + id + emoticon_emoji_160 + tag + [拜一拜] + + + file + emoji_161.png + id + emoticon_emoji_161 + tag + [惊喜] + + + file + emoji_162.png + id + emoticon_emoji_162 + tag + [流汗] + + + file + emoji_163.png + id + emoticon_emoji_163 + tag + [卖萌] + + + file + emoji_164.png + id + emoticon_emoji_164 + tag + [默契眨眼] + + + file + emoji_165.png + id + emoticon_emoji_165 + tag + [烧香拜佛] + + + file + emoji_166.png + id + emoticon_emoji_166 + tag + [晚安] + + + file + emoji_34.png + id + emoticon_emoji_34 + tag + [强] + + + file + emoji_35.png + id + emoticon_emoji_35 + tag + [弱] + + + file + emoji_36.png + id + emoticon_emoji_36 + tag + [OK] + + + file + emoji_37.png + id + emoticon_emoji_37 + tag + [拳头] + + + file + emoji_38.png + id + emoticon_emoji_38 + tag + [胜利] + + + file + emoji_39.png + id + emoticon_emoji_39 + tag + [鼓掌] + + + file + emoji_200.png + id + emoticon_emoji_200 + tag + [握手] + + + file + emoji_40.png + id + emoticon_emoji_40 + tag + [发怒] + + + file + emoji_41.png + id + emoticon_emoji_41 + tag + [骷髅] + + + file + emoji_42.png + id + emoticon_emoji_42 + tag + [便便] + + + file + emoji_43.png + id + emoticon_emoji_43 + tag + [火] + + + file + emoji_44.png + id + emoticon_emoji_44 + tag + [溜] + + + file + emoji_45.png + id + emoticon_emoji_45 + tag + [爱心] + + + file + emoji_46.png + id + emoticon_emoji_46 + tag + [心碎] + + + file + emoji_47.png + id + emoticon_emoji_47 + tag + [钟情] + + + file + emoji_48.png + id + emoticon_emoji_48 + tag + [唇] + + + file + emoji_49.png + id + emoticon_emoji_49 + tag + [戒指] + + + file + emoji_50.png + id + emoticon_emoji_50 + tag + [钻石] + + + file + emoji_51.png + id + emoticon_emoji_51 + tag + [太阳] + + + file + emoji_52.png + id + emoticon_emoji_52 + tag + [有时晴] + + + file + emoji_53.png + id + emoticon_emoji_53 + tag + [多云] + + + file + emoji_54.png + id + emoticon_emoji_54 + tag + [雷] + + + file + emoji_55.png + id + emoticon_emoji_55 + tag + [雨] + + + file + emoji_56.png + id + emoticon_emoji_56 + tag + [雪花] + + + file + emoji_57.png + id + emoticon_emoji_57 + tag + [爱人] + + + file + emoji_58.png + id + emoticon_emoji_58 + tag + [帽子] + + + file + emoji_59.png + id + emoticon_emoji_59 + tag + [皇冠] + + + file + emoji_60.png + id + emoticon_emoji_60 + tag + [篮球] + + + file + emoji_61.png + id + emoticon_emoji_61 + tag + [足球] + + + file + emoji_62.png + id + emoticon_emoji_62 + tag + [垒球] + + + file + emoji_63.png + id + emoticon_emoji_63 + tag + [网球] + + + file + emoji_64.png + id + emoticon_emoji_64 + tag + [台球] + + + file + emoji_65.png + id + emoticon_emoji_65 + tag + [咖啡] + + + file + emoji_66.png + id + emoticon_emoji_66 + tag + [啤酒] + + + file + emoji_67.png + id + emoticon_emoji_67 + tag + [干杯] + + + file + emoji_68.png + id + emoticon_emoji_68 + tag + [柠檬汁] + + + file + emoji_69.png + id + emoticon_emoji_69 + tag + [餐具] + + + file + emoji_70.png + id + emoticon_emoji_70 + tag + [汉堡] + + + file + emoji_71.png + id + emoticon_emoji_71 + tag + [鸡腿] + + + file + emoji_72.png + id + emoticon_emoji_72 + tag + [面条] + + + file + emoji_73.png + id + emoticon_emoji_73 + tag + [冰淇淋] + + + file + emoji_74.png + id + emoticon_emoji_74 + tag + [沙冰] + + + file + emoji_75.png + id + emoticon_emoji_75 + tag + [生日蛋糕] + + + file + emoji_76.png + id + emoticon_emoji_76 + tag + [蛋糕] + + + file + emoji_77.png + id + emoticon_emoji_77 + tag + [糖果] + + + file + emoji_78.png + id + emoticon_emoji_78 + tag + [葡萄] + + + file + emoji_79.png + id + emoticon_emoji_79 + tag + [西瓜] + + + file + emoji_80.png + id + emoticon_emoji_80 + tag + [光碟] + + + file + emoji_81.png + id + emoticon_emoji_81 + tag + [手机] + + + file + emoji_82.png + id + emoticon_emoji_82 + tag + [电话] + + + file + emoji_83.png + id + emoticon_emoji_83 + tag + [电视] + + + file + emoji_84.png + id + emoticon_emoji_84 + tag + [声音开启] + + + file + emoji_85.png + id + emoticon_emoji_85 + tag + [声音关闭] + + + file + emoji_86.png + id + emoticon_emoji_86 + tag + [铃铛] + + + file + emoji_87.png + id + emoticon_emoji_87 + tag + [锁头] + + + file + emoji_88.png + id + emoticon_emoji_88 + tag + [放大镜] + + + file + emoji_89.png + id + emoticon_emoji_89 + tag + [灯泡] + + + file + emoji_90.png + id + emoticon_emoji_90 + tag + [锤头] + + + file + emoji_91.png + id + emoticon_emoji_91 + tag + [烟] + + + file + emoji_92.png + id + emoticon_emoji_92 + tag + [炸弹] + + + file + emoji_93.png + id + emoticon_emoji_93 + tag + [枪] + + + file + emoji_94.png + id + emoticon_emoji_94 + tag + [刀] + + + file + emoji_95.png + id + emoticon_emoji_95 + tag + [药] + + + file + emoji_96.png + id + emoticon_emoji_96 + tag + [打针] + + + file + emoji_97.png + id + emoticon_emoji_97 + tag + [钱袋] + + + file + emoji_98.png + id + emoticon_emoji_98 + tag + [钞票] + + + file + emoji_99.png + id + emoticon_emoji_99 + tag + [银行卡] + + + file + emoji_100.png + id + emoticon_emoji_100 + tag + [手柄] + + + file + emoji_101.png + id + emoticon_emoji_101 + tag + [麻将] + + + file + emoji_102.png + id + emoticon_emoji_102 + tag + [调色板] + + + file + emoji_103.png + id + emoticon_emoji_103 + tag + [电影] + + + file + emoji_104.png + id + emoticon_emoji_104 + tag + [麦克风] + + + file + emoji_105.png + id + emoticon_emoji_105 + tag + [耳机] + + + file + emoji_106.png + id + emoticon_emoji_106 + tag + [音乐] + + + file + emoji_107.png + id + emoticon_emoji_107 + tag + [吉他] + + + file + emoji_108.png + id + emoticon_emoji_108 + tag + [火箭] + + + file + emoji_109.png + id + emoticon_emoji_109 + tag + [飞机] + + + file + emoji_110.png + id + emoticon_emoji_110 + tag + [火车] + + + file + emoji_111.png + id + emoticon_emoji_111 + tag + [公交] + + + file + emoji_112.png + id + emoticon_emoji_112 + tag + [轿车] + + + file + emoji_113.png + id + emoticon_emoji_113 + tag + [出租车] + + + file + emoji_114.png + id + emoticon_emoji_114 + tag + [警车] + + + file + emoji_115.png + id + emoticon_emoji_115 + tag + [自行车] + + + info + + id + default + normal + emoj_s_normal.png + pressed + emoj_s_pressed.png + title + emoji + + + + diff --git a/yinmeng-ios/yinmeng-ios/Global/MewEnum.h b/yinmeng-ios/yinmeng-ios/Global/MewEnum.h index 91e8c9f..e5267e3 100644 --- a/yinmeng-ios/yinmeng-ios/Global/MewEnum.h +++ b/yinmeng-ios/yinmeng-ios/Global/MewEnum.h @@ -47,4 +47,38 @@ typedef NS_ENUM(NSUInteger, MewUserInfoDetailType) { Mew_UserInfoDetailType_Friend, //其他好友 }; +/// 动态文章类型 +typedef NS_ENUM(NSInteger, MewMonentContentType) { + ///纯文字的 + MewMonentContentType_Text = 0, + ///图片 + MewMonentContentType_Picture = 2 +}; + +/// 分享给其他的类型 +typedef NS_ENUM(NSUInteger, MewMomentShareItemType) { + ///微信好友 + MewMomentShareItemType_WeChat_Friend = 1, + ///微信朋友圈 + MewMomentShareItemType_WeChat_Moments, + ///QQ好友 + MewMomentShareItemType_QQ_Friend, + ///QQ空间 + MewMomentShareItemType_QQ_Zone, + ///应用好友 + MewMomentShareItemType_App_Friends, +}; + +/// 分享数据的来源类型 +typedef NS_ENUM(NSUInteger, MewShareChannelType) { + MewShareChannelType_Dynamic, //动态 + MewShareChannelType_Room, //房间 +}; + +/// 分享的类型 +typedef NS_ENUM(NSUInteger, MewSharePushModelType) { + MewSharePushModelType_Room = 1,//房间 + MewSharePushModelType_H5, //H5分享 +}; + #endif /* MewEnum_h */ diff --git a/yinmeng-ios/yinmeng-ios/Global/MewHtmlUrl.h b/yinmeng-ios/yinmeng-ios/Global/MewHtmlUrl.h index f2260bb..25e4edd 100644 --- a/yinmeng-ios/yinmeng-ios/Global/MewHtmlUrl.h +++ b/yinmeng-ios/yinmeng-ios/Global/MewHtmlUrl.h @@ -11,14 +11,16 @@ NS_ASSUME_NONNULL_BEGIN @interface MewHtmlUrl : NSObject -typedef NS_ENUM(NSUInteger, URLType) { - kPrivacyURL,///隐私政策 - kCancelAccout, /// 注销账号 - kUserProtocalURL ///用户协议 +typedef NS_ENUM(NSUInteger, MewHtmlURLType) { + MewHtmlURLType_Privacy,///隐私政策 + MewHtmlURLType_CancelAccout, /// 注销账号 + MewHtmlURLType_UserProtocal, ///用户协议 + MewHtmlURLType_ShareDynamic, ///分享动态 + MewHtmlURLType_ShareRoom ///分享房间 }; -NSString * const URLWithType(URLType type); +NSString * const MewHtmlURLWithType(MewHtmlURLType type); @end NS_ASSUME_NONNULL_END diff --git a/yinmeng-ios/yinmeng-ios/Global/MewHtmlUrl.m b/yinmeng-ios/yinmeng-ios/Global/MewHtmlUrl.m index 85d0508..1f59b95 100644 --- a/yinmeng-ios/yinmeng-ios/Global/MewHtmlUrl.m +++ b/yinmeng-ios/yinmeng-ios/Global/MewHtmlUrl.m @@ -10,12 +10,14 @@ @implementation MewHtmlUrl -NSString * const URLWithType(URLType type) { +NSString * const MewHtmlURLWithType(MewHtmlURLType type) { NSString * prefix = @"mew"; NSDictionary * dic = @{ - @(kPrivacyURL) : [MewEncryptTool MEW_aesDecrypt:@"RW2RUxUBFSQXiYS0xFpDv+HMdWG2/xfjkYMyeSFR/BY="],//隐私政策modules/rule/privacy-wap.html - @(kCancelAccout) : [MewEncryptTool MEW_aesDecrypt:@"OdODqmY17B0vG9Gs7FGtEuzMJQXILqziECH6PQoOSLo="],//注销账号modules/logout/index.html - @(kUserProtocalURL) : [MewEncryptTool MEW_aesDecrypt:@"oSYlxZYQP2Vu+3KRnQorypsYWQGEz2tKII7AwcFks7s="],///用户协议modules/rule/protocol.html + @(MewHtmlURLType_Privacy) : [MewEncryptTool MEW_aesDecrypt:@"RW2RUxUBFSQXiYS0xFpDv+HMdWG2/xfjkYMyeSFR/BY="],//隐私政策modules/rule/privacy-wap.html + @(MewHtmlURLType_CancelAccout) : [MewEncryptTool MEW_aesDecrypt:@"OdODqmY17B0vG9Gs7FGtEuzMJQXILqziECH6PQoOSLo="],//注销账号modules/logout/index.html + @(MewHtmlURLType_UserProtocal) : [MewEncryptTool MEW_aesDecrypt:@"oSYlxZYQP2Vu+3KRnQorypsYWQGEz2tKII7AwcFks7s="],///用户协议modules/rule/protocol.html + @(MewHtmlURLType_ShareDynamic) : @"modules/share_room/index.html",///分享动态modules/share_room/index.html + @(MewHtmlURLType_ShareRoom) : @"modules/world/share-page/index.html",///分享房间modules/world/share-page/index.html }; NSString * url = [dic objectForKey:@(type)]; return [NSString stringWithFormat:@"%@/%@",prefix, url]; diff --git a/yinmeng-ios/yinmeng-ios/Main/Dynamic/Model/MewDynamicCommentModel.h b/yinmeng-ios/yinmeng-ios/Main/Dynamic/Model/MewDynamicCommentModel.h new file mode 100644 index 0000000..800f4d7 --- /dev/null +++ b/yinmeng-ios/yinmeng-ios/Main/Dynamic/Model/MewDynamicCommentModel.h @@ -0,0 +1,46 @@ +// +// MewDynamicCommentModel.h +// yinmeng-ios +// +// Created by 触海 on 2023/12/22. +// + +#import "NSObject+MEWExtension.h" +#import "MewDynamicReplyCommentModel.h" + +NS_ASSUME_NONNULL_BEGIN + +@interface MewDynamicCommentListModel : NSObject +///是否刷新高度 +@property (nonatomic,assign) BOOL isReloadHeight; +///评论的高度 +@property (nonatomic,assign) CGFloat commentRowHeight; +/// 昵称 +@property (nonatomic,copy) NSString *nick; +/// 头像 +@property (nonatomic,copy) NSString *avatar; +/// 用户 uid +@property (nonatomic,copy) NSString *uid; +///评论内容 +@property (nonatomic,copy) NSString *content; +///时间 +@property (nonatomic, copy) NSString *publishTime; +/// 当前评论id +@property (nonatomic, copy) NSString *commentId; +///回复的内容 +@property (nonatomic,strong) MewDynamicReplyCommentModel *replyInfo; +/// 是否是楼主 +@property (nonatomic, assign) BOOL landLordFlag; + +@end + + +@interface MewDynamicCommentModel : NSObject +///评论的列表 +@property (nonatomic,strong) NSArray *commentList; +///下一个评论的时间戳 +@property (nonatomic,copy) NSString *nextTimestamp; + +@end + +NS_ASSUME_NONNULL_END diff --git a/yinmeng-ios/yinmeng-ios/Main/Dynamic/Model/MewDynamicCommentModel.m b/yinmeng-ios/yinmeng-ios/Main/Dynamic/Model/MewDynamicCommentModel.m new file mode 100644 index 0000000..0ae7fdb --- /dev/null +++ b/yinmeng-ios/yinmeng-ios/Main/Dynamic/Model/MewDynamicCommentModel.m @@ -0,0 +1,23 @@ +// +// MewDynamicCommentModel.m +// yinmeng-ios +// +// Created by 触海 on 2023/12/22. +// + +#import "MewDynamicCommentModel.h" + +@implementation MewDynamicCommentListModel + +@end + + +@implementation MewDynamicCommentModel ++ (NSDictionary *)mewObjectClassInArray { + return @{ + @"commentList": MewDynamicCommentListModel.class + }; +} + + +@end diff --git a/yinmeng-ios/yinmeng-ios/Main/Dynamic/Model/MewDynamicMomentModel.h b/yinmeng-ios/yinmeng-ios/Main/Dynamic/Model/MewDynamicMomentModel.h new file mode 100644 index 0000000..5a50680 --- /dev/null +++ b/yinmeng-ios/yinmeng-ios/Main/Dynamic/Model/MewDynamicMomentModel.h @@ -0,0 +1,90 @@ +// +// MewDynamicMomentModel.h +// yinmeng-ios +// +// Created by 触海 on 2023/12/22. +// + +#import "NSObject+MEWExtension.h" +#import "MewEnum.h" +#import "MewUserVipInfoModel.h" +#import "MewDynamicPhotoMomentModel.h" + +NS_ASSUME_NONNULL_BEGIN + +@interface MewDynamicMomentModel : NSObject +///类型 +@property (nonatomic,assign) MewMonentContentType type; +///用户的uid +@property (nonatomic,copy) NSString *uid; +///昵称 +@property (nonatomic,copy) NSString *nick; +///身份的类型 +@property (nonatomic,assign) NSInteger defUser; +///是否是新用户 +@property (nonatomic,assign) BOOL newUser; +///性别 +@property (nonatomic,assign) MewGenderType gender; +///头像 +@property (nonatomic,copy) NSString *avatar; +///年龄 +@property (nonatomic,assign) int age; +///内容 +@property (nonatomic,strong) NSString *content; +///喜欢的次数 +@property (nonatomic,copy) NSString *likeCount; +///我是否已经点赞 +@property (nonatomic, assign) BOOL isLike; +///评论的次数 +@property (nonatomic,copy) NSString *commentCount; +//发布时间 +@property (nonatomic,copy) NSString *publishTime; +///等级 +@property (nonatomic,strong) NSString *experLevelPic; +///魅力等级 +@property (nonatomic,strong) NSString *charmLevelPic; +///等级 +@property (nonatomic,strong) NSString *experNewLevelPic; +///魅力等级 +@property (nonatomic,strong) NSString *charmNewLevelPic; +///是否置顶 +@property (nonatomic,assign) BOOL squareTop; +///贵族信息 +@property (nonatomic, strong) MewUserVipInfoModel *userVipInfoVO; +///发布的内容 +@property (nonatomic,copy) NSArray *dynamicResList; +///头饰url地址 +@property (nonatomic,copy) NSString *headwearPic; +///头饰url地址 +@property (nonatomic,copy) NSString *headwearEffect; +///是否在直播中 +@property (nonatomic,copy) NSString *inRoomUid; +///显示的标签 +@property (nonatomic,copy) NSArray *labelList; +///铭牌名称 +@property (nonatomic, copy) NSString *nameplateWord; +///铭牌图片 +@property (nonatomic, copy) NSString *nameplatePic; +///话题id +@property (nonatomic, assign) long worldId; +///话题名字 +@property (nonatomic, copy) NSString *worldName; +///动态的id +@property (nonatomic,copy) NSString *dynamicId; +///是否是折叠起来的 +@property (nonatomic,assign) BOOL isFold; +///cell的高度 +@property (nonatomic,assign) CGFloat rowHeight; +///图片的高度 +@property (nonatomic,assign) CGFloat picHeight; +///文本内容的高度 +@property (nonatomic,assign) CGFloat contentHeight; +///显示的内容的富文本 +@property (nonatomic,strong) NSMutableAttributedString *contentAttribute; +///收起的 +@property (nonatomic,strong, nullable) NSMutableAttributedString *foldAttribute; +// 文本行数 +@property (nonatomic, assign) NSInteger numberOfText; +@end + +NS_ASSUME_NONNULL_END diff --git a/yinmeng-ios/yinmeng-ios/Main/Dynamic/Model/MewDynamicMomentModel.m b/yinmeng-ios/yinmeng-ios/Main/Dynamic/Model/MewDynamicMomentModel.m new file mode 100644 index 0000000..af6cfa2 --- /dev/null +++ b/yinmeng-ios/yinmeng-ios/Main/Dynamic/Model/MewDynamicMomentModel.m @@ -0,0 +1,36 @@ +// +// MewDynamicMomentModel.m +// yinmeng-ios +// +// Created by 触海 on 2023/12/22. +// + +#import "MewDynamicMomentModel.h" +#import "NSString+MewUtil.h" + +@implementation MewDynamicMomentModel + +- (instancetype)init { + if (self = [super init]) { + self.isFold = YES; + } + return self; + +} + ++ (NSDictionary *)mewObjectClassInArray { + return @{@"dynamicResList":MewDynamicPhotoMomentModel.class}; +} + + +- (void)setCharmLevelPic:(NSString *)charmLevelPic{ + _charmLevelPic = charmLevelPic; + _charmNewLevelPic = [NSString Mew_CharmImageUrlToString:_charmLevelPic]; +} + +- (void)setExperLevelPic:(NSString *)experLevelPic{ + _experLevelPic = experLevelPic; + _experNewLevelPic = [NSString Mew_ExperImageUrlToString:_experLevelPic]; +} + +@end diff --git a/yinmeng-ios/yinmeng-ios/Main/Dynamic/Model/MewDynamicPhotoMomentModel.h b/yinmeng-ios/yinmeng-ios/Main/Dynamic/Model/MewDynamicPhotoMomentModel.h new file mode 100644 index 0000000..8e3331c --- /dev/null +++ b/yinmeng-ios/yinmeng-ios/Main/Dynamic/Model/MewDynamicPhotoMomentModel.h @@ -0,0 +1,23 @@ +// +// MewDynamicPhotoMomentModel.h +// yinmeng-ios +// +// Created by 触海 on 2023/12/22. +// + +#import + +NS_ASSUME_NONNULL_BEGIN + +@interface MewDynamicPhotoMomentModel : NSObject +///图片的地址 +@property (nonatomic,copy) NSString * resUrl; +///格式 +@property (nonatomic,copy) NSString *format; +///宽度 +@property (nonatomic,assign) CGFloat width; +///高度 +@property (nonatomic,assign) CGFloat height; +@end + +NS_ASSUME_NONNULL_END diff --git a/yinmeng-ios/yinmeng-ios/Main/Dynamic/Model/MewDynamicPhotoMomentModel.m b/yinmeng-ios/yinmeng-ios/Main/Dynamic/Model/MewDynamicPhotoMomentModel.m new file mode 100644 index 0000000..3815d2b --- /dev/null +++ b/yinmeng-ios/yinmeng-ios/Main/Dynamic/Model/MewDynamicPhotoMomentModel.m @@ -0,0 +1,12 @@ +// +// MewDynamicPhotoMomentModel.m +// yinmeng-ios +// +// Created by 触海 on 2023/12/22. +// + +#import "MewDynamicPhotoMomentModel.h" + +@implementation MewDynamicPhotoMomentModel + +@end diff --git a/yinmeng-ios/yinmeng-ios/Main/Dynamic/Model/MewDynamicReplyCommentModel.h b/yinmeng-ios/yinmeng-ios/Main/Dynamic/Model/MewDynamicReplyCommentModel.h new file mode 100644 index 0000000..9f4a74a --- /dev/null +++ b/yinmeng-ios/yinmeng-ios/Main/Dynamic/Model/MewDynamicReplyCommentModel.h @@ -0,0 +1,53 @@ +// +// MewDynamicReplyCommentModel.h +// yinmeng-ios +// +// Created by 触海 on 2023/12/22. +// + +#import "NSObject+MEWExtension.h" + +NS_ASSUME_NONNULL_BEGIN + +@interface MewDynamicReplyCommentListModel : NSObject +///回复的高度 +@property (nonatomic,assign) CGFloat replyRowHeight; +/// 头像 +@property (nonatomic,copy) NSString *avatar; +/// 用户uid +@property (nonatomic,copy) NSString *uid; +/// 用户昵称 +@property (nonatomic,copy) NSString *nick; +/// 回复评论的评论id +@property (nonatomic,copy) NSString *toCommentId; +/// 回复评论的uid +@property (nonatomic,copy) NSString *toUid; +/// 回复评论的昵称 +@property (nonatomic,copy) NSString *toNick; +/// 评论内容 +@property (nonatomic,copy) NSString *content; +/// 发布时间 +@property (nonatomic,copy) NSString *publishTime; +/// 是否是楼主 +@property (nonatomic,assign) BOOL landLordFlag; +/// 回复评论的评论id +@property (nonatomic,copy) NSString *replyId; +///显示的富文本 +@property (nonatomic,strong) NSAttributedString *contentAttribute; + +/// 设置回复内容的Attribute +- (void)mew_createDynamicContentAttribute; + +@end + + +@interface MewDynamicReplyCommentModel : NSObject +@property (nonatomic, strong) NSMutableArray *replyList;// 剩余数量 +///剩余多少可以展开 +@property (nonatomic, assign) NSInteger leftCount; +///下一个时间 +@property (nonatomic, copy) NSString *nextTimestamp; + +@end + +NS_ASSUME_NONNULL_END diff --git a/yinmeng-ios/yinmeng-ios/Main/Dynamic/Model/MewDynamicReplyCommentModel.m b/yinmeng-ios/yinmeng-ios/Main/Dynamic/Model/MewDynamicReplyCommentModel.m new file mode 100644 index 0000000..af994fd --- /dev/null +++ b/yinmeng-ios/yinmeng-ios/Main/Dynamic/Model/MewDynamicReplyCommentModel.m @@ -0,0 +1,39 @@ +// +// MewDynamicReplyCommentModel.m +// yinmeng-ios +// +// Created by 触海 on 2023/12/22. +// + +#import "MewDynamicReplyCommentModel.h" +#import "QEmotionHelper.h" +#import "MewThemeColor.h" + +@implementation MewDynamicReplyCommentListModel + +/// 设置回复内容的Attribute +- (void)mew_createDynamicContentAttribute { + if (self.contentAttribute != nil) { return; } + + QEmotionHelper *faceManager = [QEmotionHelper sharedEmotionHelper]; + NSString * toNick = [NSString stringWithFormat:@"@%@", _toNick]; + NSString *title = [NSString stringWithFormat:@"%@%@",toNick, _content.length > 0 ? _content : @""]; + NSMutableAttributedString * attribute = [faceManager attributedStringByText:title font:[UIFont systemFontOfSize:15]]; + if ([attribute.string containsString:toNick]) { + NSRange range = [attribute.string rangeOfString:toNick]; + [attribute addAttribute:NSForegroundColorAttributeName value:MewThemeColor.mewAppMainColor range:range]; + } + self.contentAttribute = attribute; + +} + +@end + + +@implementation MewDynamicReplyCommentModel ++ (NSDictionary *)mewObjectClassInArray { + return @{ + @"replyList": MewDynamicReplyCommentListModel.class + }; +} +@end diff --git a/yinmeng-ios/yinmeng-ios/Main/Dynamic/View/Config/MewDynamicLayoutConfig.h b/yinmeng-ios/yinmeng-ios/Main/Dynamic/View/Config/MewDynamicLayoutConfig.h new file mode 100644 index 0000000..ca7b366 --- /dev/null +++ b/yinmeng-ios/yinmeng-ios/Main/Dynamic/View/Config/MewDynamicLayoutConfig.h @@ -0,0 +1,38 @@ +// +// MewDynamicLayoutConfig.h +// yinmeng-ios +// +// Created by 触海 on 2023/12/22. +// + +#import "MewMacro.h" +#ifndef MewDynamicLayoutConfig_h +#define MewDynamicLayoutConfig_h + +#define MEW_DYNAMIC_CONTENT_LEFT_PADDING 67 +#define MEW_DYNAMIC_CONTENT_RIGHT_PADDING 36 +#define MEW_DYNAMIC_CONTENT_MAX_WIDTH (KScreenWidth - MEW_DYNAMIC_CONTENT_LEFT_PADDING - MEW_DYNAMIC_CONTENT_RIGHT_PADDING) +#define MEW_DYNAMIC_PIC_ONE_WIDTH 200 ///只有一个动态图片的高度 +#define MEW_DYNAMIC_PIC_SPACE 4 ///图片之间的间隙的宽度或者高度 +#define MEW_DYNAMIC_USER_INFO_HEIGHT 60 ///用户信息的高度 +#define MEWDYNAMIC_TOOL_BAR_HEIGHT 58 ///底部操作栏的高度 +#define MEW_DYNAMIC_CONTENT_SPACAE_HEIGHT 12 /// 每个内容之间下面的间隙的高度 +#define MEW_DYNAMIC_TEXT_TOPIC_HEIGHT 20 /// 话题的高度 +#define MEW_DYNAMIC_FOLD_HEIGHT 20 /// 展开 关闭的高度 +#pragma mark - 评论的配置 +#define MEW_DYNAMIC_COMMENT_LEFT_PADDING 15 ///评论左的间隙 +#define MEW_DYNAMIC_COMMENT_RIGHT_PADDING 25 ///评论右的间隙 +#define MEW_DYNAMIC_COMMENT_AVATAR_NICK_PADDING 10 ///头像昵称之间的间隙 +#define MEW_DYNAMIC_COMMENT_AVATAR_WIDTH 45 ///评论的头像大小 +#define MEW_DYNAMIC_COMMENT_MAX_WIDTH (KScreenWidth - MEW_DYNAMIC_COMMENT_AVATAR_WIDTH - MEW_DYNAMIC_COMMENT_LEFT_PADDING - MEW_DYNAMIC_COMMENT_RIGHT_PADDING - MEW_DYNAMIC_COMMENT_AVATAR_NICK_PADDING) ///评论内容的最大宽度 +#pragma mark - 评论回复的配置 +#define MEW_DYNAMIC_COMMENT_REPLY_AVATAR_WIDTH 30 ///评论回复的头像大小 +#define MEW_DYNAMIC_COMMENT_REPLY_LEFT_PADDING (MEW_DYNAMIC_COMMENT_LEFT_PADDING + MEW_DYNAMIC_COMMENT_RIGHT_PADDING + MEW_DYNAMIC_COMMENT_AVATAR_NICK_PADDING) ///回复这左边的间隙 +#define MEW_DYNAMIC_COMMENT_REPLY_MAX_WIDTH (MEW_DYNAMIC_COMMENT_MAX_WIDTH - MEW_DYNAMIC_COMMENT_REPLY_AVATAR_WIDTH - MEW_DYNAMIC_COMMENT_AVATAR_NICK_PADDING) ///评论回复内容的最大宽度 + +#pragma mark - 个人资料页动态 +#define MEW_MINE_DYNAMIC_CONTENT_LEFT_PADDING 18 +#define MEW_MINE_DYNAMIC_CONTENT_MAX_WIDTH (KScreenWidth - MEW_MINE_DYNAMIC_CONTENT_LEFT_PADDING*2) +#define MEW_MINE_DYNAMIC_TIME_HEIGHT 14 + +#endif /* MewDynamicLayoutConfig_h */ diff --git a/yinmeng-ios/yinmeng-ios/Main/Dynamic/View/Config/MewDynamicTextHeightLayout.h b/yinmeng-ios/yinmeng-ios/Main/Dynamic/View/Config/MewDynamicTextHeightLayout.h new file mode 100644 index 0000000..540ebee --- /dev/null +++ b/yinmeng-ios/yinmeng-ios/Main/Dynamic/View/Config/MewDynamicTextHeightLayout.h @@ -0,0 +1,36 @@ +// +// MewDynamicTextLayoutConfig.h +// yinmeng-ios +// +// Created by 触海 on 2023/12/22. +// + +#import +#import "MewDynamicMomentModel.h" +#import "MewDynamicCommentModel.h" +#import "MewDynamicLayoutConfig.h" + + +NS_ASSUME_NONNULL_BEGIN + +@interface MewDynamicTextHeightLayout : NSObject +/// 获取动态全部内容的高度(内容+ 图片) - 直接设置在模型的rowHeight ++ (void)Mew_LayoutDynamicMomentsHeight:(MewDynamicMomentModel *)moments; +/// 根据动态内容计算内容高度 ++ (CGFloat)Mew_LayoutDynamicMomentsContentHeight:(MewDynamicMomentModel *)moments; +/// 根据动态图片计算图片的高度 ++ (CGFloat)Mew_LayoutDynamicMomentsPictureHeight:(MewDynamicMomentModel *)moments; +/// 根据动态评论计算评论的高度 ++ (CGFloat)Mew_LayoutDynamicMomentsCommentHeight:(MewDynamicCommentListModel * )comment; + +#pragma mark - 个人资料页的动态 +/// 获取个人资料页的资料下动态内容的高度(内容+ 图片) - 直接设置在模型的rowHeight ++ (void)Mew_LayoutPersonProfileDynamicMomentsHeight:(MewDynamicMomentModel *)moments; +/// 根据个人资料页的资料下动态内容计算内容高度 ++ (CGFloat)Mew_LayoutPersonProfileDynamicMomentsContentHeight:(MewDynamicMomentModel *)moments; +/// 根据个人资料页的资料下动态图片计算图片高度 ++ (CGFloat)Mew_LayoutPersonProfileDynamicMomentsPictureHeight:(MewDynamicMomentModel *)moments; + +@end + +NS_ASSUME_NONNULL_END diff --git a/yinmeng-ios/yinmeng-ios/Main/Dynamic/View/Config/MewDynamicTextHeightLayout.m b/yinmeng-ios/yinmeng-ios/Main/Dynamic/View/Config/MewDynamicTextHeightLayout.m new file mode 100644 index 0000000..f895326 --- /dev/null +++ b/yinmeng-ios/yinmeng-ios/Main/Dynamic/View/Config/MewDynamicTextHeightLayout.m @@ -0,0 +1,201 @@ +// +// MewDynamicTextLayoutConfig.m +// yinmeng-ios +// +// Created by 触海 on 2023/12/22. +// + +#import "MewDynamicTextHeightLayout.h" +/// Third +#import +/// Tool +#import "MewThemeColor.h" +#import "QEmotionHelper.h" +#import "NSMutableAttributedString+MewUtil.h" +#import "MewMacro.h" + +@implementation MewDynamicTextHeightLayout +/// 获取动态内容 ++ (void)Mew_LayoutDynamicMomentsHeight:(MewDynamicMomentModel *)moments { + CGFloat height = MEW_DYNAMIC_USER_INFO_HEIGHT; + ///用户信息和文字之间的间隙 + height += MEW_DYNAMIC_CONTENT_SPACAE_HEIGHT; + ///文字内容的高度 + height += [self Mew_LayoutDynamicMomentsContentHeight:moments]; + ///图片的高度 + height += [self Mew_LayoutDynamicMomentsPictureHeight:moments]; + ///如果没有图片的话 间隙就只有一个 + if (moments.type == MewMonentContentType_Picture && moments.content.length > 0) { + height += MEW_DYNAMIC_CONTENT_SPACAE_HEIGHT * 2; + } else { + height += MEW_DYNAMIC_CONTENT_SPACAE_HEIGHT; + } + ///话题的高度 + height += MEW_DYNAMIC_TEXT_TOPIC_HEIGHT; + ///底部操作栏的高度 + height += MEWDYNAMIC_TOOL_BAR_HEIGHT; + moments.rowHeight = height; +} + +/// 根据动态内容计算内容高度 ++ (CGFloat)Mew_LayoutDynamicMomentsContentHeight:(MewDynamicMomentModel *)moments { + return [self Mew_SetLayoutDynamicMomentsContentHeight:MEW_DYNAMIC_CONTENT_MAX_WIDTH moments:moments]; +} +/// 根据动态图片计算图片的高度 ++ (CGFloat)Mew_LayoutDynamicMomentsPictureHeight:(MewDynamicMomentModel *)moments { + ///计算图片的高度 + return [self Mew_SetLayoutDynamicMomentPictureHeight:MEW_DYNAMIC_CONTENT_MAX_WIDTH moment:moments]; +} + +/// 根据动态评论计算评论的高度 ++ (CGFloat)Mew_LayoutDynamicMomentsCommentHeight:(MewDynamicCommentListModel * )comment { + if (comment.commentRowHeight > 0 && !comment.isReloadHeight) { + return comment.commentRowHeight; + } + __block CGFloat rowHeight = 0; + CGFloat commentTopHeight = 10 + 15 + 10;///10顶部的间隙 15 昵称的高度 + ///内容 + QEmotionHelper *faceManager = [QEmotionHelper sharedEmotionHelper]; + NSMutableAttributedString * attribute = [faceManager attributedStringByText:comment.content font:kFontRegular(15)]; + YYTextContainer *container = [YYTextContainer new]; + container.size = CGSizeMake(MEW_DYNAMIC_COMMENT_MAX_WIDTH, CGFLOAT_MAX); + + container.maximumNumberOfRows = 0; + YYTextLayout *textLayout = [YYTextLayout layoutWithContainer:container text:attribute]; + CGFloat commentHeight = textLayout.textBoundingSize.height; + commentHeight = MAX(commentHeight, 15); + rowHeight += commentTopHeight; + rowHeight += commentHeight; + + ///展开剩余的回复 + if (comment.replyInfo.leftCount > 0) { + rowHeight += 44; + } + + if (comment.replyInfo.replyList.count > 0) { + rowHeight += 10 * 2; + } else { + rowHeight += 10; + } + + ///评论的高度 + [comment.replyInfo.replyList enumerateObjectsUsingBlock:^(MewDynamicReplyCommentListModel * _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) { + if (obj.content.length > 0) { + [obj mew_createDynamicContentAttribute]; + CGFloat replayHeight = 0; + CGFloat commentTopHeight = 10 + 15 + 10;///10顶部的间隙 15 昵称的高度 + CGFloat commentBottomHeight = 10; + YYTextContainer *container = [YYTextContainer new]; + container.size = CGSizeMake(MEW_DYNAMIC_COMMENT_REPLY_MAX_WIDTH, CGFLOAT_MAX); + container.maximumNumberOfRows = 0; + YYTextLayout *realLayout = [YYTextLayout layoutWithContainer:container text:obj.contentAttribute]; + CGFloat replyContentHeight = realLayout.textBoundingSize.height; + replayHeight += commentTopHeight; + replayHeight += replyContentHeight; + replayHeight += commentBottomHeight; + obj.replyRowHeight = replayHeight; + rowHeight += replayHeight; + } + }]; + comment.commentRowHeight = rowHeight; + return rowHeight; +} + + +#pragma mark - 个人资料页的动态 +/// 获取个人资料页的资料下动态内容 ++ (void)Mew_LayoutPersonProfileDynamicMomentsHeight:(MewDynamicMomentModel *)moments { + CGFloat height = MEW_DYNAMIC_CONTENT_SPACAE_HEIGHT; + ///文字内容的高度 + height = [self Mew_LayoutDynamicMomentsContentHeight:moments]; + if (moments.content.length > 0) { + height += MEW_DYNAMIC_CONTENT_SPACAE_HEIGHT; + } + ///时间高度 + height += MEW_MINE_DYNAMIC_TIME_HEIGHT; + if (moments.type == MewMonentContentType_Picture) { + height += MEW_DYNAMIC_CONTENT_SPACAE_HEIGHT; + } + ///图片的高度 + height += [self Mew_LayoutDynamicMomentsPictureHeight:moments]; + ///话题的高度 + if (moments.worldId > 0) { + height += MEW_DYNAMIC_CONTENT_SPACAE_HEIGHT; + height += MEW_DYNAMIC_TEXT_TOPIC_HEIGHT; + } + ///底部操作栏的高度 + height += MEWDYNAMIC_TOOL_BAR_HEIGHT; + moments.rowHeight = height; +} + +/// 根据个人资料页的资料下动态内容计算内容高度 ++ (CGFloat)Mew_LayoutPersonProfileDynamicMomentsContentHeight:(MewDynamicMomentModel *)moments { + return [self Mew_SetLayoutDynamicMomentsContentHeight:MEW_MINE_DYNAMIC_CONTENT_MAX_WIDTH moments:moments]; +} +/// 根据个人资料页的资料下动态图片计算图片高度 ++ (CGFloat)Mew_LayoutPersonProfileDynamicMomentsPictureHeight:(MewDynamicMomentModel *)moments { + ///计算图片的高度 + return [self Mew_SetLayoutDynamicMomentPictureHeight:MEW_MINE_DYNAMIC_CONTENT_MAX_WIDTH moment:moments]; +} + + +#pragma mark - Private Method +/// 设置动态内容的高度 ++ (CGFloat)Mew_SetLayoutDynamicMomentsContentHeight:(CGFloat)contaierHeight moments:(MewDynamicMomentModel *)moments { + if (moments.content.length <= 0) { + moments.contentHeight = 0; + return 0; + } + + ///计算文本的高度 + if (!moments.contentAttribute) { + NSMutableAttributedString *attributedString = [NSMutableAttributedString Mew_MutableAttibuteTextAttachementSuqare:moments.squareTop content:moments.content]; + moments.contentAttribute = attributedString; + } + + YYTextContainer *container = [YYTextContainer new]; + container.size = CGSizeMake(contaierHeight, CGFLOAT_MAX); + container.maximumNumberOfRows = 0; + YYTextLayout *layout = [YYTextLayout layoutWithContainer:container text:moments.contentAttribute]; + moments.numberOfText = layout.rowCount; + CGFloat foldHeight = 0; + if (layout.rowCount > 6) { + foldHeight = MEW_DYNAMIC_FOLD_HEIGHT; + NSInteger numberOfLines = moments.isFold ? 6 : 0; + container.maximumNumberOfRows = numberOfLines; + } + YYTextLayout *realLayout = [YYTextLayout layoutWithContainer:container text:moments.contentAttribute]; + CGFloat contentHeight = realLayout.textBoundingSize.height; + moments.contentHeight =contentHeight; + return contentHeight + foldHeight; +} + +/// 设置动态图片的高度 ++ (CGFloat)Mew_SetLayoutDynamicMomentPictureHeight:(CGFloat)pictureMaxWidth moment:(MewDynamicMomentModel *)moments { + NSInteger picCount = moments.dynamicResList.count; + CGFloat picHeight = 0; + if (picCount == 0) { + picHeight = 0; + } else if(picCount == 1) { + picHeight = MEW_DYNAMIC_PIC_ONE_WIDTH; + + } else if(picCount == 2) { + picHeight = (pictureMaxWidth - MEW_DYNAMIC_PIC_SPACE) / 2; + + } else { + if (picCount > 9) { + picCount = 9; + } + CGFloat itemWidth = (pictureMaxWidth - MEW_DYNAMIC_PIC_SPACE * 2) / 3; + NSInteger page = picCount % 3; + NSInteger line = picCount / 3; + if (page == 0) { + picHeight = itemWidth * line + (line - 1) * MEW_DYNAMIC_PIC_SPACE; + } else { + picHeight = itemWidth * (line + 1) + line * MEW_DYNAMIC_PIC_SPACE; + } + } + moments.picHeight = picHeight; + return picHeight; +} +@end diff --git a/yinmeng-ios/yinmeng-ios/Main/Dynamic/View/MewDynamicMomentsContentView.h b/yinmeng-ios/yinmeng-ios/Main/Dynamic/View/MewDynamicMomentsContentView.h new file mode 100644 index 0000000..165b7f6 --- /dev/null +++ b/yinmeng-ios/yinmeng-ios/Main/Dynamic/View/MewDynamicMomentsContentView.h @@ -0,0 +1,27 @@ +// +// MewDynamicMomentContentView.h +// yinmeng-ios +// +// Created by 触海 on 2023/12/22. +// + +#import +@class MewDynamicMomentModel, MewDynamicMomentsContentView; + +NS_ASSUME_NONNULL_BEGIN +@protocol MewDynamicMomentsContentViewDelegate +/// 点击折叠 +- (void)didSelectDynamicMomentsContentView:(MewDynamicMomentsContentView *)contentView foldMomentsModel:(MewDynamicMomentModel *)foldMomentsModel; +@end + +@interface MewDynamicMomentsContentView : UIView +/// 是否是个人资料页下的动态, 默认 - 不是 +@property (nonatomic, assign) BOOL isPersonalDynamic; +/// 动态数据 +@property (nonatomic, strong) MewDynamicMomentModel *dynamicModel; + +@property (nonatomic, weak) id delegate; + +@end + +NS_ASSUME_NONNULL_END diff --git a/yinmeng-ios/yinmeng-ios/Main/Dynamic/View/MewDynamicMomentsContentView.m b/yinmeng-ios/yinmeng-ios/Main/Dynamic/View/MewDynamicMomentsContentView.m new file mode 100644 index 0000000..e0e05ba --- /dev/null +++ b/yinmeng-ios/yinmeng-ios/Main/Dynamic/View/MewDynamicMomentsContentView.m @@ -0,0 +1,145 @@ +// +// MewDynamicMomentContentView.m +// yinmeng-ios +// +// Created by 触海 on 2023/12/22. +// + +#import "MewDynamicMomentsContentView.h" +///Third +#import +#import +///Tool +#import "MewThemeColor.h" +#import "UIButton+MewEnlargeTouchArea.h" +#import "MewDynamicTextHeightLayout.h" +#import "NSMutableAttributedString+MewUtil.h" + +@interface MewDynamicMomentsContentView() +///容器 +@property (nonatomic,strong) UIStackView *dynamicVerStackView; +///显示内容 +@property (nonatomic,strong) UILabel *dynamicContentLabel; +///折叠的按钮 +@property (nonatomic,strong) UIButton *dynamicFoldButton; +@end + +@implementation MewDynamicMomentsContentView + +#pragma mark - Init +- (instancetype)initWithFrame:(CGRect)frame { + self = [super initWithFrame:frame]; + if (self) { + [self setUI]; + } + return self; +} + +#pragma mark - UI +- (void)setUI { + [self addSubview:self.dynamicVerStackView]; + [self.dynamicVerStackView addArrangedSubview:self.dynamicContentLabel]; + [self.dynamicVerStackView addArrangedSubview:self.dynamicFoldButton]; + [self setUILayout]; +} + +- (void)setUILayout { + [self.dynamicVerStackView mas_makeConstraints:^(MASConstraintMaker *make) { + make.edges.mas_equalTo(self); + }]; + + [self.dynamicFoldButton mas_makeConstraints:^(MASConstraintMaker *make) { + make.height.mas_equalTo(MEW_DYNAMIC_FOLD_HEIGHT); + }]; +} + +#pragma mark - Set +- (void)setIsPersonalDynamic:(BOOL)isPersonalDynamic { + _isPersonalDynamic = isPersonalDynamic; + self.dynamicContentLabel.preferredMaxLayoutWidth = _isPersonalDynamic ? MEW_MINE_DYNAMIC_CONTENT_MAX_WIDTH : MEW_DYNAMIC_CONTENT_MAX_WIDTH; +} + +- (void)setDynamicModel:(MewDynamicMomentModel *)dynamicModel { + _dynamicModel = dynamicModel; + if (!_dynamicModel) { return; } + + self.dynamicContentLabel.attributedText = [NSMutableAttributedString Mew_MutableAttibuteTextAttachementSuqare:_dynamicModel.squareTop content:_dynamicModel.content]; + self.dynamicFoldButton.selected = !_dynamicModel.isFold; + BOOL isHiddenFlodButton = YES; + if (_dynamicModel.numberOfText > 0) { + isHiddenFlodButton = _dynamicModel.numberOfText <= 6; + } else { + YYTextContainer *container = [YYTextContainer new]; + CGFloat width = self.isPersonalDynamic ? MEW_MINE_DYNAMIC_CONTENT_MAX_WIDTH : MEW_DYNAMIC_CONTENT_MAX_WIDTH; + container.size = CGSizeMake(width, CGFLOAT_MAX); + container.maximumNumberOfRows = 0; + YYTextLayout *layout = [YYTextLayout layoutWithContainer:container text:self.dynamicContentLabel.attributedText]; + isHiddenFlodButton = layout.rowCount <= 6; + } + [self mew_setFoldButtonHidden:isHiddenFlodButton]; +} + + +#pragma mark - Action +/// 选中展开和收起 +- (void)foldButtonAction:(UIButton *)sender { + sender.selected = !sender.selected; + self.dynamicModel.isFold = !sender.selected; + if ([self.delegate respondsToSelector:@selector(didSelectDynamicMomentsContentView:foldMomentsModel:)]) { + [self.delegate didSelectDynamicMomentsContentView:self foldMomentsModel:self.dynamicModel]; + } +} + +#pragma mark - Private Method +- (void)mew_setFoldButtonHidden:(BOOL)isHidden { + self.dynamicFoldButton.hidden = isHidden; + CGFloat foldHeight = isHidden ? 0 : MEW_DYNAMIC_FOLD_HEIGHT; + [self.dynamicFoldButton mas_remakeConstraints:^(MASConstraintMaker *make) { + make.height.mas_equalTo(foldHeight); + }]; +} + +#pragma mark - Get +- (UIStackView *)dynamicVerStackView { + if (!_dynamicVerStackView) { + _dynamicVerStackView = [[UIStackView alloc] init]; + _dynamicVerStackView.axis = UILayoutConstraintAxisVertical; + _dynamicVerStackView.distribution = UIStackViewDistributionFill; + _dynamicVerStackView.alignment = UIStackViewAlignmentLeading; + _dynamicVerStackView.spacing = 0; + } + return _dynamicVerStackView; +} + + +- (UILabel *)dynamicContentLabel { + if (!_dynamicContentLabel) { + _dynamicContentLabel = [[UILabel alloc] init]; + _dynamicContentLabel.numberOfLines = 0; + _dynamicContentLabel.font = [UIFont systemFontOfSize:15]; + _dynamicContentLabel.textColor = UIColorMewRGBAlpha(0x333333, 1); + _dynamicContentLabel.preferredMaxLayoutWidth = MEW_DYNAMIC_CONTENT_MAX_WIDTH; + _dynamicContentLabel.lineBreakMode = NSLineBreakByWordWrapping; + } + return _dynamicContentLabel; +} + +- (UIButton *)dynamicFoldButton { + if (!_dynamicFoldButton) { + _dynamicFoldButton = [UIButton buttonWithType:UIButtonTypeCustom]; + [_dynamicFoldButton setTitle:@"展开" forState:UIControlStateNormal]; + [_dynamicFoldButton setTitle:@"收起" forState:UIControlStateSelected]; + [_dynamicFoldButton setTitleColor:UIColorMewFromRGB(0x34A7FF) forState:UIControlStateNormal]; + [_dynamicFoldButton setTitleColor:UIColorMewFromRGB(0x34A7FF) forState:UIControlStateSelected]; + _dynamicFoldButton.titleLabel.font = [UIFont systemFontOfSize:15]; + _dynamicFoldButton.hidden = YES; + [_dynamicFoldButton addTarget:self action:@selector(foldButtonAction:) forControlEvents:UIControlEventTouchUpInside]; + } + return _dynamicFoldButton; +} + + + + + +@end diff --git a/yinmeng-ios/yinmeng-ios/Main/Dynamic/View/MewDynamicMomentsPhotoView.h b/yinmeng-ios/yinmeng-ios/Main/Dynamic/View/MewDynamicMomentsPhotoView.h new file mode 100644 index 0000000..e7a6dce --- /dev/null +++ b/yinmeng-ios/yinmeng-ios/Main/Dynamic/View/MewDynamicMomentsPhotoView.h @@ -0,0 +1,27 @@ +// +// MewDynamicMomentsPhotoView.h +// yinmeng-ios +// +// Created by 触海 on 2023/12/22. +// + +#import +@class MewDynamicPhotoMomentModel, MewDynamicMomentsPhotoView; + +NS_ASSUME_NONNULL_BEGIN + +@protocol MewDynamicMomentsPhotoViewDelegate +/// 选中某张图片 +- (void)didSelectDynamicMomentsPhotoView:(MewDynamicMomentsPhotoView *)contentView photoIndex:(NSInteger)photoIndex; +@end + +@interface MewDynamicMomentsPhotoView : UIView +/// 是否是个人资料页下的动态, 默认 - 不是 +@property (nonatomic, assign) BOOL isPersonalDynamic; +/// 图片数组 +@property (nonatomic, copy) NSArray *dynamicPhotos; +@property (nonatomic, weak) id delegate; + +@end + +NS_ASSUME_NONNULL_END diff --git a/yinmeng-ios/yinmeng-ios/Main/Dynamic/View/MewDynamicMomentsPhotoView.m b/yinmeng-ios/yinmeng-ios/Main/Dynamic/View/MewDynamicMomentsPhotoView.m new file mode 100644 index 0000000..01fe469 --- /dev/null +++ b/yinmeng-ios/yinmeng-ios/Main/Dynamic/View/MewDynamicMomentsPhotoView.m @@ -0,0 +1,110 @@ +// +// MewDynamicMomentsPhotoView.m +// yinmeng-ios +// +// Created by 触海 on 2023/12/22. +// + +#import "MewDynamicMomentsPhotoView.h" +///View +#import "NetImageView.h" +/// Model +#import "MewDynamicPhotoMomentModel.h" +/// Tool +#import "MewDynamicLayoutConfig.h" +/// Third +#import + + +@interface MewDynamicMomentsPhotoView () +@property (nonatomic, strong) NSMutableArray *photoImageArray; +@end + + +@implementation MewDynamicMomentsPhotoView + +#pragma mark - Init +- (instancetype)initWithFrame:(CGRect)frame { + self = [super initWithFrame:frame]; + if (self) { + [self setUI]; + } + return self; +} + +#pragma mark - Set +- (void)setDynamicPhotos:(NSArray *)dynamicPhotos { + _dynamicPhotos = dynamicPhotos; + if (_dynamicPhotos.count == 0) { return; } + if (_dynamicPhotos.count > self.photoImageArray.count) { return; } + + for (int i = 0; i < self.photoImageArray.count; i++) { + BOOL isHidden = i >= _dynamicPhotos.count; + self.photoImageArray[i].hidden = isHidden; + if (i >= _dynamicPhotos.count) continue; + self.photoImageArray[i].imageUrl = _dynamicPhotos[i].resUrl; + } + + /// 设置图片的布局 + CGFloat photoWidthHeight = [self getPhotoWidthHeight]; //宽度 + for (int i = 0; i < _dynamicPhotos.count; i++) { + CGFloat marginLeft = (i % 3) * (photoWidthHeight + MEW_DYNAMIC_PIC_SPACE); + CGFloat marginTop = (i / 3) * (photoWidthHeight + MEW_DYNAMIC_PIC_SPACE); + NetImageView *photoImage = self.photoImageArray[i]; + [photoImage mas_makeConstraints:^(MASConstraintMaker *make) { + make.width.height.mas_equalTo(photoWidthHeight); + make.left.mas_equalTo(marginLeft); + make.top.mas_equalTo(marginTop); + }]; + } +} + +- (CGFloat)getPhotoWidthHeight { + if (_dynamicPhotos.count == 1) { + return MEW_DYNAMIC_PIC_ONE_WIDTH; + } else if (_dynamicPhotos.count == 2) { + return self.isPersonalDynamic ? MEW_MINE_DYNAMIC_CONTENT_MAX_WIDTH : (MEW_MINE_DYNAMIC_CONTENT_MAX_WIDTH - MEW_DYNAMIC_PIC_SPACE) / 2; + } else { + return self.isPersonalDynamic ? MEW_MINE_DYNAMIC_CONTENT_MAX_WIDTH : (MEW_MINE_DYNAMIC_CONTENT_MAX_WIDTH - MEW_DYNAMIC_PIC_SPACE * 2) / 3; + } +} + + +#pragma mark - UI +- (void)setUI { + for (int i = 0; i < 9; i++) { + NetImageConfig * config = [[NetImageConfig alloc]init]; + config.imageType = ImageTypeMonentsPhoto; + config.placeHolder = [UIImageConstant defaultAvatarPlaceholder]; + NetImageView *photoImageView = [[NetImageView alloc] initWithConfig:config]; + photoImageView.layer.masksToBounds = YES; + photoImageView.layer.cornerRadius = 12; + photoImageView.contentMode = UIViewContentModeScaleAspectFill; + photoImageView.userInteractionEnabled = YES; + photoImageView.hidden = YES; + photoImageView.tag = i; + UITapGestureRecognizer *tap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(photoImageTapGesture:)]; + [photoImageView addGestureRecognizer:tap]; + [self addSubview:photoImageView]; + [self.photoImageArray addObject:photoImageView]; + } +} + + +#pragma mark - Action +- (void)photoImageTapGesture:(UITapGestureRecognizer *)tap { + NSInteger photoIndex = tap.view.tag; + if ([self.delegate respondsToSelector:@selector(didSelectDynamicMomentsPhotoView:photoIndex:)]) { + [self.delegate didSelectDynamicMomentsPhotoView:self photoIndex:photoIndex]; + } +} + +#pragma mark - Get +- (NSMutableArray *)photoImageArray { + if (!_photoImageArray) { + _photoImageArray = [NSMutableArray array]; + } + return _photoImageArray; +} + +@end diff --git a/yinmeng-ios/yinmeng-ios/Main/Dynamic/View/MewDynamicMomentsToolBarView.h b/yinmeng-ios/yinmeng-ios/Main/Dynamic/View/MewDynamicMomentsToolBarView.h new file mode 100644 index 0000000..9e700ea --- /dev/null +++ b/yinmeng-ios/yinmeng-ios/Main/Dynamic/View/MewDynamicMomentsToolBarView.h @@ -0,0 +1,34 @@ +// +// MewDynamicMomentsToolBarView.h +// yinmeng-ios +// +// Created by 触海 on 2023/12/22. +// + +#import +@class MewDynamicMomentModel, MewDynamicMomentsToolBarView; + +NS_ASSUME_NONNULL_BEGIN +@protocol MewDynamicMomentsToolBarViewDelegate +@optional +/// 举报 +- (void)didSelectDynamicMomentsToolBarView:(MewDynamicMomentsToolBarView *)contentView reportModel:(MewDynamicMomentModel *)reportModel; +/// 点赞 +- (void)didSelectDynamicMomentsToolBarView:(MewDynamicMomentsToolBarView *)contentView likeModel:(MewDynamicMomentModel *)likeModel; +/// 评论 +- (void)didSelectDynamicMomentsToolBarView:(MewDynamicMomentsToolBarView *)contentView commentModel:(MewDynamicMomentModel *)commentModel; +/// 删除 +- (void)didSelectDynamicMomentsToolBarView:(MewDynamicMomentsToolBarView *)contentView deleteModel:(MewDynamicMomentModel *)deleteModel; + +@end + +@interface MewDynamicMomentsToolBarView : UIView +/// 是否是个人资料页下的动态, 默认 - 不是 +@property (nonatomic, assign) BOOL isPersonalDynamic; +/// tool bar 的数据 +@property (nonatomic, strong) MewDynamicMomentModel *toolBarModel; + +@property (nonatomic, weak) id delegate; +@end + +NS_ASSUME_NONNULL_END diff --git a/yinmeng-ios/yinmeng-ios/Main/Dynamic/View/MewDynamicMomentsToolBarView.m b/yinmeng-ios/yinmeng-ios/Main/Dynamic/View/MewDynamicMomentsToolBarView.m new file mode 100644 index 0000000..375c73a --- /dev/null +++ b/yinmeng-ios/yinmeng-ios/Main/Dynamic/View/MewDynamicMomentsToolBarView.m @@ -0,0 +1,305 @@ +// +// MewDynamicMomentsToolBarView.m +// yinmeng-ios +// +// Created by 触海 on 2023/12/22. +// + +#import "MewDynamicMomentsToolBarView.h" +/// Tool +#import "MewThemeColor.h" +#import "MewMacro.h" +#import "MewAlertPopup.h" +#import "MewHUDTool.h" +/// Third +#import +/// Model +#import "MewDynamicMomentModel.h" +#import "MewAccountInfoStorage.h" +#import "MewShareItemModel.h" +#import "MewPushShareModel.h" +/// View +#import "MewShareView.h" + +@interface MewDynamicMomentsToolBarView () +///更多 +@property (nonatomic,strong) UIButton *toolMoreButton; +///喜欢的容器 +@property (nonatomic,strong) UIView * toolLikeContainerView; +///喜欢 +@property (nonatomic,strong) UIButton *toolLikeButton; +///喜欢的个数 +@property (nonatomic,strong) UILabel *toolLikeNumLabel; +///评论的容器 +@property (nonatomic,strong) UIView * toolCommentContainerView; +///评论 +@property (nonatomic,strong) UIButton *toolCommentButton; +///评论数 +@property (nonatomic,strong) UILabel *toolCommentNumLabel; +///分享 +@property (nonatomic,strong) UIButton *toolShareButton; +///分割线 +@property (nonatomic,strong) UIView * lineView; + +@end + +@implementation MewDynamicMomentsToolBarView + +#pragma mark - Init +- (instancetype)initWithFrame:(CGRect)frame { + self = [super initWithFrame:frame]; + if (self) { + [self setUI]; + } + return self; +} + + +#pragma mark - Action +/// 自己的文章 - 删除 别人的文章 - 举报 +- (void)moreButtonAction { + BOOL isMine = self.toolBarModel.uid.integerValue == [MewAccountInfoStorage instance].mew_getUid.integerValue; + MewAlertPopupType type = isMine ? Mew_AlertPopupType_Cancel_Article : Mew_AlertPopupType_Report_Article; + [MewAlertPopup Mew_AlertPopupWithAlertType:type confirm:^{ + if (self.delegate && isMine) { + /// 删除文章 + [self.delegate didSelectDynamicMomentsToolBarView:self deleteModel:self.toolBarModel]; + } else { + /// 举报文章 + [self.delegate didSelectDynamicMomentsToolBarView:self reportModel:self.toolBarModel]; + } + } cancel:nil]; +} + +/// 点赞文章 +- (void)likeButtonAction { + if (self.delegate) { + [self.delegate didSelectDynamicMomentsToolBarView:self likeModel:self.toolBarModel]; + } +} + +/// 评论文章 +- (void)commonButtonAction { + if (self.delegate) { + [self.delegate didSelectDynamicMomentsToolBarView:self commentModel:self.toolBarModel]; + } +} + +/// 分享文章 +- (void)shareButtonAction { + NSArray *shareItemModel = [MewShareItemModel Mew_GetDynamicShareModel]; + MewPushShareModel *shareModel = [MewPushShareModel Mew_SetPushModelWithChannelType:MewShareChannelType_Dynamic channelModel: self.toolBarModel]; + + CGSize itemSize = CGSizeMake((KScreenWidth - 2 * 15) / 4, 65); + MewShareView *shareView = [[MewShareView alloc] initWithSize:itemSize items:shareItemModel shareModel:shareModel]; + shareView.delegate = self; + [TTPopup popupView:shareView style:TTPopupStyleActionSheet]; + +} + + +#pragma mark - MewShareViewDelegate +/// 分享成功 +- (void)didSelectShareView:(MewShareView *)shareView success:(MewPushShareModel *)model { + +} +/// 分享失败 +- (void)didSelectShareView:(MewShareView *)shareView failure:(NSString *)failure { + [TTPopup dismiss]; + [MewHUDTool showErrorWithMessage:failure]; +} + + +#pragma mark - UI +- (void)setUI { + [self addSubview:self.toolMoreButton]; + [self addSubview:self.toolLikeContainerView]; + [self addSubview:self.toolCommentContainerView]; + [self addSubview:self.toolShareButton]; + [self addSubview:self.lineView]; + + [self.toolLikeContainerView addSubview:self.toolLikeButton]; + [self.toolLikeContainerView addSubview:self.toolLikeNumLabel]; + [self.toolCommentContainerView addSubview:self.toolCommentButton]; + [self.toolCommentContainerView addSubview:self.toolCommentNumLabel]; + [self setUILayout]; +} + +- (void)setUILayout { + [self.toolMoreButton mas_makeConstraints:^(MASConstraintMaker *make) { + make.left.mas_equalTo(self).offset(self.isPersonalDynamic ? 70 : -20); + make.top.mas_equalTo(self).offset(24); + make.size.mas_equalTo(CGSizeMake(22, 22)); + }]; + + [self.toolLikeContainerView mas_makeConstraints:^(MASConstraintMaker *make) { + make.height.mas_equalTo(22); + make.centerY.mas_equalTo(self.toolMoreButton); + if (self.isPersonalDynamic) { + make.left.mas_equalTo(self.toolLikeButton.mas_left); + make.right.mas_equalTo(self.toolCommentContainerView.mas_left).offset(-12); + } else { + make.left.mas_equalTo(18); + make.right.mas_equalTo(self.toolLikeNumLabel.mas_right); + } + + }]; + + [self.toolLikeNumLabel mas_makeConstraints:^(MASConstraintMaker *make) { + if (self.isPersonalDynamic) { + make.right.mas_equalTo(self.toolLikeContainerView.mas_right).offset(-3); + } else { + make.left.mas_equalTo(self.toolLikeButton.mas_right).offset(3); + } + make.centerY.mas_equalTo(self.toolLikeContainerView); + }]; + + [self.toolLikeButton mas_makeConstraints:^(MASConstraintMaker *make) { + make.size.mas_equalTo(CGSizeMake(22, 22)); + make.centerY.mas_equalTo(self.toolLikeContainerView); + if (self.isPersonalDynamic) { + make.right.mas_equalTo(self.toolLikeNumLabel.mas_left).offset(-3); + } else { + make.left.mas_equalTo(self.toolLikeContainerView.mas_left); + } + }]; + + [self.toolCommentContainerView mas_makeConstraints:^(MASConstraintMaker *make) { + make.height.mas_equalTo(22); + make.centerY.mas_equalTo(self.toolMoreButton); + if (self.isPersonalDynamic) { + make.left.mas_equalTo(self.toolCommentButton.mas_left).offset(-2); + make.right.mas_equalTo(self.toolShareButton.mas_left).offset(-12); + } else { + make.left.mas_equalTo(self.toolLikeContainerView.mas_left).offset(65); + make.right.mas_equalTo(self.toolCommentNumLabel.mas_right).offset(-2); + } + + }]; + + [self.toolCommentButton mas_makeConstraints:^(MASConstraintMaker *make) { + make.size.mas_equalTo(CGSizeMake(22, 22)); + make.centerY.mas_equalTo(self.toolCommentContainerView); + if (self.isPersonalDynamic) { + make.right.mas_equalTo(self.toolCommentNumLabel.mas_left).offset(-2); + } else { + make.left.mas_equalTo(self.toolCommentContainerView.mas_left).offset(2); + } + }]; + + [self.toolCommentNumLabel mas_makeConstraints:^(MASConstraintMaker *make) { + if (self.isPersonalDynamic) { + make.right.mas_equalTo(self.toolCommentContainerView.mas_right).offset(-3); + } else { + make.left.mas_equalTo(self.toolCommentButton.mas_right).offset(3); + } + make.centerY.mas_equalTo(self.toolCommentContainerView); + }]; + + [self.toolShareButton mas_makeConstraints:^(MASConstraintMaker *make) { + make.size.mas_equalTo(CGSizeMake(22, 22)); + make.centerY.mas_equalTo(self.toolMoreButton); + if (self.isPersonalDynamic) { + make.right.mas_equalTo(self).offset(-32); + } else { + make.left.mas_equalTo(self.toolCommentContainerView.mas_left).offset(65); + } + }]; + + self.lineView.hidden = self.isPersonalDynamic; + if (self.isPersonalDynamic) return; + [self.lineView mas_makeConstraints:^(MASConstraintMaker *make) { + make.left.right.mas_equalTo(self).inset(16); + make.bottom.mas_equalTo(self); + make.height. mas_equalTo(1); + }]; +} + +#pragma mark - Get +- (UIButton *)toolMoreButton { + if (!_toolMoreButton) { + _toolMoreButton = [UIButton buttonWithType:UIButtonTypeCustom]; + [_toolMoreButton setImage:[UIImage imageNamed:@"monents_info_like_report"] forState:UIControlStateNormal]; + [_toolMoreButton setImage:[UIImage imageNamed:@"monents_info_like_report"] forState:UIControlStateSelected]; + [_toolMoreButton addTarget:self action:@selector(moreButtonAction) forControlEvents:UIControlEventTouchUpInside]; + } + return _toolMoreButton; +} + + +- (UIView *)toolLikeContainerView { + if (!_toolLikeContainerView) { + _toolLikeContainerView = [[UIView alloc] init]; + _toolLikeContainerView.backgroundColor = UIColor.clearColor; + } + return _toolLikeContainerView; +} + +- (UIButton *)toolLikeButton { + if (!_toolLikeButton) { + _toolLikeButton = [[UIButton alloc] init]; + [_toolLikeButton setImage:[UIImage imageNamed:@"monents_info_like_count_normal"] forState:UIControlStateNormal]; + [_toolLikeButton setImage:[UIImage imageNamed:@"monents_info_like_count_select"] forState:UIControlStateSelected]; + [_toolLikeButton addTarget:self action:@selector(likeButtonAction) forControlEvents:UIControlEventTouchUpInside]; + } + return _toolLikeButton; +} + +- (UILabel *)toolLikeNumLabel { + if (!_toolLikeNumLabel) { + _toolLikeNumLabel = [[UILabel alloc] init]; + _toolLikeNumLabel.font = kFontMedium(12); + _toolLikeNumLabel.textColor = MewThemeColor.mewMainTextColor; + } + return _toolLikeNumLabel; +} + + +- (UIView *)toolCommentContainerView { + if (!_toolCommentContainerView) { + _toolCommentContainerView = [[UIView alloc] init]; + _toolCommentContainerView.backgroundColor = UIColor.clearColor; + } + return _toolCommentContainerView; +} + +- (UIButton *)toolCommentButton { + if (!_toolCommentButton) { + _toolCommentButton = [[UIButton alloc] init]; + [_toolCommentButton setImage:[UIImage imageNamed:@"monents_info_comment_count"] forState:UIControlStateNormal]; + [_toolCommentButton setImage:[UIImage imageNamed:@"monents_info_comment_count"] forState:UIControlStateSelected]; + [_toolCommentButton addTarget:self action:@selector(commonButtonAction) forControlEvents:UIControlEventTouchUpInside]; + } + return _toolCommentButton; +} + +- (UILabel *)toolCommentNumLabel { + if (!_toolCommentNumLabel) { + _toolCommentNumLabel = [[UILabel alloc] init]; + _toolCommentNumLabel.font = kFontMedium(12); + _toolCommentNumLabel.textColor = MewThemeColor.mewMainTextColor; + } + return _toolCommentNumLabel; +} + + + +- (UIButton *)toolShareButton { + if (!_toolShareButton) { + _toolShareButton = [[UIButton alloc] init]; + [_toolShareButton setImage:[UIImage imageNamed:@"monents_info_like_share"] forState:UIControlStateNormal]; + [_toolShareButton setImage:[UIImage imageNamed:@"monents_info_like_share"] forState:UIControlStateSelected]; + [_toolShareButton addTarget:self action:@selector(shareButtonAction) forControlEvents:UIControlEventTouchUpInside]; + } + return _toolShareButton; +} + +- (UIView *)lineView { + if (!_lineView) { + _lineView = [[UIView alloc] init]; + _lineView.backgroundColor = MewThemeColor.mewDividerColor; + } + return _lineView; +} + +@end diff --git a/yinmeng-ios/yinmeng-ios/Main/Dynamic/View/MewDynamicMomentsTopicView.h b/yinmeng-ios/yinmeng-ios/Main/Dynamic/View/MewDynamicMomentsTopicView.h new file mode 100644 index 0000000..c5ce1a5 --- /dev/null +++ b/yinmeng-ios/yinmeng-ios/Main/Dynamic/View/MewDynamicMomentsTopicView.h @@ -0,0 +1,17 @@ +// +// MewDynamicMomentsTopicView.h +// yinmeng-ios +// +// Created by 触海 on 2023/12/22. +// + +#import +@class MewDynamicMomentModel; +NS_ASSUME_NONNULL_BEGIN + +@interface MewDynamicMomentsTopicView : UIView +/// 话题数据 +@property (nonatomic, strong) MewDynamicMomentModel *topicModel; +@end + +NS_ASSUME_NONNULL_END diff --git a/yinmeng-ios/yinmeng-ios/Main/Dynamic/View/MewDynamicMomentsTopicView.m b/yinmeng-ios/yinmeng-ios/Main/Dynamic/View/MewDynamicMomentsTopicView.m new file mode 100644 index 0000000..c68e52c --- /dev/null +++ b/yinmeng-ios/yinmeng-ios/Main/Dynamic/View/MewDynamicMomentsTopicView.m @@ -0,0 +1,143 @@ +// +// MewDynamicMomentsTopicView.m +// yinmeng-ios +// +// Created by 触海 on 2023/12/22. +// + +#import "MewDynamicMomentsTopicView.h" +///Third +#import +/// Tool +#import "MewThemeColor.h" +#import "UIImage+MewUtils.h" +#import "MewMacro.h" +#import "NSString+MewUtil.h" +/// Model +#import "MewDynamicMomentModel.h" + + +@interface MewDynamicMomentsTopicView() +///容器 +@property (nonatomic,strong) UIStackView *containerStackHorView; +///背景 +@property (nonatomic,strong) UIImageView *topicBgImageView; +///显示话题前面的# +@property (nonatomic,strong) UIImageView *topicImageView; +///显示话题 +@property (nonatomic,strong) UILabel *topicTitleLabel; +///显示时间 +@property (nonatomic,strong) UILabel *topicTimeLabel; +@end + +@implementation MewDynamicMomentsTopicView + + +#pragma mark - Init +- (instancetype)initWithFrame:(CGRect)frame { + self = [super initWithFrame:frame]; + if (self) { + [self setUI]; + } + return self; +} + +#pragma mark - Set +- (void)setTopicModel:(MewDynamicMomentModel *)topicModel { + _topicModel = topicModel; + if (_topicModel == nil) { return; } + /// 话题时间 + self.topicTimeLabel.text = [NSString Mew_StringWithTimeStamp:_topicModel.publishTime]; + /// 话题文本 + self.topicBgImageView.hidden = _topicModel.worldId == 0; + if (_topicModel.worldId == 0) { return; } + self.topicTitleLabel.text = _topicModel.worldName; +} + + +#pragma mark - UI +- (void)setUI { + [self addSubview:self.containerStackHorView]; + [self.containerStackHorView addArrangedSubview:self.topicBgImageView]; + [self.containerStackHorView addArrangedSubview:self.topicTimeLabel]; + + [self.topicBgImageView addSubview:self.topicImageView]; + [self.topicBgImageView addSubview:self.topicTitleLabel]; + [self setUILayout]; +} + +- (void)setUILayout { + [self.containerStackHorView mas_makeConstraints:^(MASConstraintMaker *make) { + make.edges.mas_equalTo(self); + }]; + + [self.topicBgImageView mas_makeConstraints:^(MASConstraintMaker *make) { + make.right.mas_equalTo(self.topicTitleLabel.mas_right).offset(9); + }]; + + [self.topicImageView mas_makeConstraints:^(MASConstraintMaker *make) { + make.left.mas_equalTo(self.topicBgImageView).offset(9); + make.width.height.mas_equalTo(20); + make.centerY.mas_equalTo(self.topicBgImageView); + }]; + + [self.topicTitleLabel mas_makeConstraints:^(MASConstraintMaker *make) { + make.left.mas_equalTo(self.topicImageView.mas_right).offset(4); + make.centerY.mas_equalTo(self.topicBgImageView); + }]; +} + +#pragma mark - Get +- (UIStackView *)containerStackHorView { + if (!_containerStackHorView) { + _containerStackHorView = [[UIStackView alloc] init]; + _containerStackHorView.axis = UILayoutConstraintAxisHorizontal; + _containerStackHorView.distribution = UIStackViewDistributionFill; + _containerStackHorView.alignment = UIStackViewAlignmentFill; + _containerStackHorView.spacing = 8; + } + return _containerStackHorView; +} + +- (UIImageView *)topicBgImageView { + if (!_topicBgImageView) { + _topicBgImageView = [[UIImageView alloc] init]; + _topicBgImageView.userInteractionEnabled = YES; + _topicBgImageView.image = [UIImage mew_gradientColorImageFromColors: + @[UIColorMewFromRGB(0xFFFCDD), + UIColorMewFromRGB(0xDFF9FF), + UIColorMewFromRGB(0xF4E5FF)] gradientType:MewGradientTypeLeftToRight imgSize:CGSizeMake(10, 10)]; + _topicBgImageView.layer.masksToBounds = YES; + _topicBgImageView.layer.cornerRadius = 8; + } + return _topicBgImageView; +} + +- (UIImageView *)topicImageView { + if (!_topicImageView) { + _topicImageView = [[UIImageView alloc] init]; + _topicImageView.userInteractionEnabled = YES; + _topicImageView.image = [UIImage imageNamed:@"monents_info_topic_icon"]; + } + return _topicImageView; +} + +- (UILabel *)topicTitleLabel { + if (!_topicTitleLabel) { + _topicTitleLabel = [[UILabel alloc] init]; + _topicTitleLabel.font = kFontBold(10); + _topicTitleLabel.textColor = MewThemeColor.mewMainTextColor; + } + return _topicTitleLabel; +} + +- (UILabel *)topicTimeLabel { + if (!_topicTimeLabel) { + _topicTimeLabel = [[UILabel alloc] init]; + _topicTimeLabel.font = kFontRegular(10); + _topicTimeLabel.textColor = MewThemeColor.mewThreeTextColor; + } + return _topicTimeLabel; +} + +@end diff --git a/yinmeng-ios/yinmeng-ios/Main/Login/View/MewView/MewLoginViewController.m b/yinmeng-ios/yinmeng-ios/Main/Login/View/MewView/MewLoginViewController.m index e31f080..7fa4009 100644 --- a/yinmeng-ios/yinmeng-ios/Main/Login/View/MewView/MewLoginViewController.m +++ b/yinmeng-ios/yinmeng-ios/Main/Login/View/MewView/MewLoginViewController.m @@ -465,7 +465,7 @@ typedef NS_ENUM(NSUInteger, XYLoginType) { __strong typeof(self) strongSelf = weakSelf; // 跳转用户协议 MewWebViewController * webVC = [[MewWebViewController alloc] init]; - webVC.url = URLWithType(kUserProtocalURL); + webVC.url = MewHtmlURLWithType(MewHtmlURLType_UserProtocal); [strongSelf.navigationController pushViewController:webVC animated:YES]; } longPressAction:nil]; @@ -478,7 +478,7 @@ typedef NS_ENUM(NSUInteger, XYLoginType) { __strong typeof(self) strongSelf = weakSelf; // 跳转隐私政策 MewWebViewController * webVC = [[MewWebViewController alloc] init]; - webVC.url = URLWithType(kPrivacyURL); + webVC.url = MewHtmlURLWithType(MewHtmlURLType_Privacy); [self.navigationController pushViewController:webVC animated:YES]; } longPressAction:nil]; [attString appendAttributedString:userAttString]; diff --git a/yinmeng-ios/yinmeng-ios/Main/Mine/View/Setting/MewMineAboutUsViewController.m b/yinmeng-ios/yinmeng-ios/Main/Mine/View/Setting/MewMineAboutUsViewController.m index a6fe0bf..32e73af 100644 --- a/yinmeng-ios/yinmeng-ios/Main/Mine/View/Setting/MewMineAboutUsViewController.m +++ b/yinmeng-ios/yinmeng-ios/Main/Mine/View/Setting/MewMineAboutUsViewController.m @@ -48,7 +48,7 @@ /// 跳转到隐私协议 - (void)mew_pushPrivacyView:(UITapGestureRecognizer *)tap { MewWebViewController *controller = [[MewWebViewController alloc] init]; - controller.url = URLWithType(kPrivacyURL); + controller.url = MewHtmlURLWithType(MewHtmlURLType_Privacy); [self.navigationController pushViewController:controller animated:NO]; } diff --git a/yinmeng-ios/yinmeng-ios/Main/Mine/View/Setting/MewMineSettingViewController.m b/yinmeng-ios/yinmeng-ios/Main/Mine/View/Setting/MewMineSettingViewController.m index 7b5f726..bb4fe13 100644 --- a/yinmeng-ios/yinmeng-ios/Main/Mine/View/Setting/MewMineSettingViewController.m +++ b/yinmeng-ios/yinmeng-ios/Main/Mine/View/Setting/MewMineSettingViewController.m @@ -148,7 +148,7 @@ { MewWebViewController *controller = [[MewWebViewController alloc] init]; - controller.url = URLWithType(kCancelAccout); + controller.url = MewHtmlURLWithType(MewHtmlURLType_CancelAccout); [self.navigationController pushViewController:controller animated:NO]; } break; diff --git a/yinmeng-ios/yinmeng-ios/Main/Mine/View/UserInfoDetailView/Sub/Dynamic/MewUserPersonalDynamicMomentTableCell.h b/yinmeng-ios/yinmeng-ios/Main/Mine/View/UserInfoDetailView/Sub/Dynamic/MewUserPersonalDynamicMomentTableCell.h new file mode 100644 index 0000000..1427e26 --- /dev/null +++ b/yinmeng-ios/yinmeng-ios/Main/Mine/View/UserInfoDetailView/Sub/Dynamic/MewUserPersonalDynamicMomentTableCell.h @@ -0,0 +1,19 @@ +// +// MewUserPersonalDynamicMomentTableCell.h +// yinmeng-ios +// +// Created by 触海 on 2023/12/22. +// + +#import +@class MewDynamicMomentModel; + +NS_ASSUME_NONNULL_BEGIN + +@interface MewUserPersonalDynamicMomentTableCell : UITableViewCell +/// 文章内容 +@property (nonatomic, strong) MewDynamicMomentModel *moment; + +@end + +NS_ASSUME_NONNULL_END diff --git a/yinmeng-ios/yinmeng-ios/Main/Mine/View/UserInfoDetailView/Sub/Dynamic/MewUserPersonalDynamicMomentTableCell.m b/yinmeng-ios/yinmeng-ios/Main/Mine/View/UserInfoDetailView/Sub/Dynamic/MewUserPersonalDynamicMomentTableCell.m new file mode 100644 index 0000000..232fe6d --- /dev/null +++ b/yinmeng-ios/yinmeng-ios/Main/Mine/View/UserInfoDetailView/Sub/Dynamic/MewUserPersonalDynamicMomentTableCell.m @@ -0,0 +1,37 @@ +// +// MewUserPersonalDynamicMomentTableCell.m +// yinmeng-ios +// +// Created by 触海 on 2023/12/22. +// + +#import "MewUserPersonalDynamicMomentTableCell.h" + +@interface MewUserPersonalDynamicMomentTableCell () + + + +@end + +@implementation MewUserPersonalDynamicMomentTableCell + +#pragma mark - Init +- (instancetype)initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(NSString *)reuseIdentifier { + self = [super initWithStyle:style reuseIdentifier:reuseIdentifier]; + if (self) { + [self setUI]; + } + return self; +} + +#pragma mark - UI +- (void)setUI { + [self setUILayout]; +} + +- (void)setUILayout { + +} + + +@end diff --git a/yinmeng-ios/yinmeng-ios/Main/Mine/View/UserInfoDetailView/Sub/Dynamic/MewUserPersonalDynamicViewController.h b/yinmeng-ios/yinmeng-ios/Main/Mine/View/UserInfoDetailView/Sub/Dynamic/MewUserPersonalDynamicViewController.h index ad9c44d..a7bf372 100644 --- a/yinmeng-ios/yinmeng-ios/Main/Mine/View/UserInfoDetailView/Sub/Dynamic/MewUserPersonalDynamicViewController.h +++ b/yinmeng-ios/yinmeng-ios/Main/Mine/View/UserInfoDetailView/Sub/Dynamic/MewUserPersonalDynamicViewController.h @@ -7,11 +7,16 @@ #import "MewMvpViewController.h" #import +@class MewDynamicMomentModel; NS_ASSUME_NONNULL_BEGIN @interface MewUserPersonalDynamicViewController : MewMvpViewController +/// 动态数据 +@property (nonatomic, strong) NSArray *monents; +/// scrollView +@property (nonatomic, copy) void(^scrollCallback)(UIScrollView *scrollView); @end NS_ASSUME_NONNULL_END diff --git a/yinmeng-ios/yinmeng-ios/Main/Mine/View/UserInfoDetailView/Sub/Dynamic/MewUserPersonalDynamicViewController.m b/yinmeng-ios/yinmeng-ios/Main/Mine/View/UserInfoDetailView/Sub/Dynamic/MewUserPersonalDynamicViewController.m index 5e5a56d..bc7aa24 100644 --- a/yinmeng-ios/yinmeng-ios/Main/Mine/View/UserInfoDetailView/Sub/Dynamic/MewUserPersonalDynamicViewController.m +++ b/yinmeng-ios/yinmeng-ios/Main/Mine/View/UserInfoDetailView/Sub/Dynamic/MewUserPersonalDynamicViewController.m @@ -6,8 +6,12 @@ // #import "MewUserPersonalDynamicViewController.h" +/// Model +#import "MewDynamicMomentModel.h" @interface MewUserPersonalDynamicViewController () +@property (nonatomic, strong) UITableView *dynamicTableView; +@property (nonatomic, strong) NSMutableArray *dynamicMonents; @end @@ -29,4 +33,26 @@ return self.view; } +#pragma mark - Get +- (UITableView *)dynamicTableView { + if (!_dynamicTableView) { + _dynamicTableView = [[UITableView alloc] initWithFrame:CGRectZero style:UITableViewStylePlain]; + _dynamicTableView.delegate = self; + _dynamicTableView.dataSource = self; + _dynamicTableView.tableFooterView = UIView.new; + _dynamicTableView.separatorStyle = UITableViewCellSeparatorStyleNone; + _dynamicTableView.backgroundColor = UIColor.clearColor; +// [_dynamicTableView registerClass:[XPMineMomentTableViewCell class] forCellReuseIdentifier:NSStringFromClass([XPMineMomentTableViewCell class])]; +// [_dynamicTableView registerClass:[XPMonentsEmptyTableViewCell class] forCellReuseIdentifier:NSStringFromClass([XPMonentsEmptyTableViewCell class])]; +// if (@available(iOS 11.0, *)) { +// _tableView.contentInsetAdjustmentBehavior = UIScrollViewContentInsetAdjustmentNever; +// } +// if (@available(iOS 15.0, *)) { +// _tableView.sectionHeaderTopPadding = 0; +// } + + } + return _dynamicTableView; +} + @end diff --git a/yinmeng-ios/yinmeng-ios/Main/Mine/View/UserInfoDetailView/Sub/Profile/GiftWall/MewUserPersonalGiftWallCollectionCell.m b/yinmeng-ios/yinmeng-ios/Main/Mine/View/UserInfoDetailView/Sub/Profile/GiftWall/MewUserPersonalGiftWallCollectionCell.m index 49e3bf4..ca7d9ee 100644 --- a/yinmeng-ios/yinmeng-ios/Main/Mine/View/UserInfoDetailView/Sub/Profile/GiftWall/MewUserPersonalGiftWallCollectionCell.m +++ b/yinmeng-ios/yinmeng-ios/Main/Mine/View/UserInfoDetailView/Sub/Profile/GiftWall/MewUserPersonalGiftWallCollectionCell.m @@ -49,9 +49,9 @@ [self.contrainerView mas_makeConstraints:^(MASConstraintMaker *make) { make.edges.mas_equalTo(self.contentView); }]; + [self.giftImageView mas_makeConstraints:^(MASConstraintMaker *make) { - make.left.mas_equalTo(7); - make.right.mas_equalTo(-7); + make.left.right.mas_equalTo(self.contentView).inset(7); make.top.mas_equalTo(2); make.height.mas_equalTo(self.giftImageView.mas_width); }]; diff --git a/yinmeng-ios/yinmeng-ios/Main/Mine/View/UserInfoDetailView/Sub/Profile/GiftWall/MewUserPersonalProfileGiftTableCell.h b/yinmeng-ios/yinmeng-ios/Main/Mine/View/UserInfoDetailView/Sub/Profile/GiftWall/MewUserPersonalProfileGiftTableCell.h index 2a7bbff..cdc2144 100644 --- a/yinmeng-ios/yinmeng-ios/Main/Mine/View/UserInfoDetailView/Sub/Profile/GiftWall/MewUserPersonalProfileGiftTableCell.h +++ b/yinmeng-ios/yinmeng-ios/Main/Mine/View/UserInfoDetailView/Sub/Profile/GiftWall/MewUserPersonalProfileGiftTableCell.h @@ -6,11 +6,20 @@ // #import +@class MewUserGiftWallModel, MewUserPersonalProfileGiftTableCell; NS_ASSUME_NONNULL_BEGIN -@interface MewUserPersonalProfileGiftTableCell : UITableViewCell +@protocol MewUserPersonalProfileGiftTableCellDelegate +- (void)didsSelectPersonalProfileMoreGiftTableCell:(MewUserPersonalProfileGiftTableCell *)cell; +@end +@interface MewUserPersonalProfileGiftTableCell : UITableViewCell +/// 普通礼物 +@property (nonatomic, strong) NSArray *normalGiftModels; +/// 幸运礼物 +@property (nonatomic, strong) NSArray *luckyGiftModels; +@property (nonatomic, weak) id delegate; @end NS_ASSUME_NONNULL_END diff --git a/yinmeng-ios/yinmeng-ios/Main/Mine/View/UserInfoDetailView/Sub/Profile/GiftWall/MewUserPersonalProfileGiftTableCell.m b/yinmeng-ios/yinmeng-ios/Main/Mine/View/UserInfoDetailView/Sub/Profile/GiftWall/MewUserPersonalProfileGiftTableCell.m index 2631dc4..429071d 100644 --- a/yinmeng-ios/yinmeng-ios/Main/Mine/View/UserInfoDetailView/Sub/Profile/GiftWall/MewUserPersonalProfileGiftTableCell.m +++ b/yinmeng-ios/yinmeng-ios/Main/Mine/View/UserInfoDetailView/Sub/Profile/GiftWall/MewUserPersonalProfileGiftTableCell.m @@ -16,22 +16,21 @@ /// Third #import -@interface MewUserPersonalProfileGiftTableCell() +@interface MewUserPersonalProfileGiftTableCell() ///背景 -@property (nonatomic,strong) UIImageView * backImageView; +@property (nonatomic,strong) UIImageView * containerImageView; ///显示更多 -@property (nonatomic,strong) UIButton *arrowButton; +@property (nonatomic,strong) UIButton *rightNextButton; ///标题 -@property (nonatomic,strong) UILabel *titleLabel; - +@property (nonatomic,strong) UILabel *contentTitleLabel; /// 分页 -@property (nonatomic, strong) MewCategoryTitleContainerView *titleView; +@property (nonatomic, strong) MewCategoryTitleContainerView *categoryTitleView; ///分页ContainerView -@property (nonatomic, strong) JXCategoryListContainerView *containerView; +@property (nonatomic, strong) JXCategoryListContainerView *categoryListView; ///普通礼物 -@property (nonatomic,strong) MewUserPersonalProfileGiftView *normalGiftView; +@property (nonatomic,strong) MewUserPersonalProfileGiftView *normalProfileGiftView; ///幸运礼物 -@property (nonatomic,strong) MewUserPersonalProfileGiftView *luckyGiftView; +@property (nonatomic,strong) MewUserPersonalProfileGiftView *luckyProfileGiftView; @property (nonatomic, copy) NSArray *titles; @end @@ -42,21 +41,12 @@ self = [super initWithStyle:style reuseIdentifier:reuseIdentifier]; if (self) { self.titles = @[@"普通礼物", @"幸运礼物"]; + [self setUI]; } return self; } -#pragma mark - UI -- (void)setUI { - [self setUILayout]; -} - -- (void)setUILayout { - -} - - #pragma mark - JXCategoryViewDelegate - (NSInteger)numberOfListsInlistContainerView:(JXCategoryListContainerView *)listContainerView { return self.titles.count; @@ -64,83 +54,168 @@ - (id)listContainerView:(JXCategoryListContainerView *)listContainerView initListForIndex:(NSInteger)index { if (index == 0) { - return self.normalGiftView; + return self.normalProfileGiftView; } else { - return self.luckyGiftView; + return self.luckyProfileGiftView; } } +#pragma mark - Action +- (void)rightNextButtonAction { + if ([self.delegate respondsToSelector:@selector(didsSelectPersonalProfileMoreGiftTableCell:)]) { + [self.delegate didsSelectPersonalProfileMoreGiftTableCell:self]; + } +} + +#pragma mark - Set +- (void)setNormalGiftModels:(NSArray *)normalGiftModels { + _normalGiftModels = normalGiftModels; + if (_normalGiftModels.count == 0) { + return; + } + + if (_normalGiftModels.count > 12) { + NSMutableArray *mutaArrays = [_normalGiftModels mutableCopy]; + _normalGiftModels = [mutaArrays subarrayWithRange:NSMakeRange(0, 12)]; + } + + self.normalProfileGiftView.giftModels = _normalGiftModels; +} + +- (void)setLuckyGiftModels:(NSArray *)luckyGiftModels { + _luckyGiftModels = luckyGiftModels; + + if (_luckyGiftModels.count == 0) { + return; + } + + if (_luckyGiftModels.count > 12) { + NSMutableArray *mutaArrays = [_luckyGiftModels mutableCopy]; + _luckyGiftModels = [mutaArrays subarrayWithRange:NSMakeRange(0, 12)]; + } + + self.luckyProfileGiftView.giftModels = _luckyGiftModels; +} + +#pragma mark - UI +- (void)setUI { + self.backgroundColor = [UIColor clearColor]; + self.selectionStyle = UITableViewCellSelectionStyleNone; + + [self.contentView addSubview:self.containerImageView]; + [self.containerImageView addSubview:self.contentTitleLabel]; + [self.containerImageView addSubview:self.rightNextButton]; + [self.containerImageView addSubview:self.categoryTitleView]; + [self.containerImageView addSubview:self.categoryListView]; + [self setUILayout]; +} + +- (void)setUILayout { + [self.containerImageView mas_makeConstraints:^(MASConstraintMaker *make) { + make.left.right.mas_equalTo(self.contentView).inset(0); + make.top.mas_equalTo(self.contentView); + make.bottom.mas_equalTo(self.contentView).offset(-15); + }]; + + [self.contentTitleLabel mas_makeConstraints:^(MASConstraintMaker *make) { + make.left.mas_equalTo(self.containerImageView).offset(15); + make.top.mas_equalTo(self.containerImageView).offset(12); + }]; + + [self.rightNextButton mas_makeConstraints:^(MASConstraintMaker *make) { + make.size.mas_equalTo(CGSizeMake(13, 22)); + make.centerY.mas_equalTo(self.categoryTitleView); + make.right.mas_equalTo(self.containerImageView).offset(-15); + }]; + + [self.categoryTitleView mas_makeConstraints:^(MASConstraintMaker *make) { + make.centerX.mas_equalTo(self.containerImageView); + make.width.mas_equalTo(100 * 2 + 20); + make.height.mas_equalTo(30); + make.top.mas_equalTo(self.contentTitleLabel.mas_bottom).offset(23); + }]; + + [self.categoryListView mas_makeConstraints:^(MASConstraintMaker *make) { + make.left.right.bottom.mas_equalTo(self.containerImageView); + make.top.mas_equalTo(self.categoryTitleView.mas_bottom).offset(20); + }]; +} + + + #pragma mark - Get -- (UIImageView *)backImageView { - if (!_backImageView) { - _backImageView = [[UIImageView alloc] init]; - _backImageView.userInteractionEnabled = YES; - _backImageView.backgroundColor = MewThemeColor.mewAppCellBackgroundColor; +- (UIImageView *)containerImageView { + if (!_containerImageView) { + _containerImageView = [[UIImageView alloc] init]; + _containerImageView.userInteractionEnabled = YES; + _containerImageView.backgroundColor = MewThemeColor.mewAppCellBackgroundColor; } - return _backImageView; + return _containerImageView; } -- (UILabel *)titleLabel { - if (!_titleLabel) { - _titleLabel = [[UILabel alloc] init]; - _titleLabel.text = @"礼物墙"; - _titleLabel.font = [UIFont systemFontOfSize:16 weight:UIFontWeightMedium]; - _titleLabel.textColor = MewThemeColor.mewMainTextColor; +- (UILabel *)contentTitleLabel { + if (!_contentTitleLabel) { + _contentTitleLabel = [[UILabel alloc] init]; + _contentTitleLabel.text = @"礼物墙"; + _contentTitleLabel.font = kFontMedium(16); + _contentTitleLabel.textColor = MewThemeColor.mewMainTextColor; } - return _titleLabel; + return _contentTitleLabel; } -- (UIButton *)arrowButton { - if (!_arrowButton) { - _arrowButton = [UIButton buttonWithType:UIButtonTypeCustom]; - [_arrowButton setImage:[UIImage imageNamed:@"room_setting_arrow"] forState:UIControlStateNormal]; - [_arrowButton setImage:[UIImage imageNamed:@"room_setting_arrow"] forState:UIControlStateSelected]; - [_arrowButton addTarget:self action:@selector(arrowButtonAction:) forControlEvents:UIControlEventTouchUpInside]; - [_arrowButton mew_setEnlargeEdgeWithTop:10 right:10 bottom:10 left:10]; +- (UIButton *)rightNextButton { + if (!_rightNextButton) { + _rightNextButton = [[UIButton alloc] init]; + [_rightNextButton setImage:[UIImage imageNamed:@"common_gray_next_button"] forState:UIControlStateNormal]; + [_rightNextButton setImage:[UIImage imageNamed:@"common_gray_next_button"] forState:UIControlStateSelected]; + [_rightNextButton addTarget:self action:@selector(rightNextButtonAction) forControlEvents:UIControlEventTouchUpInside]; + [_rightNextButton mew_setEnlargeEdgeWithTop:10 right:10 bottom:10 left:10]; } - return _arrowButton; + return _rightNextButton; } -- (MewCategoryTitleContainerView *)titleView { - if (!_titleView) { - _titleView = [[MewCategoryTitleContainerView alloc] init]; - _titleView.titles = self.titles; - _titleView.titleView.titleFont = kFontMedium(14); - _titleView.titleView.titleSelectedFont = kFontMedium(18); - _titleView.titleView.contentEdgeInsetLeft = 20; - _titleView.titleView.listContainer = self.containerView; +- (MewCategoryTitleContainerView *)categoryTitleView { + if (!_categoryTitleView) { + _categoryTitleView = [[MewCategoryTitleContainerView alloc] init]; + _categoryTitleView.titles = self.titles; + _categoryTitleView.titleView.titleFont = kFontMedium(14); + _categoryTitleView.titleView.titleSelectedFont = kFontMedium(14); + _categoryTitleView.titleView.contentEdgeInsetLeft = 20; + _categoryTitleView.titleView.listContainer = self.categoryListView; + _categoryTitleView.titleView.titleLabelAnchorPointStyle = JXCategoryTitleLabelAnchorPointStyleCenter; + _categoryTitleView.titleView.contentScrollViewClickTransitionAnimationEnabled = NO; JXCategoryIndicatorImageView *lineView = [[JXCategoryIndicatorImageView alloc] init]; lineView.indicatorImageViewSize = CGSizeMake(13, 4); lineView.verticalMargin = 0; lineView.indicatorImageView.image = [UIImage imageNamed:@"mew_home_yellow_indicator_small"]; - _titleView.titleView.indicators = @[lineView]; + _categoryTitleView.titleView.indicators = @[lineView]; } - return _titleView; + return _categoryTitleView; } -- (JXCategoryListContainerView *)containerView { - if (!_containerView) { - _containerView = [[JXCategoryListContainerView alloc] initWithType:JXCategoryListContainerType_ScrollView delegate:self]; - _containerView.defaultSelectedIndex = 0; - _containerView.scrollView.tag = 1009; +- (JXCategoryListContainerView *)categoryListView { + if (!_categoryListView) { + _categoryListView = [[JXCategoryListContainerView alloc] initWithType:JXCategoryListContainerType_ScrollView delegate:self]; + _categoryListView.defaultSelectedIndex = 0; + _categoryListView.scrollView.tag = 1009; } - return _containerView; + return _categoryListView; } -- (MewUserPersonalProfileGiftView *)normalGiftView { - if (!_normalGiftView) { - _normalGiftView = [[MewUserPersonalProfileGiftView alloc] init]; +- (MewUserPersonalProfileGiftView *)normalProfileGiftView { + if (!_normalProfileGiftView) { + _normalProfileGiftView = [[MewUserPersonalProfileGiftView alloc] init]; } - return _normalGiftView; + return _normalProfileGiftView; } -- (MewUserPersonalProfileGiftView *)luckyGiftView { - if (!_luckyGiftView) { - _luckyGiftView = [[MewUserPersonalProfileGiftView alloc] init]; +- (MewUserPersonalProfileGiftView *)luckyProfileGiftView { + if (!_luckyProfileGiftView) { + _luckyProfileGiftView = [[MewUserPersonalProfileGiftView alloc] init]; } - return _luckyGiftView; + return _luckyProfileGiftView; } diff --git a/yinmeng-ios/yinmeng-ios/Main/Mine/View/UserInfoDetailView/Sub/Profile/GiftWall/MewUserPersonalProfileGiftView.h b/yinmeng-ios/yinmeng-ios/Main/Mine/View/UserInfoDetailView/Sub/Profile/GiftWall/MewUserPersonalProfileGiftView.h index 219fc58..58f6745 100644 --- a/yinmeng-ios/yinmeng-ios/Main/Mine/View/UserInfoDetailView/Sub/Profile/GiftWall/MewUserPersonalProfileGiftView.h +++ b/yinmeng-ios/yinmeng-ios/Main/Mine/View/UserInfoDetailView/Sub/Profile/GiftWall/MewUserPersonalProfileGiftView.h @@ -7,13 +7,14 @@ #import #import +@class MewUserGiftWallModel; NS_ASSUME_NONNULL_BEGIN @interface MewUserPersonalProfileGiftView : UIView /// 礼物数据 -@property (nonatomic, strong) NSArray *giftArray; +@property (nonatomic, strong) NSArray *giftModels; @end diff --git a/yinmeng-ios/yinmeng-ios/Main/Mine/View/UserInfoDetailView/Sub/Profile/GiftWall/MewUserPersonalProfileGiftView.m b/yinmeng-ios/yinmeng-ios/Main/Mine/View/UserInfoDetailView/Sub/Profile/GiftWall/MewUserPersonalProfileGiftView.m index d591c04..24cdda4 100644 --- a/yinmeng-ios/yinmeng-ios/Main/Mine/View/UserInfoDetailView/Sub/Profile/GiftWall/MewUserPersonalProfileGiftView.m +++ b/yinmeng-ios/yinmeng-ios/Main/Mine/View/UserInfoDetailView/Sub/Profile/GiftWall/MewUserPersonalProfileGiftView.m @@ -13,8 +13,10 @@ #import "NSArray+MewSafe.h" /// Third #import +/// Model +#import "MewUserGiftWallModel.h" -@interface MewUserPersonalProfileGiftView() +@interface MewUserPersonalProfileGiftView() /// 列表 @property (nonatomic, strong) UICollectionView *giftCollectionView; @end @@ -45,13 +47,21 @@ } +#pragma mark - Set +- (void)setGiftModels:(NSArray *)giftModels { + _giftModels = giftModels; + if (_giftModels.count == 0) { return; } + + [self.giftCollectionView reloadData]; +} + #pragma mark - UICollectionViewDelegate, UICollectionViewDataSource - (NSInteger)collectionView:(UICollectionView *)collectionView numberOfItemsInSection:(NSInteger)section { - return self.giftArray.count == 0 ? 1 : self.giftArray.count; + return self.giftModels.count == 0 ? 1 : self.giftModels.count; } - (__kindof UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath { - if (self.giftArray.count == 0) { + if (self.giftModels.count == 0) { MewEmptyCollectionViewCell *emptyCell = [collectionView dequeueReusableCellWithReuseIdentifier:NSStringFromClass([MewEmptyCollectionViewCell class]) forIndexPath:indexPath]; emptyCell.isGiftWall = YES; @@ -59,12 +69,19 @@ } MewUserPersonalGiftWallCollectionCell *giftCell = [collectionView dequeueReusableCellWithReuseIdentifier:NSStringFromClass([MewUserPersonalGiftWallCollectionCell class]) forIndexPath:indexPath]; - giftCell.giftModel = [self.giftArray mewSafeObjectAtIndex:indexPath.row]; + giftCell.giftModel = [self.giftModels mewSafeObjectAtIndex:indexPath.row]; return giftCell; } +#pragma mark - UICollectionViewDelegateFlowLayout +- (CGSize)collectionView:(UICollectionView *)collectionView layout:(UICollectionViewLayout *)collectionViewLayout sizeForItemAtIndexPath:(NSIndexPath *)indexPath { + CGFloat width = (CGRectGetWidth(collectionView.frame) - 16*3)/4.0; + CGFloat height = (82.0/72.0)*width; + return self.giftModels.count > 0 ? CGSizeMake(width, height) : collectionView.bounds.size; +} + #pragma mark - JXCategoryListContentViewDelegate - (UIView *)listView { @@ -72,13 +89,6 @@ } -#pragma mark - Set -- (void)setGiftArray:(NSArray *)giftArray { - _giftArray = giftArray; - [self.giftCollectionView reloadData]; - -} - #pragma mark - Get - (UICollectionView *)giftCollectionView { if (!_giftCollectionView) { diff --git a/yinmeng-ios/yinmeng-ios/Main/Mine/View/UserInfoDetailView/Sub/Profile/MewUserPersonalProfileViewController.m b/yinmeng-ios/yinmeng-ios/Main/Mine/View/UserInfoDetailView/Sub/Profile/MewUserPersonalProfileViewController.m index d6ae517..40ee3dd 100644 --- a/yinmeng-ios/yinmeng-ios/Main/Mine/View/UserInfoDetailView/Sub/Profile/MewUserPersonalProfileViewController.m +++ b/yinmeng-ios/yinmeng-ios/Main/Mine/View/UserInfoDetailView/Sub/Profile/MewUserPersonalProfileViewController.m @@ -19,10 +19,9 @@ /// Net #import "Api+MewSkillCard.h" -@interface MewUserPersonalProfileViewController () +@interface MewUserPersonalProfileViewController () @property (nonatomic, strong) UITableView *profileTableView; - /// Model @property (nonatomic, strong) NSArray *skills; //技能卡 @@ -39,7 +38,7 @@ #pragma mark - Life Cycle - (void)viewDidLoad { [super viewDidLoad]; - self.view.backgroundColor = UIColor.redColor; + self.view.backgroundColor = UIColor.clearColor; [self setUI]; [self loadRequestSkillCardData]; @@ -92,6 +91,10 @@ } else { MewUserPersonalProfileGiftTableCell *giftCell = [tableView dequeueReusableCellWithIdentifier:NSStringFromClass([MewUserPersonalProfileGiftTableCell class])]; + giftCell.delegate = self; + giftCell.normalGiftModels = self.userInfoModel.userGiftWall; + giftCell.luckyGiftModels = self.userInfoModel.userLuckyBagGiftWall; + return giftCell; } @@ -110,10 +113,18 @@ #pragma mark - MewProfieSkillCardTableCellDelegate +/// 选中技能卡 - (void)didSelectSkillCardTableCell:(MewUserPersonalProfieSkillCardTableCell *)cell model:(MewSkillCardInfoModel *)model { } +#pragma mark - MewUserPersonalProfileGiftTableCellDelegate +/// 选中更多礼物 +- (void)didsSelectPersonalProfileMoreGiftTableCell:(MewUserPersonalProfileGiftTableCell *)cell { + +} + + #pragma mark - JXPagerViewListViewDelegate - (UIView *)listView { return self.view; diff --git a/yinmeng-ios/yinmeng-ios/Main/Room/Model/MewRoomInfoModel.h b/yinmeng-ios/yinmeng-ios/Main/Room/Model/MewRoomInfoModel.h index 7065c0c..a2646f5 100644 --- a/yinmeng-ios/yinmeng-ios/Main/Room/Model/MewRoomInfoModel.h +++ b/yinmeng-ios/yinmeng-ios/Main/Room/Model/MewRoomInfoModel.h @@ -27,6 +27,7 @@ typedef NS_ENUM(NSInteger, MewRoomType) { @property (nonatomic , copy) NSString * roomDesc; @property (nonatomic , copy) NSString * trtcSig; @property (nonatomic , assign) BOOL leaveMode; +@property (nonatomic , assign) NSInteger erbanNo; //版本号 /// 是否已经收藏 @property(nonatomic, assign) BOOL isRoomFans; @property (nonatomic , assign) BOOL hasAnimationEffect; diff --git a/yinmeng-ios/yinmeng-ios/Main/ShareView/MewShareItemCollectionCell.h b/yinmeng-ios/yinmeng-ios/Main/ShareView/MewShareItemCollectionCell.h new file mode 100644 index 0000000..2414287 --- /dev/null +++ b/yinmeng-ios/yinmeng-ios/Main/ShareView/MewShareItemCollectionCell.h @@ -0,0 +1,19 @@ +// +// MewShareCollectionCell.h +// yinmeng-ios +// +// Created by 触海 on 2023/12/25. +// + +#import +#import "MewShareItemModel.h" + +NS_ASSUME_NONNULL_BEGIN + +@interface MewShareItemCollectionCell : UICollectionViewCell + +@property (nonatomic, strong) MewShareItemModel *item; + +@end + +NS_ASSUME_NONNULL_END diff --git a/yinmeng-ios/yinmeng-ios/Main/ShareView/MewShareItemCollectionCell.m b/yinmeng-ios/yinmeng-ios/Main/ShareView/MewShareItemCollectionCell.m new file mode 100644 index 0000000..aa59953 --- /dev/null +++ b/yinmeng-ios/yinmeng-ios/Main/ShareView/MewShareItemCollectionCell.m @@ -0,0 +1,75 @@ +// +// MewShareCollectionCell.m +// yinmeng-ios +// +// Created by 触海 on 2023/12/25. +// + +#import "MewShareItemCollectionCell.h" +/// Tool +#import "MewThemeColor.h" +#import "MewMacro.h" +/// Third +#import + +@interface MewShareItemCollectionCell() +@property (nonatomic, strong) UIImageView *itemImageView; +@property (nonatomic, strong) UILabel *itemTitleLabel; +@end + +@implementation MewShareItemCollectionCell + +#pragma mark - Init +- (instancetype)initWithFrame:(CGRect)frame { + self = [super initWithFrame:frame]; + if (self) { + [self setUI]; + } + return self; +} + +#pragma mark - UI +- (void)setUI { + [self.contentView addSubview:self.itemImageView]; + [self.contentView addSubview:self.itemTitleLabel]; + [self setUILayout]; +} + +- (void)setUILayout { + [self.itemImageView mas_makeConstraints:^(MASConstraintMaker *make) { + make.width.height.mas_equalTo(40); + make.top.centerX.equalTo(self.contentView); + }]; + [self.itemTitleLabel mas_makeConstraints:^(MASConstraintMaker *make) { + make.centerX.equalTo(self.contentView); + make.top.equalTo(self.itemImageView.mas_bottom).offset(10); + }]; +} + +#pragma mark - Set +- (void)setItem:(MewShareItemModel *)item { + _item = item; + self.userInteractionEnabled = item.disable; + self.itemImageView.image = [UIImage imageNamed:_item.disable ? item.imageName : item.disableImageName]; + self.itemTitleLabel.text = item.title; +} + +#pragma mark - Get +- (UIImageView *)itemImageView { + if (!_itemImageView) { + _itemImageView = [[UIImageView alloc] init]; + } + return _itemImageView; +} + +- (UILabel *)itemTitleLabel { + if (!_itemTitleLabel) { + _itemTitleLabel = [[UILabel alloc] init]; + _itemTitleLabel.textColor = MewThemeColor.mewAlertMessageColor; + _itemTitleLabel.font = kFontMedium(12); + _itemTitleLabel.textAlignment = NSTextAlignmentCenter; + } + return _itemTitleLabel; +} + +@end diff --git a/yinmeng-ios/yinmeng-ios/Main/ShareView/MewShareView.h b/yinmeng-ios/yinmeng-ios/Main/ShareView/MewShareView.h new file mode 100644 index 0000000..a18f6a3 --- /dev/null +++ b/yinmeng-ios/yinmeng-ios/Main/ShareView/MewShareView.h @@ -0,0 +1,30 @@ +// +// MewShareView.h +// yinmeng-ios +// +// Created by 触海 on 2023/12/24. +// + +#import +@class MewShareItemModel, MewPushShareModel, MewShareView; + +NS_ASSUME_NONNULL_BEGIN +@protocol MewShareViewDelegate +/// 分享成功 +- (void)didSelectShareView:(MewShareView *)shareView success:(MewPushShareModel *)model; +/// 分享失败 +- (void)didSelectShareView:(MewShareView *)shareView failure:(NSString *)failure; + +@end + +@interface MewShareView : UIView + +@property (nonatomic, weak) id delegate; + +/// 初始化 +/// items : 分享类型的数据 +/// shareModel:分享的模型 +- (instancetype)initWithSize:(CGSize)size items:(NSArray *)items shareModel:(MewPushShareModel *)shareModel; +@end + +NS_ASSUME_NONNULL_END diff --git a/yinmeng-ios/yinmeng-ios/Main/ShareView/MewShareView.m b/yinmeng-ios/yinmeng-ios/Main/ShareView/MewShareView.m new file mode 100644 index 0000000..37d095d --- /dev/null +++ b/yinmeng-ios/yinmeng-ios/Main/ShareView/MewShareView.m @@ -0,0 +1,183 @@ +// +// MewShareView.m +// yinmeng-ios +// +// Created by 触海 on 2023/12/24. +// + +#import "MewShareView.h" +/// Model +#import "MewShareItemModel.h" +#import "MewPushShareModel.h" +/// Tool +#import "MewMacro.h" +#import "MewThemeColor.h" +#import "NSArray+MewSafe.h" +#import "TTPopup.h" +/// View +#import "MewShareItemCollectionCell.h" +/// Third +#import +#import +#import + +@interface MewShareView () +/// 分享平台的数据,如朋友圈,微信等 +@property (nonatomic, strong) NSArray *items; +/// 分享数据 +@property (nonatomic, strong) MewPushShareModel *shareModel; +/// 分享平台的size +@property (nonatomic, assign) CGSize itemSize; + +@property (nonatomic, strong) UICollectionView *collectionView; +@property (nonatomic, strong) UIButton *cancelButton; +@end + +@implementation MewShareView + +#pragma mark - Init +- (instancetype)initWithSize:(CGSize)size items:(NSArray *)items shareModel:(MewPushShareModel *)shareModel { + self = [super initWithFrame:CGRectZero]; + if (self) { + self.items = items; + self.shareModel = shareModel; + self.itemSize = size; + [self setUI]; + } + return self; +} + +#pragma mark - UICollectionViewDelegate, UICollectionViewDataSource, UICollectionViewDelegateFlowLayout +- (NSInteger)collectionView:(UICollectionView *)collectionView numberOfItemsInSection:(NSInteger)section { + return self.items.count; +} + +- (__kindof UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath { + MewShareItemCollectionCell *cell = [collectionView dequeueReusableCellWithReuseIdentifier:NSStringFromClass([MewShareItemCollectionCell class]) forIndexPath:indexPath]; + MewShareItemModel *item = [self.items mewSafeObjectAtIndex:indexPath.row]; + item.disable = item.type == MewMomentShareItemType_App_Friends ? YES : [item Mew_isClientInstalled]; + + cell.item = item; + return cell; +} + +/// 去分享 +- (void)collectionView:(UICollectionView *)collectionView didSelectItemAtIndexPath:(NSIndexPath *)indexPath { + MewShareItemModel *item = [self.items mewSafeObjectAtIndex:indexPath.row]; + if (item.type == MewMomentShareItemType_App_Friends) { + return; + } + + self.shareModel.shareItemType = item.type; + [self gotoWithSharePlatformType:[item Mew_ShareItemTypeChagePlatformType]]; + +} + + + +#pragma mark - Private Method +- (void)gotoWithSharePlatformType:(SSDKPlatformType)platformType { + NSMutableDictionary *shareParam = [NSMutableDictionary dictionary]; + NSString *shareTtitle = self.shareModel.shareTitle.length > 0 ? self.shareModel.shareTitle : @""; + NSString *shareContent = self.shareModel.shareContent.length > 0 ? self.shareModel.shareContent : @""; + NSString *shareUrl = self.shareModel.shareUrl.length > 0 ? self.shareModel.shareUrl : @""; + NSString *shareImageUrl = self.shareModel.shareImageUrl.length > 0 ? self.shareModel.shareImageUrl : @""; + NSString *encodeUrl = [shareUrl stringByAddingPercentEncodingWithAllowedCharacters:[NSCharacterSet URLQueryAllowedCharacterSet]]; + [shareParam SSDKSetupShareParamsByText:shareContent images:@[shareImageUrl] url:[NSURL URLWithString:encodeUrl] title:shareTtitle type:SSDKContentTypeAuto]; + [ShareSDK share:platformType parameters:shareParam onStateChanged:^(SSDKResponseState state, NSDictionary *userData, SSDKContentEntity *contentEntity, NSError *error) { + switch (state) { + case SSDKResponseStateSuccess: { + if ([self.delegate respondsToSelector:@selector(didSelectShareView:success:)]) { + [self.delegate didSelectShareView:self success:self.shareModel]; + } + } + break; + + case SSDKResponseStateFail: { + if ([self.delegate respondsToSelector:@selector(didSelectShareView:failure:)]) { + [self.delegate didSelectShareView:self failure:@"分享失败"]; + } + } + break; + + case SSDKResponseStateCancel: { + if ([self.delegate respondsToSelector:@selector(didSelectShareView:failure:)]) { + [self.delegate didSelectShareView:self failure:@"用户取消分享"]; + } + } + break; + default: + break; + } + }]; +} + + +#pragma mark - UI +- (void)setUI { + [self addSubview:self.collectionView]; + [self addSubview:self.cancelButton]; + [self setUILayout]; +} + +- (void)setUILayout { + CGFloat width = KScreenWidth - 15 * 2; + int numLine = width / self.itemSize.width; + int numPage = self.items.count % numLine > 0 ? ((int)self.items.count / numLine) + 1 : ((int)self.items.count / numLine); + CGFloat height = (numPage * self.itemSize.height) + 20 + (numPage - 1) * 10 + 10; + [self.collectionView mas_makeConstraints:^(MASConstraintMaker *make) { + make.top.mas_equalTo(self); + make.height.mas_equalTo(height); + make.left.right.mas_equalTo(self).inset(15); + }]; + + [self.cancelButton mas_makeConstraints:^(MASConstraintMaker *make) { + make.height.mas_equalTo(45); + make.left.right.equalTo(self.collectionView); + make.top.mas_equalTo(self.collectionView.mas_bottom).offset(15); + }]; + + [self mas_makeConstraints:^(MASConstraintMaker *make) { + make.width.mas_equalTo(KScreenWidth); + make.bottom.equalTo(self.cancelButton.mas_bottom).offset(30); + }]; +} + +#pragma mark - Action +- (void)cancelButtonAction { + [TTPopup dismiss]; +} + +#pragma mark - Get +- (UICollectionView *)collectionView { + if (!_collectionView) { + UICollectionViewFlowLayout *layout = [[UICollectionViewFlowLayout alloc] init]; + layout.itemSize = self.itemSize; + layout.minimumInteritemSpacing = 0; + layout.minimumLineSpacing = 10; + layout.sectionInset = UIEdgeInsetsMake(20, 0, 10, 0); + _collectionView = [[UICollectionView alloc] initWithFrame:CGRectZero collectionViewLayout:layout]; + _collectionView.backgroundColor = [UIColor whiteColor]; + _collectionView.dataSource = self; + _collectionView.delegate = self; + _collectionView.layer.masksToBounds = YES; + _collectionView.layer.cornerRadius = 15; + [_collectionView registerClass:[MewShareItemCollectionCell class] forCellWithReuseIdentifier:NSStringFromClass([MewShareItemCollectionCell class])]; + } + return _collectionView; +} + +- (UIButton *)cancelButton{ + if (!_cancelButton) { + _cancelButton = [[UIButton alloc] init]; + [_cancelButton setBackgroundColor:[UIColor whiteColor]]; + [_cancelButton setTitle:@"取消" forState:UIControlStateNormal]; + _cancelButton.titleLabel.font = kFontMedium(15); + _cancelButton.layer.masksToBounds = YES; + _cancelButton.layer.cornerRadius = 45/2; + [_cancelButton setTitleColor:MewThemeColor.mewThreeTextColor forState:UIControlStateNormal]; + [_cancelButton addTarget:self action:@selector(cancelButtonAction) forControlEvents:UIControlEventTouchUpInside]; + } + return _cancelButton; +} +@end diff --git a/yinmeng-ios/yinmeng-ios/Main/ShareView/Model/MewPushShareModel.h b/yinmeng-ios/yinmeng-ios/Main/ShareView/Model/MewPushShareModel.h new file mode 100644 index 0000000..2b37fae --- /dev/null +++ b/yinmeng-ios/yinmeng-ios/Main/ShareView/Model/MewPushShareModel.h @@ -0,0 +1,51 @@ +// +// MewPushShareModel.h +// yinmeng-ios +// +// Created by 触海 on 2023/12/24. +// + +#import +#import "MewEnum.h" +@class MewDynamicMomentModel,MewRoomInfoModel; + +NS_ASSUME_NONNULL_BEGIN + +@interface MewPushShareModel : NSObject +///分享的标题 +@property (nonatomic,copy) NSString *shareTitle; +///分享的内容 +@property (nonatomic,copy) NSString *shareContent; +///分享的地址 +@property (nonatomic,copy) NSString *shareUrl; +///分享图片 +@property (nonatomic,copy) NSString *shareImageUrl; +///分享图片 +@property (nonatomic,copy) UIImage *shareImage; +///分享的类型 +@property (nonatomic,assign) MewSharePushModelType type; +///分享类型,1微信好友,2微信朋友圈,3QQ好友,4QQ空间 +@property (nonatomic,assign) MewMomentShareItemType shareItemType; +///分享房间的uid +@property (nonatomic,assign) NSInteger roomUid; +#pragma mark - 动态分享 +///被分享动态的那个人 +@property (nonatomic,copy) NSString *uid; +///动态分享 +@property (nonatomic,copy) NSString *dynamicId; +///话题id +@property (nonatomic,copy) NSString *topicId; +///封面 +@property (nonatomic,copy) NSString *dynamicImageUrl; +///名称 +@property (nonatomic,copy) NSString *dynamicNickName; +///发布者的uid +@property (nonatomic,copy) NSString *publishUid; +///内容 +@property (nonatomic,copy) NSString *dynamicContent; + +/// 根据不同的来源数据转成成可以发布分享的数据 ++ (MewPushShareModel *)Mew_SetPushModelWithChannelType:(MewShareChannelType)type channelModel:(id)channelModel; +@end + +NS_ASSUME_NONNULL_END diff --git a/yinmeng-ios/yinmeng-ios/Main/ShareView/Model/MewPushShareModel.m b/yinmeng-ios/yinmeng-ios/Main/ShareView/Model/MewPushShareModel.m new file mode 100644 index 0000000..bfb6f22 --- /dev/null +++ b/yinmeng-ios/yinmeng-ios/Main/ShareView/Model/MewPushShareModel.m @@ -0,0 +1,88 @@ +// +// MewPushShareModel.m +// yinmeng-ios +// +// Created by 触海 on 2023/12/24. +// + +#import "MewPushShareModel.h" +/// Model +#import "MewRoomInfoModel.h" +#import "MewDynamicMomentModel.h" +#import "MewAccountInfoStorage.h" +/// Api +#import "MewApiHost.h" +#import "MewHtmlUrl.h" + +@interface MewPushShareModel() +/// 房间模型 +@property (nonatomic, strong) MewRoomInfoModel *roomInfoModel; +/// 动态模型 +@property (nonatomic, strong) MewDynamicMomentModel *dynamicModel; + +@end + +@implementation MewPushShareModel + +#pragma mark - Public Method +/// 根据不同的来源数据转成成可以发布分享的数据 ++ (MewPushShareModel *)Mew_SetPushModelWithChannelType:(MewShareChannelType)type channelModel:(id)channelModel { + MewPushShareModel *shareModel = [[MewPushShareModel alloc] init]; + /// 房间分享的模型 + if (type == MewShareChannelType_Room && [channelModel isKindOfClass:[MewRoomInfoModel class]]) { + MewRoomInfoModel *roomInfoModel = (MewRoomInfoModel *)channelModel; + [self Mew_SetPushModelWithRoomInfoModel:roomInfoModel]; + shareModel.roomInfoModel = roomInfoModel; + } + + /// 动态分享的模型 + if (type == MewShareChannelType_Dynamic && [channelModel isKindOfClass:[MewDynamicMomentModel class]]) { + MewDynamicMomentModel *dynamicModel = (MewDynamicMomentModel *)channelModel; + [self Mew_SetPushModelWithDynamicModel:dynamicModel]; + shareModel.dynamicModel = dynamicModel; + } + + + return shareModel; +} + +/// 根据动态的模型转换成分享模型 ++ (MewPushShareModel *)Mew_SetPushModelWithDynamicModel:(MewDynamicMomentModel *)dynamicModel { + MewPushShareModel *shareModel = [[MewPushShareModel alloc] init]; + /// 动态分享的具体内容 + NSString *nickName = dynamicModel.nick.length > 6 ? [dynamicModel.nick substringToIndex:6] : dynamicModel.nick; + shareModel.dynamicNickName = nickName; + shareModel.dynamicContent = dynamicModel.content; + shareModel.dynamicImageUrl = dynamicModel.avatar; + /// 动态分享的人 + shareModel.shareTitle = [NSString stringWithFormat:@"%@发布了一条动态", nickName]; + shareModel.shareContent = dynamicModel.content; + shareModel.shareImageUrl = dynamicModel.avatar; + + NSString *userID = [MewAccountInfoStorage instance].mew_getUid; + NSString *urlString = [NSString stringWithFormat:@"%@/%@?uid=%@&dynamicId=%@&worldId=%ld", API_HOST_H5_URL, MewHtmlURLWithType(MewHtmlURLType_ShareDynamic),userID,dynamicModel.dynamicId,dynamicModel.worldId]; + shareModel.shareUrl = urlString; + shareModel.dynamicId = dynamicModel.dynamicId; + shareModel.uid = dynamicModel.uid; + shareModel.topicId = [NSString stringWithFormat:@"%ld", dynamicModel.worldId]; + + return shareModel; +} + +/// 根据房间的模型转换成分享模型 ++ (MewPushShareModel *)Mew_SetPushModelWithRoomInfoModel:(MewRoomInfoModel *)roomInfoModel { + MewPushShareModel *shareModel = [[MewPushShareModel alloc] init]; + shareModel.shareTitle = @"与你相遇,不孤单"; + shareModel.shareContent = [NSString stringWithFormat:@"%@ 这个房间很好玩,推荐给你,快来和我一起玩吧~",roomInfoModel.title]; + shareModel.shareImageUrl = roomInfoModel.avatar; + shareModel.type = MewSharePushModelType_Room; + shareModel.roomUid = roomInfoModel.uid; + NSString *uid = [MewAccountInfoStorage instance].mew_getUid; + NSString * urlString = [NSString stringWithFormat:@"%@/%@?shareUid=%@&uid=%ld&room_name=%@&room_id=%ld&room_avatar=%@&share_name=%@",API_HOST_H5_URL,MewHtmlURLWithType(MewHtmlURLType_ShareRoom),uid,roomInfoModel.uid,roomInfoModel.title,roomInfoModel.erbanNo,roomInfoModel.avatar,roomInfoModel.nick]; + shareModel.shareUrl = urlString; + + return shareModel; +} + + +@end diff --git a/yinmeng-ios/yinmeng-ios/Main/ShareView/Model/MewShareItemModel.h b/yinmeng-ios/yinmeng-ios/Main/ShareView/Model/MewShareItemModel.h new file mode 100644 index 0000000..ad15b52 --- /dev/null +++ b/yinmeng-ios/yinmeng-ios/Main/ShareView/Model/MewShareItemModel.h @@ -0,0 +1,32 @@ +// +// MewShareItemModel.h +// yinmeng-ios +// +// Created by 触海 on 2023/12/24. +// + +#import +#import "MewEnum.h" +#import +#import + +NS_ASSUME_NONNULL_BEGIN + +@interface MewShareItemModel : NSObject +@property (nonatomic, copy) NSString *title; +@property (nonatomic, copy) NSString *imageName; +@property (nonatomic, copy) NSString *disableImageName; +@property (nonatomic, assign) BOOL disable; +@property (nonatomic, assign) MewMomentShareItemType type; + +/// 通过type初始化share item Model ++ (MewShareItemModel *)Mew_SetShareModelType:(MewMomentShareItemType)type; +/// 获取动态的分享模型 ++ (NSArray *)Mew_GetDynamicShareModel; + +/// 自定义的itemtype 转换成 SSDKPlatformType +- (SSDKPlatformType)Mew_ShareItemTypeChagePlatformType; +- (BOOL)Mew_isClientInstalled; +@end + +NS_ASSUME_NONNULL_END diff --git a/yinmeng-ios/yinmeng-ios/Main/ShareView/Model/MewShareItemModel.m b/yinmeng-ios/yinmeng-ios/Main/ShareView/Model/MewShareItemModel.m new file mode 100644 index 0000000..706674b --- /dev/null +++ b/yinmeng-ios/yinmeng-ios/Main/ShareView/Model/MewShareItemModel.m @@ -0,0 +1,95 @@ +// +// MewShareItemModel.m +// yinmeng-ios +// +// Created by 触海 on 2023/12/24. +// + +#import "MewShareItemModel.h" + +@interface MewShareItemModel () + +@end + +@implementation MewShareItemModel + +/// 通过type初始化share item Model ++ (MewShareItemModel *)Mew_SetShareModelType:(MewMomentShareItemType)type { + MewShareItemModel *shareItemModel = [[MewShareItemModel alloc] init]; + shareItemModel.type = type; + return shareItemModel; +} + +/// 获取动态的分享模型 ++ (NSArray *)Mew_GetDynamicShareModel { + MewShareItemModel *wechat_friend = [self Mew_SetShareModelType:MewMomentShareItemType_WeChat_Friend]; + MewShareItemModel *wechat_moments = [self Mew_SetShareModelType:MewMomentShareItemType_WeChat_Moments]; + MewShareItemModel *qq_friend = [self Mew_SetShareModelType:MewMomentShareItemType_QQ_Friend]; + MewShareItemModel *qq_zone = [self Mew_SetShareModelType:MewMomentShareItemType_QQ_Zone]; + MewShareItemModel *app_friend = [self Mew_SetShareModelType:MewMomentShareItemType_App_Friends]; + return @[wechat_friend, wechat_moments, qq_friend, qq_zone, app_friend]; +} + +/// 自定义的itemtype 转换成 SSDKPlatformType +- (SSDKPlatformType)Mew_ShareItemTypeChagePlatformType { + SSDKPlatformType platformType = SSDKPlatformTypeUnknown; + switch (self.type) { + case MewMomentShareItemType_QQ_Friend: + platformType = SSDKPlatformTypeQQ; + break; + case MewMomentShareItemType_QQ_Zone: + platformType = SSDKPlatformSubTypeQZone; + break; + case MewMomentShareItemType_WeChat_Friend: + platformType = SSDKPlatformTypeWechat; + break; + case MewMomentShareItemType_WeChat_Moments: + platformType = SSDKPlatformSubTypeWechatTimeline; + break; + default: + break; + } + return platformType; +} + +- (BOOL)Mew_isClientInstalled { + return [ShareSDK isClientInstalled:[self Mew_ShareItemTypeChagePlatformType]]; +} + +#pragma mark - Set +- (void)setType:(MewMomentShareItemType)type { + _type = type; + switch (_type) { + case MewMomentShareItemType_WeChat_Friend: + self.title = @"微信好友"; + self.imageName = @"share_wechat_normal"; + self.disableImageName = @"share_wechat_disable"; + break; + case MewMomentShareItemType_WeChat_Moments: + self.title = @"朋友圈"; + self.imageName = @"share_wechat_circle_normal"; + self.disableImageName = @"share_wechat_circle_disable"; + break; + case MewMomentShareItemType_QQ_Friend: + self.title = @"QQ好友"; + self.imageName = @"share_qq_normal"; + self.disableImageName = @"share_qq_disable"; + break; + case MewMomentShareItemType_QQ_Zone: + self.title = @"QQ空间"; + self.imageName = @"share_qqzone_normal"; + self.disableImageName = @"share_qqzone_disable"; + break; + case MewMomentShareItemType_App_Friends: + self.title = @"好友"; + self.imageName = @"share_friend"; + self.disableImageName = @"share_friend"; + break; + + default: + break; + } +} + +@end +