Browse Source

1.SDK还原
2.处理输入中。。。

Steven 11 months ago
parent
commit
904b5f5162

+ 1 - 1
KulexiuForTeacher/KulexiuForTeacher.xcodeproj/xcshareddata/xcschemes/KulexiuForTeacher.xcscheme

@@ -1,6 +1,6 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <Scheme
-   LastUpgradeVersion = "1540"
+   LastUpgradeVersion = "1600"
    version = "1.7">
    <BuildAction
       parallelizeBuildables = "YES"

+ 2 - 0
KulexiuForTeacher/KulexiuForTeacher/Common/LoadingManager/KSHudLoagingManager.m

@@ -50,6 +50,7 @@
     dispatch_main_async_safe(^{
         if (self->_loadingView) {
             [self.loadingView hideLoadingView];
+            self->_loadingView = nil;
         }
     });
 }
@@ -84,6 +85,7 @@
     dispatch_main_async_safe(^{
         if (self.HUD) {
             [self.HUD removeFromSuperview];
+            self->_HUD = nil;
         }
         [[UIApplication sharedApplication] setNetworkActivityIndicatorVisible:NO];
     });

+ 16 - 13
KulexiuForTeacher/KulexiuForTeacher/Module/Chat/Controller/KSChatConversationViewController.m

@@ -35,20 +35,23 @@
     self.vc.conversationData = self.conversation;
     [self addChildViewController:self.vc];
     [self.view addSubview:self.vc.view];
-}
-
-- (void)viewWillAppear:(BOOL)animated {
-    [super viewWillAppear:animated];
-
-    //TODO: 页面appear 禁用
-   [[IQKeyboardManager sharedManager] setEnable:NO];
-}
-
-- (void)viewWillDisappear:(BOOL)animated {
-    [super viewWillDisappear:animated];
+    
+    // 关注变化
+    MJWeakSelf;
+    [[RACObserve(self.vc.conversationData, title) distinctUntilChanged] subscribeNext:^(NSString *title) {
+        [weakSelf allocTitle:title];
+    }];
 
-    //TODO: 页面Disappear 启用
-   [[IQKeyboardManager sharedManager] setEnable:YES];
+    [[RACObserve(self.vc.conversationData, otherSideTyping) distinctUntilChanged] subscribeNext:^(id otherSideTyping) {
+      BOOL otherSideTypingFlag = [otherSideTyping boolValue];
+      if (!otherSideTypingFlag) {
+          [weakSelf.vc checkTitle:YES];
+      }
+      else {
+          NSString *typingText = [NSString stringWithFormat:@"%@...", TIMCommonLocalizableString(TUIKitTyping)];
+          [weakSelf allocTitle:typingText];
+      }
+    }];
 }
 
 - (void)clearConversation {

+ 0 - 14
KulexiuForTeacher/KulexiuForTeacher/Module/Chat/Controller/KSGroupConversationController.m

@@ -26,20 +26,6 @@
     [self requestData];
 }
 
-- (void)viewWillAppear:(BOOL)animated {
-    [super viewWillAppear:animated];
-
-    //TODO: 页面appear 禁用
-   [[IQKeyboardManager sharedManager] setEnable:NO];
-}
-
-- (void)viewWillDisappear:(BOOL)animated {
-    [super viewWillDisappear:animated];
-
-    //TODO: 页面Disappear 启用
-   [[IQKeyboardManager sharedManager] setEnable:YES];
-}
-
 - (void)clearConversation {
     
     NSString *conversationID = [NSString stringWithFormat:@"group_%@",self.conversation.groupID];

+ 12 - 0
KulexiuForTeacher/KulexiuForTeacher/Module/Chat/Controller/TXCustom/KSTXBaseChatViewController.m

@@ -30,7 +30,19 @@ static UIView *gCustomTopView;
 
 @implementation KSTXBaseChatViewController
 
+- (void)viewWillAppear:(BOOL)animated {
+    [super viewWillAppear:animated];
+    // 页面appear 禁用
+    [IQKeyboardManager sharedManager].enableAutoToolbar = NO;
+    [IQKeyboardManager sharedManager].enable = NO;
+}
 
+- (void)viewWillDisappear:(BOOL)animated {
+    [super viewWillDisappear:animated];
+    // 页面Disappear 启用
+    [IQKeyboardManager sharedManager].enableAutoToolbar = YES;
+    [IQKeyboardManager sharedManager].enable = YES;
+}
 
 #pragma mark - Life Cycle
 

+ 70 - 9
KulexiuForTeacher/Pods/Pods.xcodeproj/project.pbxproj

@@ -1552,6 +1552,14 @@
 		BC1C980538365364BA47BEC364D917D3 /* QCloudAuthentationV4Creator.h in Headers */ = {isa = PBXBuildFile; fileRef = 58EF0ED3F641F7C4343A13B43A461C46 /* QCloudAuthentationV4Creator.h */; settings = {ATTRIBUTES = (Project, ); }; };
 		BC21AAB3DF90CB6719EDE4A9579DB7B4 /* JXCategoryTitleCell.h in Headers */ = {isa = PBXBuildFile; fileRef = 9D63816590A863B5BB41FF97B8AB1CFF /* JXCategoryTitleCell.h */; settings = {ATTRIBUTES = (Project, ); }; };
 		BC39164671956A06963E783D36DE9AB5 /* QCloudHosts.m in Sources */ = {isa = PBXBuildFile; fileRef = E14515D799B017007060ECA87CA06921 /* QCloudHosts.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; };
+		BC9ADDF72CA54A78004E6EEC /* TXLiveShareCell.m in Sources */ = {isa = PBXBuildFile; fileRef = BC9ADDF22CA54A78004E6EEC /* TXLiveShareCell.m */; };
+		BC9ADDF82CA54A78004E6EEC /* TXShareMusicCellContentView.m in Sources */ = {isa = PBXBuildFile; fileRef = BC9ADDF62CA54A78004E6EEC /* TXShareMusicCellContentView.m */; };
+		BC9ADDF92CA54A78004E6EEC /* TXChatMusicShareCell.m in Sources */ = {isa = PBXBuildFile; fileRef = BC9ADDF02CA54A78004E6EEC /* TXChatMusicShareCell.m */; };
+		BC9ADDFA2CA54A78004E6EEC /* TXShareLiveCellContentView.m in Sources */ = {isa = PBXBuildFile; fileRef = BC9ADDF42CA54A78004E6EEC /* TXShareLiveCellContentView.m */; };
+		BC9ADDFB2CA54A78004E6EEC /* TXLiveShareCell.h in Headers */ = {isa = PBXBuildFile; fileRef = BC9ADDF12CA54A78004E6EEC /* TXLiveShareCell.h */; };
+		BC9ADDFC2CA54A78004E6EEC /* TXShareMusicCellContentView.h in Headers */ = {isa = PBXBuildFile; fileRef = BC9ADDF52CA54A78004E6EEC /* TXShareMusicCellContentView.h */; };
+		BC9ADDFD2CA54A78004E6EEC /* TXChatMusicShareCell.h in Headers */ = {isa = PBXBuildFile; fileRef = BC9ADDEF2CA54A78004E6EEC /* TXChatMusicShareCell.h */; };
+		BC9ADDFE2CA54A78004E6EEC /* TXShareLiveCellContentView.h in Headers */ = {isa = PBXBuildFile; fileRef = BC9ADDF32CA54A78004E6EEC /* TXShareLiveCellContentView.h */; };
 		BC9CDE282C9AB66F006C4D16 /* TXLiveShareMessage.h in Headers */ = {isa = PBXBuildFile; fileRef = BC9CDE262C9AB66F006C4D16 /* TXLiveShareMessage.h */; };
 		BC9CDE292C9AB66F006C4D16 /* TXChatMusicMessage.h in Headers */ = {isa = PBXBuildFile; fileRef = BC9CDE242C9AB66F006C4D16 /* TXChatMusicMessage.h */; };
 		BC9CDE2A2C9AB66F006C4D16 /* TXLiveShareMessage.m in Sources */ = {isa = PBXBuildFile; fileRef = BC9CDE272C9AB66F006C4D16 /* TXLiveShareMessage.m */; };
@@ -4261,6 +4269,14 @@
 		BC712B415A7230233D5F275FC6F66C32 /* TUIJoinGroupMessageCell.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = TUIJoinGroupMessageCell.h; path = TUIChat/UI_Classic/Cell/Chat/TUIJoinGroupMessageCell.h; sourceTree = "<group>"; };
 		BC87405ABB3E9F194BAA21B786BE4113 /* MJExtension-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "MJExtension-dummy.m"; sourceTree = "<group>"; };
 		BC996AF7FD255E8026804B5C1FC22605 /* UIView+WebCache.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "UIView+WebCache.m"; path = "SDWebImage/Core/UIView+WebCache.m"; sourceTree = "<group>"; };
+		BC9ADDEF2CA54A78004E6EEC /* TXChatMusicShareCell.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = TXChatMusicShareCell.h; sourceTree = "<group>"; };
+		BC9ADDF02CA54A78004E6EEC /* TXChatMusicShareCell.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = TXChatMusicShareCell.m; sourceTree = "<group>"; };
+		BC9ADDF12CA54A78004E6EEC /* TXLiveShareCell.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = TXLiveShareCell.h; sourceTree = "<group>"; };
+		BC9ADDF22CA54A78004E6EEC /* TXLiveShareCell.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = TXLiveShareCell.m; sourceTree = "<group>"; };
+		BC9ADDF32CA54A78004E6EEC /* TXShareLiveCellContentView.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = TXShareLiveCellContentView.h; sourceTree = "<group>"; };
+		BC9ADDF42CA54A78004E6EEC /* TXShareLiveCellContentView.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = TXShareLiveCellContentView.m; sourceTree = "<group>"; };
+		BC9ADDF52CA54A78004E6EEC /* TXShareMusicCellContentView.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = TXShareMusicCellContentView.h; sourceTree = "<group>"; };
+		BC9ADDF62CA54A78004E6EEC /* TXShareMusicCellContentView.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = TXShareMusicCellContentView.m; sourceTree = "<group>"; };
 		BC9BFF5D71D6492F27ABAC2DBF170E7F /* KS3Response.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = KS3Response.m; path = KS3YunSDK/KS3YunSDK/KSYCore.RunTime/KS3Response.m; sourceTree = "<group>"; };
 		BC9CDE242C9AB66F006C4D16 /* TXChatMusicMessage.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = TXChatMusicMessage.h; sourceTree = "<group>"; };
 		BC9CDE252C9AB66F006C4D16 /* TXChatMusicMessage.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = TXChatMusicMessage.m; sourceTree = "<group>"; };
@@ -7578,6 +7594,14 @@
 				F669BA428C5B3062B2A32CCDFABD523F /* TUILinkCell.m */,
 				7BEB689453F4400D5F4CD451FB315078 /* TUIOrderCell.h */,
 				0372615965E3C4DC4C54EAD7B7B87544 /* TUIOrderCell.m */,
+				BC9ADDEF2CA54A78004E6EEC /* TXChatMusicShareCell.h */,
+				BC9ADDF02CA54A78004E6EEC /* TXChatMusicShareCell.m */,
+				BC9ADDF12CA54A78004E6EEC /* TXLiveShareCell.h */,
+				BC9ADDF22CA54A78004E6EEC /* TXLiveShareCell.m */,
+				BC9ADDF32CA54A78004E6EEC /* TXShareLiveCellContentView.h */,
+				BC9ADDF42CA54A78004E6EEC /* TXShareLiveCellContentView.m */,
+				BC9ADDF52CA54A78004E6EEC /* TXShareMusicCellContentView.h */,
+				BC9ADDF62CA54A78004E6EEC /* TXShareMusicCellContentView.m */,
 				BC9CDE302C9AB98A006C4D16 /* TXGroupNoticeMessageCell.h */,
 				BC9CDE312C9AB98A006C4D16 /* TXGroupNoticeMessageCell.m */,
 				BC9CDE322C9AB98A006C4D16 /* TXGroupNoticeMessageContentView.h */,
@@ -9909,6 +9933,10 @@
 				4C6829C8120567E7D7D2E35B388C6356 /* TUIVideoReplyQuoteViewData.h in Headers */,
 				992DF441D4574A9D6E6E1C8CE93E017A /* TUIVoiceMessageCell.h in Headers */,
 				2C1939E4B9484CD61687DACDD5D98FFD /* TUIVoiceMessageCellData.h in Headers */,
+				BC9ADDFB2CA54A78004E6EEC /* TXLiveShareCell.h in Headers */,
+				BC9ADDFC2CA54A78004E6EEC /* TXShareMusicCellContentView.h in Headers */,
+				BC9ADDFD2CA54A78004E6EEC /* TXChatMusicShareCell.h in Headers */,
+				BC9ADDFE2CA54A78004E6EEC /* TXShareLiveCellContentView.h in Headers */,
 				AB2A8AAE2E810AE59AE85670AB349D17 /* TUIVoiceReplyQuoteView.h in Headers */,
 				1E0B6A49FC1CF23601579729051E1DFA /* TUIVoiceReplyQuoteViewData.h in Headers */,
 				433E1FEEF0CEBC4D3902D8372FB5B2CD /* UIAlertController+TUICustomStyle.h in Headers */,
@@ -10935,8 +10963,9 @@
 		BFDFE7DC352907FC980B868725387E98 /* Project object */ = {
 			isa = PBXProject;
 			attributes = {
+				BuildIndependentTargetsInParallel = YES;
 				LastSwiftUpdateCheck = 1500;
-				LastUpgradeCheck = 1500;
+				LastUpgradeCheck = 1600;
 			};
 			buildConfigurationList = 4821239608C13582E20E6DA73FD5F1F9 /* Build configuration list for PBXProject "Pods" */;
 			compatibilityVersion = "Xcode 13.0";
@@ -12186,6 +12215,10 @@
 				2DE6EFC6954664571E24274735B35E1B /* TUIInputController.m in Sources */,
 				4CA0B1AE608069E7042DDF6C00B4CCC5 /* TUIInputMoreCell.m in Sources */,
 				CDB24D6E39F18ACAA7E3E319CF5C1C95 /* TUIInputMoreCellData.m in Sources */,
+				BC9ADDF72CA54A78004E6EEC /* TXLiveShareCell.m in Sources */,
+				BC9ADDF82CA54A78004E6EEC /* TXShareMusicCellContentView.m in Sources */,
+				BC9ADDF92CA54A78004E6EEC /* TXChatMusicShareCell.m in Sources */,
+				BC9ADDFA2CA54A78004E6EEC /* TXShareLiveCellContentView.m in Sources */,
 				108EF93ECFD8F51E6E46CCB93CE543DA /* TUIJoinGroupMessageCell.m in Sources */,
 				0A21119E72ADE5BC75689ACED698EBE6 /* TUIJoinGroupMessageCellData.m in Sources */,
 				3B55E2DC813E3F6ACA44B5AC95409E6D /* TUILinkCell.m in Sources */,
@@ -12733,13 +12766,14 @@
 			isa = XCBuildConfiguration;
 			baseConfigurationReference = AB82B27B4E37DEBECD21F3BEDE5138DC /* Pods-KulexiuForTeacher.release.xcconfig */;
 			buildSettings = {
-				ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = NO;
 				CLANG_ENABLE_OBJC_WEAK = NO;
 				"CODE_SIGN_IDENTITY[sdk=appletvos*]" = "";
 				"CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "";
 				"CODE_SIGN_IDENTITY[sdk=watchos*]" = "";
+				ENABLE_MODULE_VERIFIER = YES;
 				IPHONEOS_DEPLOYMENT_TARGET = 12.0;
 				MACH_O_TYPE = staticlib;
+				MODULE_VERIFIER_SUPPORTED_LANGUAGE_STANDARDS = "gnu11 gnu++14";
 				OTHER_LDFLAGS = "";
 				OTHER_LIBTOOLFLAGS = "";
 				PODS_ROOT = "$(SRCROOT)";
@@ -13103,9 +13137,11 @@
 				"CODE_SIGN_IDENTITY[sdk=appletvos*]" = "";
 				"CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "";
 				"CODE_SIGN_IDENTITY[sdk=watchos*]" = "";
+				ENABLE_MODULE_VERIFIER = YES;
 				GCC_PREFIX_HEADER = "Target Support Files/TIMCommon/TIMCommon-prefix.pch";
 				IPHONEOS_DEPLOYMENT_TARGET = 12.0;
 				MODULEMAP_FILE = Headers/Public/TIMCommon/TIMCommon.modulemap;
+				MODULE_VERIFIER_SUPPORTED_LANGUAGE_STANDARDS = "gnu11 gnu++14";
 				OTHER_LDFLAGS = "";
 				OTHER_LIBTOOLFLAGS = "";
 				PRIVATE_HEADERS_FOLDER_PATH = "";
@@ -13288,6 +13324,7 @@
 				CLANG_WARN_UNREACHABLE_CODE = YES;
 				CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
 				COPY_PHASE_STRIP = NO;
+				DEAD_CODE_STRIPPING = YES;
 				DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
 				ENABLE_NS_ASSERTIONS = NO;
 				ENABLE_STRICT_OBJC_MSGSEND = YES;
@@ -13307,7 +13344,6 @@
 				MTL_ENABLE_DEBUG_INFO = NO;
 				MTL_FAST_MATH = YES;
 				PRODUCT_NAME = "$(TARGET_NAME)";
-				STRIP_INSTALLED_PRODUCT = NO;
 				SWIFT_COMPILATION_MODE = wholemodule;
 				SWIFT_OPTIMIZATION_LEVEL = "-O";
 				SWIFT_VERSION = 5.0;
@@ -13479,6 +13515,7 @@
 				CLANG_WARN_UNREACHABLE_CODE = YES;
 				CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
 				COPY_PHASE_STRIP = NO;
+				DEAD_CODE_STRIPPING = YES;
 				DEBUG_INFORMATION_FORMAT = dwarf;
 				ENABLE_STRICT_OBJC_MSGSEND = YES;
 				ENABLE_TESTABILITY = YES;
@@ -13502,7 +13539,6 @@
 				MTL_FAST_MATH = YES;
 				ONLY_ACTIVE_ARCH = YES;
 				PRODUCT_NAME = "$(TARGET_NAME)";
-				STRIP_INSTALLED_PRODUCT = NO;
 				SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG;
 				SWIFT_OPTIMIZATION_LEVEL = "-Onone";
 				SWIFT_VERSION = 5.0;
@@ -13514,13 +13550,14 @@
 			isa = XCBuildConfiguration;
 			baseConfigurationReference = 4542921C5411042A28160B9BA72C7201 /* Pods-KulexiuForTeacher.debug.xcconfig */;
 			buildSettings = {
-				ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = NO;
 				CLANG_ENABLE_OBJC_WEAK = NO;
 				"CODE_SIGN_IDENTITY[sdk=appletvos*]" = "";
 				"CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "";
 				"CODE_SIGN_IDENTITY[sdk=watchos*]" = "";
+				ENABLE_MODULE_VERIFIER = YES;
 				IPHONEOS_DEPLOYMENT_TARGET = 12.0;
 				MACH_O_TYPE = staticlib;
+				MODULE_VERIFIER_SUPPORTED_LANGUAGE_STANDARDS = "gnu11 gnu++14";
 				OTHER_LDFLAGS = "";
 				OTHER_LIBTOOLFLAGS = "";
 				PODS_ROOT = "$(SRCROOT)";
@@ -13586,9 +13623,11 @@
 				"CODE_SIGN_IDENTITY[sdk=appletvos*]" = "";
 				"CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "";
 				"CODE_SIGN_IDENTITY[sdk=watchos*]" = "";
+				ENABLE_MODULE_VERIFIER = YES;
 				GCC_PREFIX_HEADER = "Target Support Files/SSZipArchive/SSZipArchive-prefix.pch";
 				IPHONEOS_DEPLOYMENT_TARGET = 12.0;
 				MODULEMAP_FILE = Headers/Public/SSZipArchive/SSZipArchive.modulemap;
+				MODULE_VERIFIER_SUPPORTED_LANGUAGE_STANDARDS = "gnu11 gnu++14";
 				OTHER_LDFLAGS = "";
 				OTHER_LIBTOOLFLAGS = "";
 				PRIVATE_HEADERS_FOLDER_PATH = "";
@@ -13682,9 +13721,11 @@
 				"CODE_SIGN_IDENTITY[sdk=appletvos*]" = "";
 				"CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "";
 				"CODE_SIGN_IDENTITY[sdk=watchos*]" = "";
+				ENABLE_MODULE_VERIFIER = YES;
 				GCC_PREFIX_HEADER = "Target Support Files/TUICore/TUICore-prefix.pch";
 				IPHONEOS_DEPLOYMENT_TARGET = 12.0;
 				MODULEMAP_FILE = Headers/Public/TUICore/TUICore.modulemap;
+				MODULE_VERIFIER_SUPPORTED_LANGUAGE_STANDARDS = "gnu11 gnu++14";
 				OTHER_LDFLAGS = "";
 				OTHER_LIBTOOLFLAGS = "";
 				PRIVATE_HEADERS_FOLDER_PATH = "";
@@ -13802,9 +13843,11 @@
 				"CODE_SIGN_IDENTITY[sdk=appletvos*]" = "";
 				"CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "";
 				"CODE_SIGN_IDENTITY[sdk=watchos*]" = "";
+				ENABLE_MODULE_VERIFIER = YES;
 				GCC_PREFIX_HEADER = "Target Support Files/TUICore/TUICore-prefix.pch";
 				IPHONEOS_DEPLOYMENT_TARGET = 12.0;
 				MODULEMAP_FILE = Headers/Public/TUICore/TUICore.modulemap;
+				MODULE_VERIFIER_SUPPORTED_LANGUAGE_STANDARDS = "gnu11 gnu++14";
 				OTHER_LDFLAGS = "";
 				OTHER_LIBTOOLFLAGS = "";
 				PRIVATE_HEADERS_FOLDER_PATH = "";
@@ -14040,9 +14083,11 @@
 				"CODE_SIGN_IDENTITY[sdk=appletvos*]" = "";
 				"CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "";
 				"CODE_SIGN_IDENTITY[sdk=watchos*]" = "";
+				ENABLE_MODULE_VERIFIER = YES;
 				GCC_PREFIX_HEADER = "Target Support Files/SSZipArchive/SSZipArchive-prefix.pch";
 				IPHONEOS_DEPLOYMENT_TARGET = 12.0;
 				MODULEMAP_FILE = Headers/Public/SSZipArchive/SSZipArchive.modulemap;
+				MODULE_VERIFIER_SUPPORTED_LANGUAGE_STANDARDS = "gnu11 gnu++14";
 				OTHER_LDFLAGS = "";
 				OTHER_LIBTOOLFLAGS = "";
 				PRIVATE_HEADERS_FOLDER_PATH = "";
@@ -14256,9 +14301,11 @@
 				"CODE_SIGN_IDENTITY[sdk=appletvos*]" = "";
 				"CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "";
 				"CODE_SIGN_IDENTITY[sdk=watchos*]" = "";
+				ENABLE_MODULE_VERIFIER = YES;
 				GCC_PREFIX_HEADER = "Target Support Files/TIMCommon/TIMCommon-prefix.pch";
 				IPHONEOS_DEPLOYMENT_TARGET = 12.0;
 				MODULEMAP_FILE = Headers/Public/TIMCommon/TIMCommon.modulemap;
+				MODULE_VERIFIER_SUPPORTED_LANGUAGE_STANDARDS = "gnu11 gnu++14";
 				OTHER_LDFLAGS = "";
 				OTHER_LIBTOOLFLAGS = "";
 				PRIVATE_HEADERS_FOLDER_PATH = "";
@@ -14278,13 +14325,14 @@
 			isa = XCBuildConfiguration;
 			baseConfigurationReference = AD0385634F31C83F7722A3868A39DB00 /* Pods-KulexiuForTeacher.dev.xcconfig */;
 			buildSettings = {
-				ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = NO;
 				CLANG_ENABLE_OBJC_WEAK = NO;
 				"CODE_SIGN_IDENTITY[sdk=appletvos*]" = "";
 				"CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "";
 				"CODE_SIGN_IDENTITY[sdk=watchos*]" = "";
+				ENABLE_MODULE_VERIFIER = YES;
 				IPHONEOS_DEPLOYMENT_TARGET = 12.0;
 				MACH_O_TYPE = staticlib;
+				MODULE_VERIFIER_SUPPORTED_LANGUAGE_STANDARDS = "gnu11 gnu++14";
 				OTHER_LDFLAGS = "";
 				OTHER_LIBTOOLFLAGS = "";
 				PODS_ROOT = "$(SRCROOT)";
@@ -14331,6 +14379,7 @@
 				CLANG_WARN_UNREACHABLE_CODE = YES;
 				CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
 				COPY_PHASE_STRIP = NO;
+				DEAD_CODE_STRIPPING = YES;
 				DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
 				ENABLE_NS_ASSERTIONS = NO;
 				ENABLE_STRICT_OBJC_MSGSEND = YES;
@@ -14350,7 +14399,6 @@
 				MTL_ENABLE_DEBUG_INFO = NO;
 				MTL_FAST_MATH = YES;
 				PRODUCT_NAME = "$(TARGET_NAME)";
-				STRIP_INSTALLED_PRODUCT = NO;
 				SWIFT_COMPILATION_MODE = wholemodule;
 				SWIFT_OPTIMIZATION_LEVEL = "-O";
 				SWIFT_VERSION = 5.0;
@@ -14738,9 +14786,11 @@
 				"CODE_SIGN_IDENTITY[sdk=appletvos*]" = "";
 				"CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "";
 				"CODE_SIGN_IDENTITY[sdk=watchos*]" = "";
+				ENABLE_MODULE_VERIFIER = YES;
 				GCC_PREFIX_HEADER = "Target Support Files/TIMCommon/TIMCommon-prefix.pch";
 				IPHONEOS_DEPLOYMENT_TARGET = 12.0;
 				MODULEMAP_FILE = Headers/Public/TIMCommon/TIMCommon.modulemap;
+				MODULE_VERIFIER_SUPPORTED_LANGUAGE_STANDARDS = "gnu11 gnu++14";
 				OTHER_LDFLAGS = "";
 				OTHER_LIBTOOLFLAGS = "";
 				PRIVATE_HEADERS_FOLDER_PATH = "";
@@ -14791,6 +14841,7 @@
 				CLANG_WARN_UNREACHABLE_CODE = YES;
 				CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
 				COPY_PHASE_STRIP = NO;
+				DEAD_CODE_STRIPPING = YES;
 				DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
 				ENABLE_NS_ASSERTIONS = NO;
 				ENABLE_STRICT_OBJC_MSGSEND = YES;
@@ -14810,7 +14861,6 @@
 				MTL_ENABLE_DEBUG_INFO = NO;
 				MTL_FAST_MATH = YES;
 				PRODUCT_NAME = "$(TARGET_NAME)";
-				STRIP_INSTALLED_PRODUCT = NO;
 				SWIFT_COMPILATION_MODE = wholemodule;
 				SWIFT_OPTIMIZATION_LEVEL = "-O";
 				SWIFT_VERSION = 5.0;
@@ -15050,9 +15100,11 @@
 				"CODE_SIGN_IDENTITY[sdk=appletvos*]" = "";
 				"CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "";
 				"CODE_SIGN_IDENTITY[sdk=watchos*]" = "";
+				ENABLE_MODULE_VERIFIER = YES;
 				GCC_PREFIX_HEADER = "Target Support Files/SSZipArchive/SSZipArchive-prefix.pch";
 				IPHONEOS_DEPLOYMENT_TARGET = 12.0;
 				MODULEMAP_FILE = Headers/Public/SSZipArchive/SSZipArchive.modulemap;
+				MODULE_VERIFIER_SUPPORTED_LANGUAGE_STANDARDS = "gnu11 gnu++14";
 				OTHER_LDFLAGS = "";
 				OTHER_LIBTOOLFLAGS = "";
 				PRIVATE_HEADERS_FOLDER_PATH = "";
@@ -15517,9 +15569,11 @@
 				"CODE_SIGN_IDENTITY[sdk=appletvos*]" = "";
 				"CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "";
 				"CODE_SIGN_IDENTITY[sdk=watchos*]" = "";
+				ENABLE_MODULE_VERIFIER = YES;
 				GCC_PREFIX_HEADER = "Target Support Files/TUICore/TUICore-prefix.pch";
 				IPHONEOS_DEPLOYMENT_TARGET = 12.0;
 				MODULEMAP_FILE = Headers/Public/TUICore/TUICore.modulemap;
+				MODULE_VERIFIER_SUPPORTED_LANGUAGE_STANDARDS = "gnu11 gnu++14";
 				OTHER_LDFLAGS = "";
 				OTHER_LIBTOOLFLAGS = "";
 				PRIVATE_HEADERS_FOLDER_PATH = "";
@@ -15566,9 +15620,11 @@
 				"CODE_SIGN_IDENTITY[sdk=appletvos*]" = "";
 				"CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "";
 				"CODE_SIGN_IDENTITY[sdk=watchos*]" = "";
+				ENABLE_MODULE_VERIFIER = YES;
 				GCC_PREFIX_HEADER = "Target Support Files/TIMCommon/TIMCommon-prefix.pch";
 				IPHONEOS_DEPLOYMENT_TARGET = 12.0;
 				MODULEMAP_FILE = Headers/Public/TIMCommon/TIMCommon.modulemap;
+				MODULE_VERIFIER_SUPPORTED_LANGUAGE_STANDARDS = "gnu11 gnu++14";
 				OTHER_LDFLAGS = "";
 				OTHER_LIBTOOLFLAGS = "";
 				PRIVATE_HEADERS_FOLDER_PATH = "";
@@ -15928,9 +15984,11 @@
 				"CODE_SIGN_IDENTITY[sdk=appletvos*]" = "";
 				"CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "";
 				"CODE_SIGN_IDENTITY[sdk=watchos*]" = "";
+				ENABLE_MODULE_VERIFIER = YES;
 				GCC_PREFIX_HEADER = "Target Support Files/TUICore/TUICore-prefix.pch";
 				IPHONEOS_DEPLOYMENT_TARGET = 12.0;
 				MODULEMAP_FILE = Headers/Public/TUICore/TUICore.modulemap;
+				MODULE_VERIFIER_SUPPORTED_LANGUAGE_STANDARDS = "gnu11 gnu++14";
 				OTHER_LDFLAGS = "";
 				OTHER_LIBTOOLFLAGS = "";
 				PRIVATE_HEADERS_FOLDER_PATH = "";
@@ -16017,9 +16075,11 @@
 				"CODE_SIGN_IDENTITY[sdk=appletvos*]" = "";
 				"CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "";
 				"CODE_SIGN_IDENTITY[sdk=watchos*]" = "";
+				ENABLE_MODULE_VERIFIER = YES;
 				GCC_PREFIX_HEADER = "Target Support Files/SSZipArchive/SSZipArchive-prefix.pch";
 				IPHONEOS_DEPLOYMENT_TARGET = 12.0;
 				MODULEMAP_FILE = Headers/Public/SSZipArchive/SSZipArchive.modulemap;
+				MODULE_VERIFIER_SUPPORTED_LANGUAGE_STANDARDS = "gnu11 gnu++14";
 				OTHER_LDFLAGS = "";
 				OTHER_LIBTOOLFLAGS = "";
 				PRIVATE_HEADERS_FOLDER_PATH = "";
@@ -16544,13 +16604,14 @@
 			isa = XCBuildConfiguration;
 			baseConfigurationReference = 4F572C0F5E43A41FA6CBF8D69EE24E2D /* Pods-KulexiuForTeacher.test.xcconfig */;
 			buildSettings = {
-				ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = NO;
 				CLANG_ENABLE_OBJC_WEAK = NO;
 				"CODE_SIGN_IDENTITY[sdk=appletvos*]" = "";
 				"CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "";
 				"CODE_SIGN_IDENTITY[sdk=watchos*]" = "";
+				ENABLE_MODULE_VERIFIER = YES;
 				IPHONEOS_DEPLOYMENT_TARGET = 12.0;
 				MACH_O_TYPE = staticlib;
+				MODULE_VERIFIER_SUPPORTED_LANGUAGE_STANDARDS = "gnu11 gnu++14";
 				OTHER_LDFLAGS = "";
 				OTHER_LIBTOOLFLAGS = "";
 				PODS_ROOT = "$(SRCROOT)";

+ 120 - 0
KulexiuForTeacher/Pods/Pods.xcodeproj/xcuserdata/wangzhi.xcuserdatad/xcschemes/xcschememanagement.plist

@@ -8,206 +8,326 @@
 		<dict>
 			<key>isShown</key>
 			<false/>
+			<key>orderHint</key>
+			<integer>3</integer>
 		</dict>
 		<key>AlipaySDK-iOS.xcscheme</key>
 		<dict>
 			<key>isShown</key>
 			<false/>
+			<key>orderHint</key>
+			<integer>4</integer>
 		</dict>
 		<key>Bugly.xcscheme</key>
 		<dict>
 			<key>isShown</key>
 			<false/>
+			<key>orderHint</key>
+			<integer>5</integer>
 		</dict>
 		<key>CocoaAsyncSocket.xcscheme</key>
 		<dict>
 			<key>isShown</key>
 			<false/>
+			<key>orderHint</key>
+			<integer>6</integer>
 		</dict>
 		<key>CocoaHTTPServer.xcscheme</key>
 		<dict>
 			<key>isShown</key>
 			<false/>
+			<key>orderHint</key>
+			<integer>7</integer>
 		</dict>
 		<key>CocoaLumberjack-CocoaLumberjackPrivacy.xcscheme</key>
 		<dict>
 			<key>isShown</key>
 			<false/>
+			<key>orderHint</key>
+			<integer>9</integer>
 		</dict>
 		<key>CocoaLumberjack.xcscheme</key>
 		<dict>
 			<key>isShown</key>
 			<false/>
+			<key>orderHint</key>
+			<integer>8</integer>
 		</dict>
 		<key>IQKeyboardManager.xcscheme</key>
 		<dict>
 			<key>isShown</key>
 			<false/>
+			<key>orderHint</key>
+			<integer>11</integer>
 		</dict>
 		<key>JCore.xcscheme</key>
 		<dict>
 			<key>isShown</key>
 			<false/>
+			<key>orderHint</key>
+			<integer>12</integer>
 		</dict>
 		<key>JPush.xcscheme</key>
 		<dict>
 			<key>isShown</key>
 			<false/>
+			<key>orderHint</key>
+			<integer>13</integer>
 		</dict>
 		<key>JXCategoryView.xcscheme</key>
 		<dict>
 			<key>isShown</key>
 			<false/>
+			<key>orderHint</key>
+			<integer>14</integer>
 		</dict>
 		<key>JXPagingView.xcscheme</key>
 		<dict>
 			<key>isShown</key>
 			<false/>
+			<key>orderHint</key>
+			<integer>15</integer>
 		</dict>
 		<key>MBProgressHUD.xcscheme</key>
 		<dict>
 			<key>isShown</key>
 			<false/>
+			<key>orderHint</key>
+			<integer>18</integer>
+		</dict>
+		<key>MJExtension-MJExtension.xcscheme</key>
+		<dict>
+			<key>orderHint</key>
+			<integer>20</integer>
 		</dict>
 		<key>MJExtension.xcscheme</key>
 		<dict>
 			<key>isShown</key>
 			<false/>
+			<key>orderHint</key>
+			<integer>19</integer>
+		</dict>
+		<key>MJRefresh-MJRefresh.Privacy.xcscheme</key>
+		<dict>
+			<key>orderHint</key>
+			<integer>22</integer>
 		</dict>
 		<key>MJRefresh.xcscheme</key>
 		<dict>
 			<key>isShown</key>
 			<false/>
+			<key>orderHint</key>
+			<integer>21</integer>
 		</dict>
 		<key>Masonry.xcscheme</key>
 		<dict>
 			<key>isShown</key>
 			<false/>
+			<key>orderHint</key>
+			<integer>17</integer>
 		</dict>
 		<key>NTLBridge.xcscheme</key>
 		<dict>
 			<key>isShown</key>
 			<false/>
+			<key>orderHint</key>
+			<integer>23</integer>
 		</dict>
 		<key>Pods-KulexiuForTeacher.xcscheme</key>
 		<dict>
 			<key>isShown</key>
 			<false/>
+			<key>orderHint</key>
+			<integer>24</integer>
 		</dict>
 		<key>QCloudCOSXML.xcscheme</key>
 		<dict>
 			<key>isShown</key>
 			<false/>
+			<key>orderHint</key>
+			<integer>26</integer>
 		</dict>
 		<key>QCloudCore.xcscheme</key>
 		<dict>
 			<key>isShown</key>
 			<false/>
+			<key>orderHint</key>
+			<integer>25</integer>
 		</dict>
 		<key>RSKImageCropper.xcscheme</key>
 		<dict>
 			<key>isShown</key>
 			<false/>
+			<key>orderHint</key>
+			<integer>29</integer>
 		</dict>
 		<key>Reachability.xcscheme</key>
 		<dict>
 			<key>isShown</key>
 			<false/>
+			<key>orderHint</key>
+			<integer>27</integer>
 		</dict>
 		<key>ReactiveObjC.xcscheme</key>
 		<dict>
 			<key>isShown</key>
 			<false/>
+			<key>orderHint</key>
+			<integer>28</integer>
+		</dict>
+		<key>SDWebImage-SDWebImage.xcscheme</key>
+		<dict>
+			<key>orderHint</key>
+			<integer>31</integer>
 		</dict>
 		<key>SDWebImage.xcscheme</key>
 		<dict>
 			<key>isShown</key>
 			<false/>
+			<key>orderHint</key>
+			<integer>30</integer>
 		</dict>
 		<key>SSZipArchive.xcscheme</key>
 		<dict>
 			<key>isShown</key>
 			<false/>
+			<key>orderHint</key>
+			<integer>33</integer>
 		</dict>
 		<key>SocketRocket.xcscheme</key>
 		<dict>
 			<key>isShown</key>
 			<false/>
+			<key>orderHint</key>
+			<integer>32</integer>
+		</dict>
+		<key>TIMCommon-TIMCommon_Privacy.xcscheme</key>
+		<dict>
+			<key>orderHint</key>
+			<integer>35</integer>
 		</dict>
 		<key>TIMCommon.xcscheme</key>
 		<dict>
 			<key>isShown</key>
 			<false/>
+			<key>orderHint</key>
+			<integer>34</integer>
 		</dict>
 		<key>TUIChat.xcscheme</key>
 		<dict>
 			<key>isShown</key>
 			<false/>
+			<key>orderHint</key>
+			<integer>36</integer>
 		</dict>
 		<key>TUIConversation.xcscheme</key>
 		<dict>
 			<key>isShown</key>
 			<false/>
+			<key>orderHint</key>
+			<integer>37</integer>
+		</dict>
+		<key>TUICore-TUICore_Privacy.xcscheme</key>
+		<dict>
+			<key>orderHint</key>
+			<integer>39</integer>
 		</dict>
 		<key>TUICore.xcscheme</key>
 		<dict>
 			<key>isShown</key>
 			<false/>
+			<key>orderHint</key>
+			<integer>38</integer>
 		</dict>
 		<key>TUIGroup.xcscheme</key>
 		<dict>
 			<key>isShown</key>
 			<false/>
+			<key>orderHint</key>
+			<integer>40</integer>
 		</dict>
 		<key>TUISearch.xcscheme</key>
 		<dict>
 			<key>isShown</key>
 			<false/>
+			<key>orderHint</key>
+			<integer>41</integer>
 		</dict>
 		<key>TXIMSDK_Plus_iOS.xcscheme</key>
 		<dict>
 			<key>isShown</key>
 			<false/>
 		</dict>
+		<key>TXIMSDK_Plus_iOS.xcscheme_^#shared#^_</key>
+		<dict>
+			<key>orderHint</key>
+			<integer>50</integer>
+		</dict>
+		<key>TXIMSDK_Plus_iOS_XCFramework-TXIMSDK_Plus_iOS_XCFramework_Privacy.xcscheme</key>
+		<dict>
+			<key>orderHint</key>
+			<integer>43</integer>
+		</dict>
+		<key>TXIMSDK_Plus_iOS_XCFramework.xcscheme</key>
+		<dict>
+			<key>orderHint</key>
+			<integer>42</integer>
+		</dict>
 		<key>TXLiteAVSDK_Professional.xcscheme</key>
 		<dict>
 			<key>isShown</key>
 			<false/>
+			<key>orderHint</key>
+			<integer>44</integer>
 		</dict>
 		<key>TYCyclePagerView.xcscheme</key>
 		<dict>
 			<key>isShown</key>
 			<false/>
+			<key>orderHint</key>
+			<integer>45</integer>
 		</dict>
 		<key>TZImagePickerController.xcscheme</key>
 		<dict>
 			<key>isShown</key>
 			<false/>
+			<key>orderHint</key>
+			<integer>46</integer>
 		</dict>
 		<key>Whiteboard-Whiteboard.xcscheme</key>
 		<dict>
 			<key>isShown</key>
 			<false/>
+			<key>orderHint</key>
+			<integer>48</integer>
 		</dict>
 		<key>Whiteboard.xcscheme</key>
 		<dict>
 			<key>isShown</key>
 			<false/>
+			<key>orderHint</key>
+			<integer>47</integer>
 		</dict>
 		<key>YYModel.xcscheme</key>
 		<dict>
 			<key>isShown</key>
 			<false/>
+			<key>orderHint</key>
+			<integer>49</integer>
 		</dict>
 		<key>iOS-KS3SDK.xcscheme</key>
 		<dict>
 			<key>isShown</key>
 			<false/>
+			<key>orderHint</key>
+			<integer>10</integer>
 		</dict>
 		<key>lottie-ios.xcscheme</key>
 		<dict>
 			<key>isShown</key>
 			<false/>
+			<key>orderHint</key>
+			<integer>16</integer>
 		</dict>
 	</dict>
 	<key>SuppressBuildableAutocreation</key>

+ 1 - 0
KulexiuForTeacher/Pods/TUIChat/TUIChat/UI_Classic/Chat/TUIBaseChatViewController.h

@@ -153,6 +153,7 @@
 + (UIView *)customTopView;
 
 // 新增
+- (void)checkTitle:(BOOL)force;
 // 多选
 - (void)onSelectMessageMenu:(NSInteger)menuType withData:(TUIMessageCellData *)data;
 

+ 19 - 0
KulexiuForTeacher/Pods/TUIChat/TXChatMusicShareCell.h

@@ -0,0 +1,19 @@
+//
+//  TXChatMusicShareCell.h
+//  TUIChat
+//
+//  Created by 王智 on 2023/8/10.
+//
+
+#import "TUIMessageCell.h"
+#import "TXChatMusicMessage.h"
+
+NS_ASSUME_NONNULL_BEGIN
+
+@interface TXChatMusicShareCell : TUIMessageCell
+
+- (void)fillWithData:(TXChatMusicMessage *)data; // 绘制 UI
+
+@end
+
+NS_ASSUME_NONNULL_END

+ 83 - 0
KulexiuForTeacher/Pods/TUIChat/TXChatMusicShareCell.m

@@ -0,0 +1,83 @@
+//
+//  TXChatMusicShareCell.m
+//  TUIChat
+//
+//  Created by 王智 on 2023/8/10.
+//
+
+#import "TXChatMusicShareCell.h"
+#import "TXShareMusicCellContentView.h"
+#import "Masonry.h"
+
+@interface TXChatMusicShareCell ()
+
+@property (nonatomic, strong) TXShareMusicCellContentView *musicContentView;
+
+@end
+
+
+@implementation TXChatMusicShareCell
+
+- (instancetype)initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(NSString *)reuseIdentifier {
+    self = [super initWithStyle:style reuseIdentifier:reuseIdentifier];
+    
+    if (self) {
+        [self configUI];
+
+    }
+    return self;
+}
+
+- (void)configUI {
+    [self.container addSubview:self.musicContentView];
+
+    [self.musicContentView mas_makeConstraints:^(MASConstraintMaker *make) {
+        make.left.mas_equalTo(self.container.mas_left);
+        make.top.mas_equalTo(self.avatarView.mas_top);
+        make.width.mas_equalTo(260);
+        make.bottom.mas_equalTo(self.container.mas_bottom).offset(-10);
+    }];
+}
+
+- (void)fillWithData:(TXChatMusicMessage *)data {
+    [super fillWithData:data];
+    [self.musicContentView configWithSongName:data.songName type:data.chargeType authName:data.songAuth sendAvatar:data.teacherAvatar sendName:data.teacherName userId:data.innerMessage.sender tags:data.musicTagNames];
+    if (data.direction == MsgDirectionIncoming) {
+        [self.musicContentView mas_remakeConstraints:^(MASConstraintMaker *make) {
+            make.left.mas_equalTo(self.container.mas_left);
+            make.top.mas_equalTo(self.avatarView.mas_top);
+            make.width.mas_equalTo(260);
+            make.bottom.mas_equalTo(self.container.mas_bottom).offset(-10);
+        }];
+    }
+    else {
+        [self.musicContentView mas_remakeConstraints:^(MASConstraintMaker *make) {
+            make.right.mas_equalTo(self.container.mas_right);
+            make.top.mas_equalTo(self.avatarView.mas_top);
+            make.width.mas_equalTo(260);
+            make.bottom.mas_equalTo(self.container.mas_bottom).offset(-10);
+        }];
+    }
+}
+
+
+- (TXShareMusicCellContentView *)musicContentView {
+    if (!_musicContentView) {
+        _musicContentView = [TXShareMusicCellContentView shareInstance];
+    }
+    return _musicContentView;
+}
+
+- (void)setSelected:(BOOL)selected animated:(BOOL)animated {
+    [super setSelected:selected animated:animated];
+
+    // Configure the view for the selected state
+}
+
+#pragma mark - TUIMessageCellProtocol
++ (CGSize)getContentSize:(TUIMessageCellData *)data {
+    CGFloat width = ([UIScreen mainScreen].bounds.size.width > [UIScreen mainScreen].bounds.size.height ? [UIScreen mainScreen].bounds.size.height : [UIScreen mainScreen].bounds.size.width);
+    return CGSizeMake(width, 100+20);
+}
+
+@end

+ 20 - 0
KulexiuForTeacher/Pods/TUIChat/TXLiveShareCell.h

@@ -0,0 +1,20 @@
+//
+//  TXLiveShareCell.h
+//  TUIChat
+//
+//  Created by 王智 on 2023/8/10.
+//
+
+#import "TUIMessageCell.h"
+#import "TXLiveShareMessage.h"
+
+
+NS_ASSUME_NONNULL_BEGIN
+
+@interface TXLiveShareCell : TUIMessageCell
+
+- (void)fillWithData:(TXLiveShareMessage *)data; // 绘制 UI
+
+@end
+
+NS_ASSUME_NONNULL_END

+ 99 - 0
KulexiuForTeacher/Pods/TUIChat/TXLiveShareCell.m

@@ -0,0 +1,99 @@
+//
+//  TXLiveShareCell.m
+//  TUIChat
+//
+//  Created by 王智 on 2023/8/10.
+//
+
+#import "TXLiveShareCell.h"
+#import "TXShareLiveCellContentView.h"
+#import "Masonry.h"
+
+@interface TXLiveShareCell ()
+
+@property (nonatomic, strong) TXShareLiveCellContentView *liveContentView;
+
+
+@end
+
+@implementation TXLiveShareCell
+
+- (instancetype)initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(NSString *)reuseIdentifier {
+    self = [super initWithStyle:style reuseIdentifier:reuseIdentifier];
+    
+    if (self) {
+        [self configUI];
+    }
+    return self;
+}
+
+- (void)configUI {
+    
+    [self.container addSubview:self.liveContentView];
+    [self.liveContentView mas_makeConstraints:^(MASConstraintMaker *make) {
+        make.right.mas_equalTo(self.container.mas_right);
+        make.top.mas_equalTo(self.container.mas_top);
+        make.width.mas_equalTo(260);
+        make.bottom.mas_equalTo(self.container.mas_bottom).offset(-10);
+    }];
+}
+
+- (void)fillWithData:(TXLiveShareMessage *)data {
+    [super fillWithData:data];
+    [self.liveContentView configCellWithShareAvatar:data.teacherAvatar teacherName:data.teacherName liveDesc:data.liveDescMessage];
+    if (data.direction == MsgDirectionIncoming) {
+        [self.liveContentView mas_remakeConstraints:^(MASConstraintMaker *make) {
+            make.left.mas_equalTo(self.container.mas_left);
+            make.top.mas_equalTo(self.container.mas_top);
+            make.width.mas_equalTo(260);
+            make.bottom.mas_equalTo(self.container.mas_bottom).offset(-10);
+        }];
+    }
+    else {
+        [self.liveContentView mas_remakeConstraints:^(MASConstraintMaker *make) {
+            make.right.mas_equalTo(self.container.mas_right);
+            make.top.mas_equalTo(self.container.mas_top);
+            make.width.mas_equalTo(260);
+            make.bottom.mas_equalTo(self.container.mas_bottom).offset(-10);
+        }];
+    }
+}
+
+- (TXShareLiveCellContentView *)liveContentView {
+    if (!_liveContentView) {
+        _liveContentView = [TXShareLiveCellContentView shareIntance];
+    }
+    return _liveContentView;
+}
+
+- (void)setSelected:(BOOL)selected animated:(BOOL)animated {
+    [super setSelected:selected animated:animated];
+
+    // Configure the view for the selected state
+}
+
+#pragma mark - TUIMessageCellProtocol
++ (CGSize)getContentSize:(TUIMessageCellData *)data {
+    TXLiveShareMessage *shareMsg = (TXLiveShareMessage *)data;
+    CGFloat width = ([UIScreen mainScreen].bounds.size.width > [UIScreen mainScreen].bounds.size.height ? [UIScreen mainScreen].bounds.size.height : [UIScreen mainScreen].bounds.size.width);
+
+    if (![self isEmptyString:shareMsg.liveDescMessage]) {
+        NSMutableParagraphStyle *paragraphStyle = [[NSMutableParagraphStyle alloc] init];
+        [paragraphStyle setLineSpacing:4];//调整行间距
+        
+        CGFloat height = [shareMsg.liveDescMessage boundingRectWithSize:CGSizeMake(260, CGFLOAT_MAX) options:(NSStringDrawingTruncatesLastVisibleLine | NSStringDrawingUsesLineFragmentOrigin | NSStringDrawingUsesFontLeading) attributes:@{NSParagraphStyleAttributeName:paragraphStyle,NSFontAttributeName:[UIFont systemFontOfSize:14.0f]} context:nil].size.height + 6;
+        CGFloat contentHeight = height + 123 + 20;
+        return CGSizeMake(width, contentHeight);
+    }
+    else {
+        return CGSizeMake(width, 123 + 20);
+    }
+}
+
++ (BOOL)isEmptyString:(NSString *)str {
+    if (str == nil || str.length == 0) {
+        return YES;
+    }
+    return NO;
+}
+@end

+ 20 - 0
KulexiuForTeacher/Pods/TUIChat/TXShareLiveCellContentView.h

@@ -0,0 +1,20 @@
+//
+//  TXShareLiveCellContentView.h
+//  TUIChat
+//
+//  Created by 王智 on 2023/8/10.
+//
+
+#import <UIKit/UIKit.h>
+
+NS_ASSUME_NONNULL_BEGIN
+
+@interface TXShareLiveCellContentView : UIView
+
++ (instancetype)shareIntance;
+
+- (void)configCellWithShareAvatar:(NSString *)avatar teacherName:(NSString *)teacherName liveDesc:(NSString *)desc;
+
+@end
+
+NS_ASSUME_NONNULL_END

+ 218 - 0
KulexiuForTeacher/Pods/TUIChat/TXShareLiveCellContentView.m

@@ -0,0 +1,218 @@
+//
+//  TXShareLiveCellContentView.m
+//  TUIChat
+//
+//  Created by 王智 on 2023/8/10.
+//
+
+#import "TXShareLiveCellContentView.h"
+#import "Masonry.h"
+#import "UIImageView+WebCache.h"
+#import "TUIDefine.h"
+
+#define TXHexRGB(rgbValue) [UIColor colorWithRed:((float)((rgbValue & 0xFF0000) >> 16))/255.0 green:((float)((rgbValue & 0xFF00) >> 8))/255.0 blue:((float)(rgbValue & 0xFF))/255.0 alpha:1.0]
+
+@interface TXShareLiveCellContentView ()
+
+@property (nonatomic, strong) UIImageView *teacherAvatar;
+
+@property (nonatomic, strong) UILabel *descLabel;
+
+@property (nonatomic, strong) UILabel *waitDesc;
+
+@property (nonatomic, strong) UIView *liveView;
+
+@end
+
+@implementation TXShareLiveCellContentView
+
++ (instancetype)shareIntance {
+    return [[TXShareLiveCellContentView alloc] init];
+}
+
+- (instancetype)init {
+    self = [super init];
+    if (self) {
+        [self configUI];
+    }
+    return self;
+}
+
+- (void)configUI {
+    self.layer.cornerRadius = 10.0f;
+    self.backgroundColor = [UIColor whiteColor];
+    
+    UIView *avatarBg = [[UIView alloc] init];
+    avatarBg.backgroundColor = TXHexRGB(0xFF4347);
+    avatarBg.layer.cornerRadius = 22.0f;
+    [self addSubview:avatarBg];
+    [avatarBg mas_makeConstraints:^(MASConstraintMaker *make) {
+        make.left.mas_equalTo(self.mas_left).offset(14);
+        make.top.mas_equalTo(self.mas_top).offset(11);
+        make.width.height.mas_equalTo(44);
+    }];
+    
+    [avatarBg addSubview:self.teacherAvatar];
+    [self.teacherAvatar mas_makeConstraints:^(MASConstraintMaker *make) {
+        make.centerX.mas_equalTo(avatarBg.mas_centerX);
+        make.centerY.mas_equalTo(avatarBg.mas_centerY);
+        make.width.height.mas_equalTo(42.0);
+    }];
+    
+    [self addSubview:self.liveView];
+    [self.liveView mas_makeConstraints:^(MASConstraintMaker *make) {
+        make.centerX.mas_equalTo(avatarBg.mas_centerX);
+        make.centerY.mas_equalTo(avatarBg.mas_bottom);
+        make.width.mas_equalTo(34);
+        make.height.mas_equalTo(16);
+    }];
+    
+    UIView *colorView = [[UIView alloc] init];
+    colorView.backgroundColor = TXHexRGB(0xFF4347);
+    colorView.layer.cornerRadius = 6.0f;
+    [self.liveView addSubview:colorView];
+    [colorView mas_makeConstraints:^(MASConstraintMaker *make) {
+        make.left.mas_equalTo(self.liveView.mas_left).offset(2);
+        make.right.mas_equalTo(self.liveView.mas_right).offset(-2);
+        make.top.mas_equalTo(self.liveView.mas_top).offset(1);
+        make.bottom.mas_equalTo(self.liveView.mas_bottom).offset(-1);
+    }];
+    
+    UILabel *liveLabel = [[UILabel alloc] init];
+    liveLabel.text = @"直播中";
+    liveLabel.textColor = TXHexRGB(0xffffff);
+    liveLabel.font = [UIFont systemFontOfSize:8.0f];
+    [colorView addSubview:liveLabel];
+    [liveLabel mas_makeConstraints:^(MASConstraintMaker *make) {
+        make.left.mas_equalTo(colorView.mas_left).offset(2);
+        make.right.mas_equalTo(colorView.mas_right).offset(-3);
+        make.top.mas_equalTo(colorView.mas_top).offset(1);
+        make.bottom.mas_equalTo(colorView.mas_bottom).offset(-1);
+    }];
+    
+    UILabel *liveHeadLable = [[UILabel alloc] init];
+    liveHeadLable.text = @"「正在直播」";
+    liveHeadLable.font = [UIFont systemFontOfSize:14.0f];
+    liveHeadLable.textColor = TXHexRGB(0x999999);
+    [self addSubview:liveHeadLable];
+    [liveHeadLable mas_makeConstraints:^(MASConstraintMaker *make) {
+        make.left.mas_equalTo(avatarBg.mas_right).offset(7);
+        make.top.mas_equalTo(avatarBg.mas_top).offset(2);
+        make.height.mas_equalTo(20);
+    }];
+    
+    [self addSubview:self.waitDesc];
+    [self.waitDesc mas_makeConstraints:^(MASConstraintMaker *make) {
+        make.left.mas_equalTo(liveHeadLable.mas_left);
+        make.top.mas_equalTo(liveHeadLable.mas_bottom).offset(1);
+        make.height.mas_equalTo(20);
+        make.right.mas_equalTo(self.mas_right).offset(-12);
+    }];
+    
+    [self addSubview:self.descLabel];
+    [self.descLabel mas_makeConstraints:^(MASConstraintMaker *make) {
+        make.left.mas_equalTo(self.mas_left).offset(12);
+        make.right.mas_equalTo(self.mas_right).offset(-12);
+        make.top.mas_equalTo(avatarBg.mas_bottom).offset(8);
+    }];
+    UIView *lineView = [[UIView alloc] init];
+    lineView.backgroundColor = TXHexRGB(0xF2F2F2);
+    [self addSubview:lineView];
+    [lineView mas_makeConstraints:^(MASConstraintMaker *make) {
+        make.left.mas_equalTo(self.mas_left);
+        make.right.mas_equalTo(self.mas_right);
+        make.height.mas_equalTo(1);
+        make.top.mas_equalTo(self.descLabel.mas_bottom).offset(10);
+    }];
+    UILabel *enterLabel = [[UILabel alloc] init];
+    enterLabel.text = @"进入直播间";
+    enterLabel.font = [UIFont systemFontOfSize:15.0f weight:UIFontWeightMedium];
+    enterLabel.textColor = TXHexRGB(0xFF4347);
+    [self addSubview:enterLabel];
+    [enterLabel mas_makeConstraints:^(MASConstraintMaker *make) {
+        make.centerX.mas_equalTo(self.mas_centerX);
+        make.height.mas_equalTo(21);
+        make.top.mas_equalTo(lineView.mas_bottom).offset(7);
+    }];
+}
+
+
+- (void)configCellWithShareAvatar:(NSString *)avatar teacherName:(NSString *)teacherName liveDesc:(NSString *)desc {
+    [self.teacherAvatar sd_setImageWithURL:[NSURL URLWithString:[self getUrlEndcodeString:avatar]] placeholderImage:[UIImage imageNamed:@"user_default_avatal"]];
+    self.waitDesc.text = [NSString stringWithFormat:@"%@在直播间等你哦~",[self returnNoNullStringWithString:teacherName]];
+    if (![self isEmptyString:desc]) {
+        NSMutableParagraphStyle *paragraphStyle = [[NSMutableParagraphStyle alloc] init];
+        [paragraphStyle setLineSpacing:4];//调整行间距
+        NSMutableAttributedString *attr = [[NSMutableAttributedString alloc] initWithString:desc attributes:@{NSParagraphStyleAttributeName:paragraphStyle,NSFontAttributeName:[UIFont systemFontOfSize:14.0f],NSForegroundColorAttributeName:TXHexRGB(0x666666)}];
+        self.descLabel.attributedText = attr;
+    }
+    else {
+        self.descLabel.text = @"";
+    }
+}
+
+- (NSString *)returnNoNullStringWithString:(NSString *)string {
+    
+    if (string == nil || string.length == 0) {
+        return @"";
+    }
+    return string;
+}
+
+- (NSString *)getUrlEndcodeString:(NSString *)string {
+    return [string stringByAddingPercentEncodingWithAllowedCharacters:[NSCharacterSet URLQueryAllowedCharacterSet]];;
+}
+
+- (BOOL)isEmptyString:(NSString *)str {
+    if (str == nil || str.length == 0) {
+        return YES;
+    }
+    return NO;
+}
+
+#pragma mark ------ live view
+- (UIImageView *)teacherAvatar {
+    if (!_teacherAvatar) {
+        _teacherAvatar = [[UIImageView alloc] init];
+        _teacherAvatar.contentMode = UIViewContentModeScaleAspectFill;
+        _teacherAvatar.layer.cornerRadius = 21.0f;
+        _teacherAvatar.layer.masksToBounds = YES;
+    }
+    return _teacherAvatar;
+}
+- (UIView *)liveView {
+    if (!_liveView) {
+        _liveView = [[UIView alloc] init];
+        _liveView.backgroundColor = [UIColor whiteColor];
+        _liveView.layer.cornerRadius = 8.0f;
+    }
+    return _liveView;
+}
+
+- (UILabel *)waitDesc {
+    if (!_waitDesc) {
+        _waitDesc = [[UILabel alloc] init];
+        _waitDesc.textColor = TXHexRGB(0x4A4A4A);
+        _waitDesc.font = [UIFont systemFontOfSize:14.0f weight:UIFontWeightMedium];
+    }
+    return _waitDesc;
+}
+- (UILabel *)descLabel {
+    if (!_descLabel) {
+        _descLabel = [[UILabel alloc] init];
+        _descLabel.textColor = TXHexRGB(0x666666);
+        _descLabel.font = [UIFont systemFontOfSize:14.0f weight:UIFontWeightRegular];
+        _descLabel.numberOfLines = 2;
+    }
+    return _descLabel;
+}
+
+/*
+// Only override drawRect: if you perform custom drawing.
+// An empty implementation adversely affects performance during animation.
+- (void)drawRect:(CGRect)rect {
+    // Drawing code
+}
+*/
+
+@end

+ 22 - 0
KulexiuForTeacher/Pods/TUIChat/TXShareMusicCellContentView.h

@@ -0,0 +1,22 @@
+//
+//  TXShareMusicCellContentView.h
+//  TUIChat
+//
+//  Created by 王智 on 2023/8/10.
+//
+
+#import <UIKit/UIKit.h>
+
+NS_ASSUME_NONNULL_BEGIN
+
+@interface TXShareMusicCellContentView : UIView
+
+
+
++ (instancetype)shareInstance;
+
+- (void)configWithSongName:(NSString *)songName type:(NSString *)type authName:(NSString *)authName sendAvatar:(NSString *)sendAvatar sendName:(NSString *)sendName userId:(NSString *)userId tags:(NSString *)tags;
+
+@end
+
+NS_ASSUME_NONNULL_END

+ 269 - 0
KulexiuForTeacher/Pods/TUIChat/TXShareMusicCellContentView.m

@@ -0,0 +1,269 @@
+//
+//  TXShareMusicCellContentView.m
+//  TUIChat
+//
+//  Created by 王智 on 2023/8/10.
+//
+
+#import "TXShareMusicCellContentView.h"
+#import "Masonry.h"
+#import "UIImageView+WebCache.h"
+#import "TUIDefine.h"
+
+#define TXHexRGB(rgbValue) [UIColor colorWithRed:((float)((rgbValue & 0xFF0000) >> 16))/255.0 green:((float)((rgbValue & 0xFF00) >> 8))/255.0 blue:((float)(rgbValue & 0xFF))/255.0 alpha:1.0]
+
+@interface TXShareMusicCellContentView ()
+
+@property (nonatomic, strong) UILabel *songName;
+
+@property (nonatomic, strong) UILabel *songAuth;
+
+@property (nonatomic, strong) UIImageView *uploaderLogo;
+
+@property (nonatomic, strong) UILabel *uploaderName;
+
+@property (nonatomic, strong) UIImageView *typeImage;
+
+@property (nonatomic, strong) UIView *tagView;
+
+@end
+
+@implementation TXShareMusicCellContentView
+
++ (instancetype)shareInstance {
+    return [[TXShareMusicCellContentView alloc] init];
+}
+
+- (instancetype)init {
+    self = [super init];
+    if (self) {
+        [self configUI];
+    }
+    return self;
+}
+
+- (void)configUI {
+    self.layer.cornerRadius = 10.0f;
+    self.backgroundColor = [UIColor whiteColor];
+    UIImageView *musicLogo = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"music_logo"]];
+    [self addSubview:musicLogo];
+    [musicLogo mas_makeConstraints:^(MASConstraintMaker *make) {
+        make.top.mas_equalTo(self.mas_top).offset(10);
+        make.left.mas_equalTo(self.mas_left).offset(11);
+        make.width.mas_equalTo(41);
+        make.height.mas_equalTo(40);
+    }];
+    
+    [self addSubview:self.songName];
+    [self.songName mas_makeConstraints:^(MASConstraintMaker *make) {
+        make.top.mas_equalTo(musicLogo.mas_top);
+        make.height.mas_equalTo(20);
+        make.left.mas_equalTo(musicLogo.mas_right).offset(6);
+    }];
+    [self addSubview:self.typeImage];
+    [self.typeImage mas_makeConstraints:^(MASConstraintMaker *make) {
+        make.left.mas_equalTo(self.songName.mas_right).offset(4);
+        make.width.mas_equalTo(55);
+        make.height.mas_equalTo(22);
+        make.centerY.mas_equalTo(self.songName.mas_centerY);
+        make.right.mas_lessThanOrEqualTo(self.mas_right).offset(-12);
+    }];
+    
+    UIView *lineView = [[UIView alloc] init];
+    lineView.backgroundColor = TXHexRGB(0xF2F2F2);
+    [self addSubview:lineView];
+    [lineView mas_makeConstraints:^(MASConstraintMaker *make) {
+        make.top.mas_equalTo(musicLogo.mas_bottom).offset(10);
+        make.left.mas_equalTo(self.mas_left).offset(10);
+        make.right.mas_equalTo(self.mas_right).offset(-10);
+        make.height.mas_equalTo(1);
+    }];
+    
+    [self addSubview:self.uploaderLogo];
+    [self.uploaderLogo mas_makeConstraints:^(MASConstraintMaker *make) {
+        make.left.mas_equalTo(self.mas_left).offset(18);
+        make.top.mas_equalTo(lineView.mas_top).offset(8);
+        make.width.height.mas_equalTo(20);
+    }];
+    [self addSubview:self.songAuth];
+    [self.songAuth mas_makeConstraints:^(MASConstraintMaker *make) {
+        make.left.mas_equalTo(self.songName.mas_left);
+        make.top.mas_equalTo(self.typeImage.mas_bottom).offset(2);
+        make.height.mas_equalTo(17);
+        make.right.mas_equalTo(self.mas_right).offset(-10);
+    }];
+    [self addSubview:self.uploaderName];
+    [self.uploaderName mas_makeConstraints:^(MASConstraintMaker *make) {
+        make.left.mas_equalTo(self.uploaderLogo.mas_right).offset(7);
+        make.centerY.mas_equalTo(self.uploaderLogo.mas_centerY);
+        make.height.mas_equalTo(15);
+    }];
+    
+    [self addSubview:self.tagView];
+    [self.tagView mas_makeConstraints:^(MASConstraintMaker *make) {
+        make.centerY.mas_equalTo(self.uploaderName.mas_centerY);
+        make.left.mas_equalTo(self.uploaderName.mas_right).offset(8);
+        make.right.mas_equalTo(self.mas_right).offset(-10);
+        make.height.mas_equalTo(16);
+    }];
+}
+
+
+
+- (void)configWithSongName:(NSString *)songName type:(NSString *)type authName:(NSString *)authName sendAvatar:(NSString *)sendAvatar sendName:(NSString *)sendName userId:(NSString *)userId tags:(NSString *)tags {
+    self.songName.text = [self returnNoNullStringWithString:songName];
+    self.songAuth.text = [self returnNoNullStringWithString:authName];
+    NSArray *tagArray = [tags componentsSeparatedByString:@","];
+    NSString *owner = @"";
+    if ([self isEmptyString:sendName]) {
+        owner = [NSString stringWithFormat:@"游客%@",userId];
+    }
+    else {
+        owner = sendName;
+    }
+    CGFloat maxWidth = [self getTagViewMaxWidth:owner];
+    [self configTagViewWithTagArray:tagArray maxWidth:maxWidth];
+    NSString *typeImgName = @"";
+    if ([type isEqualToString:@"VIP"]) {
+        typeImgName = @"music_vip";
+    }
+    else if ([type isEqualToString:@"CHARGE"]) {
+        typeImgName = @"music_order";
+    }
+    else {
+        typeImgName = @"music_free";
+    }
+    [self.typeImage setImage:[UIImage imageNamed:typeImgName]];
+    
+    self.uploaderName.text = [self returnNoNullStringWithString:owner];
+    [self.uploaderLogo sd_setImageWithURL:[NSURL URLWithString:[self getUrlEndcodeString:sendAvatar]] placeholderImage:[UIImage imageNamed:@"user_default_avatal"]];
+}
+
+- (CGFloat)getTagViewMaxWidth:(NSString *)teacherName {
+    CGFloat width = [self getStringWidthInLabel:teacherName font:[UIFont systemFontOfSize:12.0f]];
+    return 260 - 45  - 10 - 14 - width - 8;
+}
+
+- (void)configTagViewWithTagArray:(NSArray *)tagArray maxWidth:(CGFloat)maxWidth {
+    [self removeAllSubViews:self.tagView];
+    CGFloat width = maxWidth;
+    CGFloat xSpace = 0.0f;
+    for (NSInteger i = 0; i < tagArray.count; i++) {
+        NSString *tagString = tagArray[i];
+        CGFloat labelWidth = [self getStringWidthInLabel:tagString font:[UIFont systemFontOfSize:11.0f]];
+        CGFloat viewWidth = labelWidth + 8;
+        if (xSpace + viewWidth > width) {
+            return;
+        }
+        CGRect frame = CGRectMake(xSpace, 0, viewWidth, 16.0f);
+        [self createTagLabelViewWithName:tagString frame:frame];
+        xSpace += (viewWidth + 6);
+    }
+}
+
+- (CGFloat)getStringWidthInLabel:(NSString *)tagString font:(UIFont *)font {
+    CGFloat width = [tagString boundingRectWithSize:CGSizeMake(CGFLOAT_MAX, 16.0f) options:NSStringDrawingUsesLineFragmentOrigin | NSStringDrawingUsesFontLeading attributes:@{NSFontAttributeName:font} context:nil].size.width+1;
+    return width;
+}
+
+- (void)createTagLabelViewWithName:(NSString *)name frame:(CGRect)frame {
+    UIView *bgView = [[UIView alloc] initWithFrame:frame];
+    bgView.backgroundColor = TXHexRGB(0xfff1de);
+    bgView.layer.cornerRadius = 4.0f;
+    [self.tagView addSubview:bgView];
+    
+    UILabel *tagLabel = [[UILabel alloc] init];
+    tagLabel.text = name;
+    tagLabel.textColor = TXHexRGB(0xff8c00);
+    tagLabel.font = [UIFont systemFontOfSize:11.0f];
+    tagLabel.textAlignment = NSTextAlignmentCenter;
+    [bgView addSubview:tagLabel];
+    [tagLabel mas_makeConstraints:^(MASConstraintMaker *make) {
+        make.left.mas_equalTo(bgView.mas_left).offset(4);
+        make.right.mas_equalTo(bgView.mas_right).offset(-4);
+        make.top.bottom.mas_equalTo(bgView);
+    }];
+}
+
+- (NSString *)returnNoNullStringWithString:(NSString *)string {
+    
+    if (string == nil || string.length == 0) {
+        return @"";
+    }
+    return string;
+}
+
+- (NSString *)getUrlEndcodeString:(NSString *)string {
+    return [string stringByAddingPercentEncodingWithAllowedCharacters:[NSCharacterSet URLQueryAllowedCharacterSet]];;
+}
+
+- (void)removeAllSubViews:(UIView *)view {
+    while (view.subviews.count) {
+        [view.subviews.lastObject removeFromSuperview];
+    }
+}
+
+- (BOOL)isEmptyString:(NSString *)str {
+    if (str == nil || str.length == 0) {
+        return YES;
+    }
+    return NO;
+}
+
+
+#pragma mark ----- lazying
+- (UILabel *)songName {
+    if (!_songName) {
+        _songName = [[UILabel alloc] init];
+        _songName.textColor = TXHexRGB(0x333333);
+        _songName.font = [UIFont systemFontOfSize:14.0f weight:UIFontWeightSemibold];
+    }
+    return _songName;
+}
+
+- (UILabel *)songAuth {
+    if (!_songAuth) {
+        _songAuth = [[UILabel alloc] init];
+        _songAuth.textColor = TXHexRGB(0x6A6A6A);
+        _songAuth.font = [UIFont systemFontOfSize:12.0f];
+    }
+    return _songAuth;
+}
+
+- (UIImageView *)uploaderLogo {
+    if (!_uploaderLogo) {
+        _uploaderLogo = [[UIImageView alloc] init];
+    }
+    return _uploaderLogo;
+}
+
+- (UILabel *)uploaderName {
+    if (!_uploaderName) {
+        _uploaderName = [[UILabel alloc] init];
+        _uploaderName.textColor = TXHexRGB(0x333333);
+        _uploaderName.font = [UIFont systemFontOfSize:12.0f];
+    }
+    return _uploaderName;
+}
+- (UIImageView *)typeImage {
+    if (!_typeImage) {
+        _typeImage = [[UIImageView alloc] init];
+    }
+    return _typeImage;
+}
+
+- (UIView *)tagView {
+    if (!_tagView) {
+        _tagView = [[UIView alloc] init];
+    }
+    return _tagView;
+}
+/*
+// Only override drawRect: if you perform custom drawing.
+// An empty implementation adversely affects performance during animation.
+- (void)drawRect:(CGRect)rect {
+    // Drawing code
+}
+*/
+
+@end