Browse Source

群公告

Kyle Smart 6 months ago
parent
commit
68d4c42b0a
33 changed files with 1375 additions and 245 deletions
  1. 32 0
      KulexiuForTeacher/KulexiuForTeacher.xcodeproj/project.pbxproj
  2. 2 2
      KulexiuForTeacher/KulexiuForTeacher.xcodeproj/xcshareddata/xcschemes/KulexiuForTeacher.xcscheme
  3. 22 0
      KulexiuForTeacher/KulexiuForTeacher/Assets.xcassets/Chat/notice_content.imageset/Contents.json
  4. BIN
      KulexiuForTeacher/KulexiuForTeacher/Assets.xcassets/Chat/notice_content.imageset/notice_content@2x.png
  5. BIN
      KulexiuForTeacher/KulexiuForTeacher/Assets.xcassets/Chat/notice_content.imageset/notice_content@3x.png
  6. 22 0
      KulexiuForTeacher/KulexiuForTeacher/Assets.xcassets/Chat/notice_title.imageset/Contents.json
  7. BIN
      KulexiuForTeacher/KulexiuForTeacher/Assets.xcassets/Chat/notice_title.imageset/notice_title@2x.png
  8. BIN
      KulexiuForTeacher/KulexiuForTeacher/Assets.xcassets/Chat/notice_title.imageset/notice_title@3x.png
  9. 10 0
      KulexiuForTeacher/KulexiuForTeacher/Common/Base/KSNetworkingManager.h
  10. 14 0
      KulexiuForTeacher/KulexiuForTeacher/Common/Base/KSNetworkingManager.m
  11. 0 4
      KulexiuForTeacher/KulexiuForTeacher/Module/Chat/Controller/TXCustom/KSTXBaseChatViewController.h
  12. 30 31
      KulexiuForTeacher/KulexiuForTeacher/Module/Chat/Controller/TXCustom/KSTXBaseChatViewController.m
  13. 5 5
      KulexiuForTeacher/KulexiuForTeacher/Module/Chat/Group/View/GroupApplyChooseAllCell.xib
  14. 4 4
      KulexiuForTeacher/KulexiuForTeacher/Module/Chat/Group/View/GroupApplyChooseCell.xib
  15. 4 4
      KulexiuForTeacher/KulexiuForTeacher/Module/Chat/Group/View/GroupApplyMemberCell.xib
  16. 21 0
      KulexiuForTeacher/KulexiuForTeacher/Module/Chat/GroupNotice/Controller/GroupNoticeDetailViewController.h
  17. 164 0
      KulexiuForTeacher/KulexiuForTeacher/Module/Chat/GroupNotice/Controller/GroupNoticeDetailViewController.m
  18. 2 1
      KulexiuForTeacher/KulexiuForTeacher/Module/Chat/GroupNotice/Controller/GroupNoticeEditController.m
  19. 32 23
      KulexiuForTeacher/KulexiuForTeacher/Module/Chat/GroupNotice/Controller/GroupNoticeViewController.m
  20. 34 0
      KulexiuForTeacher/KulexiuForTeacher/Module/Chat/GroupNotice/Model/GroupNoticeDetailModel.h
  21. 197 0
      KulexiuForTeacher/KulexiuForTeacher/Module/Chat/GroupNotice/Model/GroupNoticeDetailModel.m
  22. 11 8
      KulexiuForTeacher/KulexiuForTeacher/Module/Chat/GroupNotice/View/GroupNoticeCell.m
  23. 75 73
      KulexiuForTeacher/KulexiuForTeacher/Module/Chat/GroupNotice/View/GroupNoticeCell.xib
  24. 24 0
      KulexiuForTeacher/KulexiuForTeacher/Module/Chat/GroupNotice/View/GroupNoticeDetailBodyView.h
  25. 85 0
      KulexiuForTeacher/KulexiuForTeacher/Module/Chat/GroupNotice/View/GroupNoticeDetailBodyView.m
  26. 166 0
      KulexiuForTeacher/KulexiuForTeacher/Module/Chat/GroupNotice/View/GroupNoticeDetailBodyView.xib
  27. 30 0
      KulexiuForTeacher/KulexiuForTeacher/Module/Chat/GroupNotice/View/KSPopView.h
  28. 105 0
      KulexiuForTeacher/KulexiuForTeacher/Module/Chat/GroupNotice/View/KSPopView.m
  29. 147 0
      KulexiuForTeacher/KulexiuForTeacher/Module/Chat/GroupNotice/View/KSPopView.xib
  30. 5 0
      KulexiuForTeacher/KulexiuForTeacher/Module/Chat/GroupNotice/View/NoticeEditBodyView.h
  31. 10 6
      KulexiuForTeacher/KulexiuForTeacher/Module/Chat/GroupNotice/View/NoticeEditBodyView.m
  32. 106 68
      KulexiuForTeacher/KulexiuForTeacher/Module/Chat/GroupNotice/View/NoticeEditBodyView.xib
  33. 16 16
      KulexiuForTeacher/Pods/Pods.xcodeproj/project.pbxproj

+ 32 - 0
KulexiuForTeacher/KulexiuForTeacher.xcodeproj/project.pbxproj

@@ -407,6 +407,12 @@
 		BC2456F3286BEFDA00D1F7C0 /* MineEmptyVideoCell.m in Sources */ = {isa = PBXBuildFile; fileRef = BC2456F1286BEFDA00D1F7C0 /* MineEmptyVideoCell.m */; };
 		BC2456F4286BEFDA00D1F7C0 /* MineEmptyVideoCell.xib in Resources */ = {isa = PBXBuildFile; fileRef = BC2456F2286BEFDA00D1F7C0 /* MineEmptyVideoCell.xib */; };
 		BC245710286C437D00D1F7C0 /* synthgms.sf2 in Resources */ = {isa = PBXBuildFile; fileRef = BC24570F286C437D00D1F7C0 /* synthgms.sf2 */; };
+		BC2820E52C9182D9008BD2CC /* GroupNoticeDetailBodyView.xib in Resources */ = {isa = PBXBuildFile; fileRef = BC2820E32C9182D8008BD2CC /* GroupNoticeDetailBodyView.xib */; };
+		BC2820E62C9182D9008BD2CC /* GroupNoticeDetailBodyView.m in Sources */ = {isa = PBXBuildFile; fileRef = BC2820E42C9182D9008BD2CC /* GroupNoticeDetailBodyView.m */; };
+		BC2820E92C918308008BD2CC /* GroupNoticeDetailModel.m in Sources */ = {isa = PBXBuildFile; fileRef = BC2820E72C918308008BD2CC /* GroupNoticeDetailModel.m */; };
+		BC2820EC2C918314008BD2CC /* GroupNoticeDetailViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = BC2820EA2C918314008BD2CC /* GroupNoticeDetailViewController.m */; };
+		BC2820F82C918465008BD2CC /* KSPopView.m in Sources */ = {isa = PBXBuildFile; fileRef = BC2820F62C918465008BD2CC /* KSPopView.m */; };
+		BC2820F92C918465008BD2CC /* KSPopView.xib in Resources */ = {isa = PBXBuildFile; fileRef = BC2820F72C918465008BD2CC /* KSPopView.xib */; };
 		BC28582F2809451B0024697C /* EvaluateCouseCell.m in Sources */ = {isa = PBXBuildFile; fileRef = BC28582D2809451B0024697C /* EvaluateCouseCell.m */; };
 		BC2858302809451B0024697C /* EvaluateCouseCell.xib in Resources */ = {isa = PBXBuildFile; fileRef = BC28582E2809451B0024697C /* EvaluateCouseCell.xib */; };
 		BC285833280947BA0024697C /* EvaluateSortView.m in Sources */ = {isa = PBXBuildFile; fileRef = BC285832280947BA0024697C /* EvaluateSortView.m */; };
@@ -1839,6 +1845,16 @@
 		BC24570F286C437D00D1F7C0 /* synthgms.sf2 */ = {isa = PBXFileReference; lastKnownFileType = file; path = synthgms.sf2; sourceTree = "<group>"; };
 		BC255E802B29424900A1FC27 /* SwiftImportHeader.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = SwiftImportHeader.h; sourceTree = "<group>"; };
 		BC255E812B29424900A1FC27 /* WebViewBaseConfig.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = WebViewBaseConfig.h; sourceTree = "<group>"; };
+		BC2820E22C9182D7008BD2CC /* GroupNoticeDetailBodyView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = GroupNoticeDetailBodyView.h; sourceTree = "<group>"; };
+		BC2820E32C9182D8008BD2CC /* GroupNoticeDetailBodyView.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = GroupNoticeDetailBodyView.xib; sourceTree = "<group>"; };
+		BC2820E42C9182D9008BD2CC /* GroupNoticeDetailBodyView.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = GroupNoticeDetailBodyView.m; sourceTree = "<group>"; };
+		BC2820E72C918308008BD2CC /* GroupNoticeDetailModel.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = GroupNoticeDetailModel.m; sourceTree = "<group>"; };
+		BC2820E82C918308008BD2CC /* GroupNoticeDetailModel.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = GroupNoticeDetailModel.h; sourceTree = "<group>"; };
+		BC2820EA2C918314008BD2CC /* GroupNoticeDetailViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = GroupNoticeDetailViewController.m; sourceTree = "<group>"; };
+		BC2820EB2C918314008BD2CC /* GroupNoticeDetailViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = GroupNoticeDetailViewController.h; sourceTree = "<group>"; };
+		BC2820F52C918465008BD2CC /* KSPopView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = KSPopView.h; sourceTree = "<group>"; };
+		BC2820F62C918465008BD2CC /* KSPopView.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = KSPopView.m; sourceTree = "<group>"; };
+		BC2820F72C918465008BD2CC /* KSPopView.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = KSPopView.xib; sourceTree = "<group>"; };
 		BC28582C2809451B0024697C /* EvaluateCouseCell.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = EvaluateCouseCell.h; sourceTree = "<group>"; };
 		BC28582D2809451B0024697C /* EvaluateCouseCell.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = EvaluateCouseCell.m; sourceTree = "<group>"; };
 		BC28582E2809451B0024697C /* EvaluateCouseCell.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = EvaluateCouseCell.xib; sourceTree = "<group>"; };
@@ -3048,6 +3064,8 @@
 				2755C07D27EC95CC007D9070 /* GroupNoticeViewController.m */,
 				2773204527EDB670008FAECA /* GroupNoticeEditController.h */,
 				2773204627EDB670008FAECA /* GroupNoticeEditController.m */,
+				BC2820EB2C918314008BD2CC /* GroupNoticeDetailViewController.h */,
+				BC2820EA2C918314008BD2CC /* GroupNoticeDetailViewController.m */,
 			);
 			path = Controller;
 			sourceTree = "<group>";
@@ -3057,6 +3075,8 @@
 			children = (
 				27D5D5D327EDBCB600B4720C /* GroupNoticeModel.h */,
 				27D5D5D427EDBCB800B4720C /* GroupNoticeModel.m */,
+				BC2820E82C918308008BD2CC /* GroupNoticeDetailModel.h */,
+				BC2820E72C918308008BD2CC /* GroupNoticeDetailModel.m */,
 			);
 			path = Model;
 			sourceTree = "<group>";
@@ -3070,6 +3090,12 @@
 				27D5D5D027EDBA9400B4720C /* NoticeEditBodyView.h */,
 				27D5D5CE27EDBA9100B4720C /* NoticeEditBodyView.m */,
 				27D5D5CF27EDBA9300B4720C /* NoticeEditBodyView.xib */,
+				BC2820E22C9182D7008BD2CC /* GroupNoticeDetailBodyView.h */,
+				BC2820E42C9182D9008BD2CC /* GroupNoticeDetailBodyView.m */,
+				BC2820E32C9182D8008BD2CC /* GroupNoticeDetailBodyView.xib */,
+				BC2820F52C918465008BD2CC /* KSPopView.h */,
+				BC2820F62C918465008BD2CC /* KSPopView.m */,
+				BC2820F72C918465008BD2CC /* KSPopView.xib */,
 				2773204827EDB72B008FAECA /* LFPopupMenu */,
 			);
 			path = View;
@@ -7454,6 +7480,7 @@
 				275E8A7427E18F2800DD3F6E /* Assets.xcassets in Resources */,
 				BCECE2242B3D648700C0D555 /* CourseFileDisplayView.xib in Resources */,
 				2755C06927EC71C8007D9070 /* GroupSettingBodyView.xib in Resources */,
+				BC2820E52C9182D9008BD2CC /* GroupNoticeDetailBodyView.xib in Resources */,
 				BC71D1EF2887FDD40010F14B /* img_2.png in Resources */,
 				BC8B641D28F3E8D800A08D16 /* KSAwardAlertView.xib in Resources */,
 				BC48C3B028292FBE00EE65C5 /* ReceiveHeaderView.xib in Resources */,
@@ -7661,6 +7688,7 @@
 				BC71DF0D2A89F470003F165E /* NewTXMetronomeAlertView.xib in Resources */,
 				BC31BF902B219C5700F7D538 /* TunerSettingView.xib in Resources */,
 				BC14A60F28A0AAE80086395C /* MineFunctionView.xib in Resources */,
+				BC2820F92C918465008BD2CC /* KSPopView.xib in Resources */,
 				BC73A1F42809693F00FA8F6F /* EvaluateSortView.xib in Resources */,
 				BC542E4828407B4400633781 /* UseBodyView.xib in Resources */,
 				BCC5841628A9FA9D00BAB4CF /* AccompanyLoadingView.xib in Resources */,
@@ -8120,6 +8148,7 @@
 				BCA9CE2127FD642600D558C6 /* MyLiveCourseBodyView.m in Sources */,
 				BC71DF012A89F470003F165E /* TXMainEmtpyView.m in Sources */,
 				BC31BF892B219C5700F7D538 /* KSGaugeView.m in Sources */,
+				BC2820E62C9182D9008BD2CC /* GroupNoticeDetailBodyView.m in Sources */,
 				27F9030027E864AE00C08A19 /* NetworkBodyView.m in Sources */,
 				BC8B6DBF28532DB800866917 /* MusicSheetVoList.m in Sources */,
 				2755C08D27ED5DB2007D9070 /* GroupApplyChooseCell.m in Sources */,
@@ -8335,6 +8364,7 @@
 				BC106B792A8F4586000759A9 /* TXLiveMessageRejectAllSeat.m in Sources */,
 				BC71DF212A89FABD003F165E /* TxRTCRoomConfig.m in Sources */,
 				BC1553482AB31EEC00C1C347 /* TenangGroupCreateBottomView.m in Sources */,
+				BC2820E92C918308008BD2CC /* GroupNoticeDetailModel.m in Sources */,
 				277931EA27E30FC20010E277 /* UIAlertController+Extend.m in Sources */,
 				BC33000F2BBAB5ED003D4921 /* KnowledgePointListModel.m in Sources */,
 				BCC0F7032A8CF13D00C4EFA4 /* TXDanBottomView.m in Sources */,
@@ -8480,6 +8510,7 @@
 				BC41103828066C2F00800BD9 /* HomeworkListViewController.m in Sources */,
 				BC71DF172A89F470003F165E /* TXToolButtonView.m in Sources */,
 				BC29AD2C2BFAFAFA00D44848 /* KSLogManager.m in Sources */,
+				BC2820EC2C918314008BD2CC /* GroupNoticeDetailViewController.m in Sources */,
 				BC0A22A4284751F80065C1AB /* AccompanySongCell.m in Sources */,
 				BC3A4EB728DAFCF7001C4428 /* MusicTagView.m in Sources */,
 				BCED0AEB2C463F9600369AED /* KSMergeEnginePlayer.m in Sources */,
@@ -8493,6 +8524,7 @@
 				BCDF821A2A8A2BEF005F8B82 /* CREmojiCollectionCell.m in Sources */,
 				BC36A50E2AB42B46002FEFB1 /* GroupOwnerTagView.m in Sources */,
 				277935E827E32A450010E277 /* KSBaseViewController.m in Sources */,
+				BC2820F82C918465008BD2CC /* KSPopView.m in Sources */,
 				BC7CFFA52817E37300CAEB21 /* IncomeCountViewController.m in Sources */,
 				2755C08127ED54EF007D9070 /* GroupApplyViewController.m in Sources */,
 				BC221FA828C72FB900F99802 /* StyleInstrumentView.m in Sources */,

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

@@ -52,7 +52,7 @@
       </Testables>
    </TestAction>
    <LaunchAction
-      buildConfiguration = "TEST"
+      buildConfiguration = "DEV"
       selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
       selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
       launchStyle = "0"
@@ -93,7 +93,7 @@
       buildConfiguration = "Debug">
    </AnalyzeAction>
    <ArchiveAction
-      buildConfiguration = "Release"
+      buildConfiguration = "DEV"
       revealArchiveInOrganizer = "YES">
    </ArchiveAction>
 </Scheme>

+ 22 - 0
KulexiuForTeacher/KulexiuForTeacher/Assets.xcassets/Chat/notice_content.imageset/Contents.json

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

BIN
KulexiuForTeacher/KulexiuForTeacher/Assets.xcassets/Chat/notice_content.imageset/notice_content@2x.png


BIN
KulexiuForTeacher/KulexiuForTeacher/Assets.xcassets/Chat/notice_content.imageset/notice_content@3x.png


+ 22 - 0
KulexiuForTeacher/KulexiuForTeacher/Assets.xcassets/Chat/notice_title.imageset/Contents.json

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

BIN
KulexiuForTeacher/KulexiuForTeacher/Assets.xcassets/Chat/notice_title.imageset/notice_title@2x.png


BIN
KulexiuForTeacher/KulexiuForTeacher/Assets.xcassets/Chat/notice_title.imageset/notice_title@3x.png


+ 10 - 0
KulexiuForTeacher/KulexiuForTeacher/Common/Base/KSNetworkingManager.h

@@ -569,6 +569,16 @@ NS_ASSUME_NONNULL_BEGIN
 /// @param faliure 失败
 + (void)imGroupNoticeDelRequest:(NSString *)post noticeID:(NSString *)noticeID success:(void(^)(NSDictionary *dic))success faliure:(void(^)(NSError *error))faliure;
 
+
+// api-teacher/imGroupNotice/getNotice
+
+/// 群公告详情
+/// @param get get
+/// @param noticeId 公告ID
+/// @param success 成功
+/// @param faliure 失败
++ (void)imGroupNoticeDetailRequest:(NSString *)get noticeId:(NSString *)noticeId success:(void(^)(NSDictionary *dic))success faliure:(void(^)(NSError *error))faliure;
+
 #pragma mark ----- 视频课相关
 // /api-teacher/videoLessonGroup/page
 

+ 14 - 0
KulexiuForTeacher/KulexiuForTeacher/Common/Base/KSNetworkingManager.m

@@ -1202,6 +1202,20 @@
     [self request:post andWithUrl:url and:parm success:success faliure:faliure];
 }
 
+// api-teacher/imGroupNotice/getNotice
+
+/// 群公告详情
+/// @param get get
+/// @param noticeId 公告ID
+/// @param success 成功
+/// @param faliure 失败
++ (void)imGroupNoticeDetailRequest:(NSString *)get noticeId:(NSString *)noticeId success:(void(^)(NSDictionary *dic))success faliure:(void(^)(NSError *error))faliure {
+    [self configRequestHeader];
+    NSString *url = [NSString stringWithFormat:@"%@%@/%@", hostURL, @"/api-teacher/imGroupNotice/get", noticeId];
+    NSMutableDictionary *parm = [NSMutableDictionary dictionary];
+    [self request:get andWithUrl:url and:parm success:success faliure:faliure];
+}
+
 #pragma mark ----- 视频课相关
 // /api-teacher/videoLessonGroup/page
 

+ 0 - 4
KulexiuForTeacher/KulexiuForTeacher/Module/Chat/Controller/TXCustom/KSTXBaseChatViewController.h

@@ -6,10 +6,6 @@
 //
 
 #import "TUIBaseChatViewController.h"
-#import <UIKit/UIKit.h>
-#import "TUIBaseMessageController.h"
-#import "TUIChatConversationModel.h"
-#import "TUIInputController.h"
 
 NS_ASSUME_NONNULL_BEGIN
 

+ 30 - 31
KulexiuForTeacher/KulexiuForTeacher/Module/Chat/Controller/TXCustom/KSTXBaseChatViewController.m

@@ -6,37 +6,7 @@
 //
 
 #import "KSTXBaseChatViewController.h"
-#import <AVFoundation/AVFoundation.h>
-#import <AssetsLibrary/AssetsLibrary.h>
-#import <MobileCoreServices/MobileCoreServices.h>
-#import <Photos/Photos.h>
-#import <TIMCommon/NSString+TUIEmoji.h>
-#import <TIMCommon/TIMDefine.h>
-#import <TUICore/NSDictionary+TUISafe.h>
-#import <TUICore/TUICore.h>
-#import <TUICore/TUILogin.h>
-#import <TUICore/TUIThemeManager.h>
-#import <TUICore/TUITool.h>
-#import "ReactiveObjC/ReactiveObjC.h"
-#import "TUIAIDenoiseSignatureManager.h"
-#import "TUIBaseMessageController.h"
-#import "TUICameraViewController.h"
-#import "TUIChatConfig.h"
-#import "TUIChatDataProvider.h"
-#import "TUIChatMediaDataProvider.h"
-#import "TUIChatModifyMessageHelper.h"
-#import "TUICloudCustomDataTypeCenter.h"
-#import "TUIFileMessageCellData.h"
-#import "TUIImageMessageCellData.h"
-#import "TUIJoinGroupMessageCell.h"
-#import "TUIMessageController.h"
-#import "TUIMessageDataProvider.h"
-#import "TUIMessageMultiChooseView.h"
-#import "TUIMessageReadViewController.h"
-#import "TUIReplyMessageCellData.h"
-#import "TUITextMessageCellData.h"
-#import "TUIVideoMessageCellData.h"
-#import "TUIVoiceMessageCellData.h"
+
 
 #import "KSUserDetailViewController.h"
 #import "ShareMusicViewController.h"
@@ -50,6 +20,8 @@
 #import "KSPremissionAlert.h"
 #import "UserInfoManager.h"
 
+#import "GroupNoticeDetailViewController.h"
+
 static UIView *gCustomTopView;
 
 @interface KSTXBaseChatViewController ()
@@ -162,8 +134,35 @@ static UIView *gCustomTopView;
             NSString *liveDesc = [param ks_stringValueForKey:@"liveDescMessage"];
             [self enterLiveRoom:roomId desc:liveDesc];
         }
+        else if ([[param ks_stringValueForKey:@"businessID"] isEqualToString:@"TC_GROUP_NOTICE"]) {
+            NSString *noticeID = [param ks_stringValueForKey:@"msgId"];
+
+            if (![NSString isEmptyString:noticeID]) {
+                [self checkNoticeDetail:noticeID];
+            }
+            else {
+                NSLog(@"无法查看当前群公告");
+            }
+        }
     }
+}
+
+- (void)checkNoticeDetail:(NSString *)noticeId {
     
+    [KSNetworkingManager imGroupNoticeDetailRequest:KS_GET noticeId:noticeId success:^(NSDictionary * _Nonnull dic) {
+        if ([dic ks_integerValueForKey:@"code"] == 200 && [dic ks_boolValueForKey:@"status"]) {
+            GroupNoticeDetailModel *model = [[GroupNoticeDetailModel alloc] initWithDictionary:[dic ks_dictionaryValueForKey:@"data"]];
+            GroupNoticeDetailViewController *ctrl = [[GroupNoticeDetailViewController alloc] init];
+            ctrl.sourceModel = model;
+            ctrl.canEdit = YES;
+            [self.navigationController pushViewController:ctrl animated:YES];
+        }
+        else {
+            [LOADING_MANAGER MBShowAUTOHidingInWindow:MESSAGEKEY];
+        }
+    } faliure:^(NSError * _Nonnull error) {
+        
+    }];
 }
 
 - (void)enterLiveRoom:(NSString *)roomId desc:(NSString *)liveDesc {

+ 5 - 5
KulexiuForTeacher/KulexiuForTeacher/Module/Chat/Group/View/GroupApplyChooseAllCell.xib

@@ -1,9 +1,9 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<document type="com.apple.InterfaceBuilder3.CocoaTouch.XIB" version="3.0" toolsVersion="19529" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" useTraitCollections="YES" useSafeAreas="YES" colorMatched="YES">
+<document type="com.apple.InterfaceBuilder3.CocoaTouch.XIB" version="3.0" toolsVersion="32700.99.1234" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" useTraitCollections="YES" useSafeAreas="YES" colorMatched="YES">
     <device id="retina6_1" orientation="portrait" appearance="light"/>
     <dependencies>
         <deployment identifier="iOS"/>
-        <plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="19519"/>
+        <plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="22685"/>
         <capability name="Safe area layout guides" minToolsVersion="9.0"/>
         <capability name="System colors in document resources" minToolsVersion="11.0"/>
         <capability name="documents saved in the Xcode 8 format" minToolsVersion="8.0"/>
@@ -19,7 +19,7 @@
                 <autoresizingMask key="autoresizingMask"/>
                 <subviews>
                     <view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="Uvv-T2-55Y">
-                        <rect key="frame" x="14" y="0.0" width="300" height="65"/>
+                        <rect key="frame" x="14" y="10" width="300" height="65"/>
                         <subviews>
                             <imageView clipsSubviews="YES" userInteractionEnabled="NO" contentMode="scaleAspectFill" horizontalHuggingPriority="251" verticalHuggingPriority="251" image="login_unseleted" translatesAutoresizingMaskIntoConstraints="NO" id="2be-Cm-FCF">
                                 <rect key="frame" x="11" y="23.5" width="18" height="18"/>
@@ -51,8 +51,8 @@
                 </subviews>
                 <constraints>
                     <constraint firstAttribute="trailing" secondItem="Uvv-T2-55Y" secondAttribute="trailing" constant="14" id="4d2-GY-qi8"/>
-                    <constraint firstAttribute="bottom" secondItem="Uvv-T2-55Y" secondAttribute="bottom" constant="10" id="Fb8-6O-vi9"/>
-                    <constraint firstItem="Uvv-T2-55Y" firstAttribute="top" secondItem="H2p-sc-9uM" secondAttribute="top" id="Rcg-6o-IVt"/>
+                    <constraint firstAttribute="bottom" secondItem="Uvv-T2-55Y" secondAttribute="bottom" id="Fb8-6O-vi9"/>
+                    <constraint firstItem="Uvv-T2-55Y" firstAttribute="top" secondItem="H2p-sc-9uM" secondAttribute="top" constant="10" id="Rcg-6o-IVt"/>
                     <constraint firstItem="Uvv-T2-55Y" firstAttribute="leading" secondItem="H2p-sc-9uM" secondAttribute="leading" constant="14" id="wrg-ne-WC4"/>
                 </constraints>
             </tableViewCellContentView>

+ 4 - 4
KulexiuForTeacher/KulexiuForTeacher/Module/Chat/Group/View/GroupApplyChooseCell.xib

@@ -3,7 +3,7 @@
     <device id="retina6_1" orientation="portrait" appearance="light"/>
     <dependencies>
         <deployment identifier="iOS"/>
-        <plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="22684"/>
+        <plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="22685"/>
         <capability name="Safe area layout guides" minToolsVersion="9.0"/>
         <capability name="documents saved in the Xcode 8 format" minToolsVersion="8.0"/>
     </dependencies>
@@ -18,7 +18,7 @@
                 <autoresizingMask key="autoresizingMask"/>
                 <subviews>
                     <view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="LMF-i7-uzV">
-                        <rect key="frame" x="14" y="0.0" width="343" height="65"/>
+                        <rect key="frame" x="14" y="12" width="343" height="65"/>
                         <subviews>
                             <imageView clipsSubviews="YES" userInteractionEnabled="NO" contentMode="scaleAspectFill" horizontalHuggingPriority="251" verticalHuggingPriority="251" translatesAutoresizingMaskIntoConstraints="NO" id="tgh-tX-q6U">
                                 <rect key="frame" x="42" y="10.5" width="44" height="44"/>
@@ -89,10 +89,10 @@
                     </view>
                 </subviews>
                 <constraints>
-                    <constraint firstAttribute="bottom" secondItem="LMF-i7-uzV" secondAttribute="bottom" constant="12" id="CXC-ch-XDC"/>
+                    <constraint firstAttribute="bottom" secondItem="LMF-i7-uzV" secondAttribute="bottom" id="CXC-ch-XDC"/>
                     <constraint firstItem="LMF-i7-uzV" firstAttribute="leading" secondItem="H2p-sc-9uM" secondAttribute="leading" constant="14" id="NXj-Mz-Mf8"/>
                     <constraint firstAttribute="trailing" secondItem="LMF-i7-uzV" secondAttribute="trailing" constant="14" id="eq0-94-j5e"/>
-                    <constraint firstItem="LMF-i7-uzV" firstAttribute="top" secondItem="H2p-sc-9uM" secondAttribute="top" id="faW-YN-Q9c"/>
+                    <constraint firstItem="LMF-i7-uzV" firstAttribute="top" secondItem="H2p-sc-9uM" secondAttribute="top" constant="12" id="faW-YN-Q9c"/>
                 </constraints>
             </tableViewCellContentView>
             <viewLayoutGuide key="safeArea" id="aW0-zy-SZf"/>

+ 4 - 4
KulexiuForTeacher/KulexiuForTeacher/Module/Chat/Group/View/GroupApplyMemberCell.xib

@@ -3,7 +3,7 @@
     <device id="retina6_1" orientation="portrait" appearance="light"/>
     <dependencies>
         <deployment identifier="iOS"/>
-        <plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="22684"/>
+        <plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="22685"/>
         <capability name="Safe area layout guides" minToolsVersion="9.0"/>
         <capability name="documents saved in the Xcode 8 format" minToolsVersion="8.0"/>
     </dependencies>
@@ -18,7 +18,7 @@
                 <autoresizingMask key="autoresizingMask"/>
                 <subviews>
                     <view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="a8P-Tn-du2">
-                        <rect key="frame" x="14" y="0.0" width="292" height="56"/>
+                        <rect key="frame" x="14" y="12" width="292" height="56"/>
                         <subviews>
                             <imageView clipsSubviews="YES" userInteractionEnabled="NO" contentMode="scaleAspectFit" horizontalHuggingPriority="251" verticalHuggingPriority="251" translatesAutoresizingMaskIntoConstraints="NO" id="37U-f9-tKa">
                                 <rect key="frame" x="11" y="6" width="44" height="44"/>
@@ -82,8 +82,8 @@
                 <constraints>
                     <constraint firstAttribute="trailing" secondItem="a8P-Tn-du2" secondAttribute="trailing" constant="14" id="8By-Sg-m2K"/>
                     <constraint firstItem="a8P-Tn-du2" firstAttribute="leading" secondItem="H2p-sc-9uM" secondAttribute="leading" constant="14" id="JNo-1b-Hlx"/>
-                    <constraint firstItem="a8P-Tn-du2" firstAttribute="top" secondItem="H2p-sc-9uM" secondAttribute="top" id="LmH-gQ-KaA"/>
-                    <constraint firstAttribute="bottom" secondItem="a8P-Tn-du2" secondAttribute="bottom" constant="12" id="eUd-95-WQ9"/>
+                    <constraint firstItem="a8P-Tn-du2" firstAttribute="top" secondItem="H2p-sc-9uM" secondAttribute="top" constant="12" id="LmH-gQ-KaA"/>
+                    <constraint firstAttribute="bottom" secondItem="a8P-Tn-du2" secondAttribute="bottom" id="eUd-95-WQ9"/>
                 </constraints>
             </tableViewCellContentView>
             <viewLayoutGuide key="safeArea" id="aW0-zy-SZf"/>

+ 21 - 0
KulexiuForTeacher/KulexiuForTeacher/Module/Chat/GroupNotice/Controller/GroupNoticeDetailViewController.h

@@ -0,0 +1,21 @@
+//
+//  GroupNoticeDetailViewController.h
+//  KulexiuSchoolStudent
+//
+//  Created by 王智 on 2024/9/9.
+//
+
+#import "KSBaseViewController.h"
+#import "GroupNoticeDetailModel.h"
+
+NS_ASSUME_NONNULL_BEGIN
+
+@interface GroupNoticeDetailViewController : KSBaseViewController
+
+@property (nonatomic, assign) BOOL canEdit;
+
+@property (nonatomic, strong) GroupNoticeDetailModel *sourceModel;
+
+@end
+
+NS_ASSUME_NONNULL_END

+ 164 - 0
KulexiuForTeacher/KulexiuForTeacher/Module/Chat/GroupNotice/Controller/GroupNoticeDetailViewController.m

@@ -0,0 +1,164 @@
+//
+//  GroupNoticeDetailViewController.m
+//  GuanYueTeamManager
+//
+//  Created by 王智 on 2024/9/2.
+//
+
+#import "GroupNoticeDetailViewController.h"
+#import "GroupNoticeDetailBodyView.h"
+#import "KSPopView.h"
+#import "GroupNoticeEditController.h"
+
+@interface GroupNoticeDetailViewController ()
+
+@property (nonatomic, strong) GroupNoticeDetailBodyView *bodyView;
+
+@property (nonatomic, assign) BOOL isFirstLoad;
+
+@end
+
+@implementation GroupNoticeDetailViewController
+
+- (void)viewDidLoad {
+    [super viewDidLoad];
+    self.isFirstLoad = YES;
+    // Do any additional setup after loading the view.
+    [self configUI];
+}
+
+- (void)configUI {
+    [self allocTitle:@"公告详情"];
+    [self.scrollView removeFromSuperview];
+    self.bodyView = [GroupNoticeDetailBodyView shareInstance];
+    [self.view addSubview:self.bodyView];
+    [self.bodyView mas_makeConstraints:^(MASConstraintMaker *make) {
+        make.left.right.top.bottom.mas_equalTo(self.view);
+    }];
+    
+    MJWeakSelf;
+    [self.bodyView configWithSource:self.sourceModel enable:self.canEdit callback:^(id  _Nonnull sourceModel, UIButton * _Nonnull sender) {
+        [weakSelf showPopViewWithSource:sourceModel inView:sender];
+    }];
+}
+
+- (void)viewWillAppear:(BOOL)animated {
+    [super viewWillAppear:animated];
+    if (self.isFirstLoad == NO) {
+        [self requestData];
+    }
+    if (self.isFirstLoad == YES) {
+        self.isFirstLoad = NO;
+    }
+}
+- (void)requestData {
+    [KSNetworkingManager imGroupNoticeDetailRequest:KS_GET noticeId:self.sourceModel.internalBaseClassIdentifier success:^(NSDictionary * _Nonnull dic) {
+        if ([dic ks_integerValueForKey:@"code"] == 200) {
+            GroupNoticeDetailModel *model = [[GroupNoticeDetailModel alloc] initWithDictionary:[dic ks_dictionaryValueForKey:@"data"]];
+            self.sourceModel = model;
+            [self.bodyView refreshSource:model];
+        }
+        else {
+            [LOADING_MANAGER MBShowAUTOHidingInWindow:MESSAGEKEY];
+        }
+    } faliure:^(NSError * _Nonnull error) {
+        
+    }];
+}
+
+- (void)showPopViewWithSource:(id)source inView:(UIView *)view {
+    CGRect pointViewRect = [view.superview convertRect:view.frame toView:[NSObject getKeyWindow]];
+    CGPoint point = CGPointMake(CGRectGetMinX(pointViewRect), CGRectGetMaxY(pointViewRect));
+    point.y = CGRectGetMaxY(pointViewRect) - 6.5;
+    KSPopView *popView = [KSPopView shareInstance];
+    GroupNoticeDetailModel *model = source;
+    popView.isNoticeTop = model.isTop;
+    MJWeakSelf;
+    [popView showPopToView:point callBack:^(KSPOP_TAG tag) {
+        [weakSelf popAction:tag source:source];
+    }];
+}
+
+- (void)popAction:(KSPOP_TAG)tag source:(id)source {
+    switch (tag) {
+        case KSPOP_TAG_EDIT:
+        {
+            [self editNotice:source];
+        }
+            break;
+        case KSPOP_TAG_TOP:
+        case KSPOP_TAG_CANCELTOP:
+        {
+            [self operationAction:source];
+        }
+            break;
+        case KSPOP_TAG_DELETE:
+        {
+            [self deleteNotice:source];
+        }
+        default:
+            break;
+    }
+    
+}
+- (void)deleteNotice:(id)source {
+    GroupNoticeDetailModel *model = source;
+    [KSNetworkingManager imGroupNoticeDelRequest:KS_POST noticeID:model.internalBaseClassIdentifier success:^(NSDictionary * _Nonnull dic) {
+        if ([dic ks_integerValueForKey:@"code"] == 200 && [dic ks_boolValueForKey:@"status"]) {
+            
+            [LOADING_MANAGER KSShowMsg:@"删除成功" promptCompletion:^{
+                [self backAction];
+            }];
+        }
+        else {
+            [LOADING_MANAGER MBShowAUTOHidingInWindow:MESSAGEKEY];
+        }
+    } faliure:^(NSError * _Nonnull error) {
+    }];
+}
+
+- (void)editNotice:(id)source {
+    GroupNoticeDetailModel *model = source;
+    GroupNoticeEditController *editVC = [[GroupNoticeEditController alloc] init];
+    editVC.groupId = model.imGroupId;
+    editVC.isModify = YES;
+    editVC.titles = model.title;
+    editVC.content = model.content;
+    editVC.noticeID = model.internalBaseClassIdentifier;
+    editVC.isOn = model.isTop == 1 ? YES : NO;
+    [self.navigationController pushViewController:editVC animated:YES];
+}
+
+- (void)operationAction:(id)source {
+    GroupNoticeDetailModel *model = source;
+    NSString *isTop = nil;
+    // 取反
+    if (model.isTop == YES) {
+        isTop = @"0";
+    }
+    else {
+        isTop = @"1";
+    }
+    
+    [KSNetworkingManager imGroupNoticeUpdateRequest:KS_POST groupId:self.sourceModel.imGroupId title:model.title content:model.content isTop:isTop noticeID:model.internalBaseClassIdentifier success:^(NSDictionary * _Nonnull dic) {
+        if ([dic ks_integerValueForKey:@"code"] == 200 && [dic ks_boolValueForKey:@"status"]) {
+            [self requestData];
+        }
+        else {
+            [LOADING_MANAGER MBShowAUTOHidingInWindow:MESSAGEKEY];
+        }
+    } faliure:^(NSError * _Nonnull error) {
+    }];
+    
+}
+/*
+#pragma mark - Navigation
+
+// In a storyboard-based application, you will often want to do a little preparation before navigation
+- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender {
+    // Get the new view controller using [segue destinationViewController].
+    // Pass the selected object to the new view controller.
+}
+*/
+
+@end

+ 2 - 1
KulexiuForTeacher/KulexiuForTeacher/Module/Chat/GroupNotice/Controller/GroupNoticeEditController.m

@@ -19,7 +19,8 @@
 - (void)viewDidLoad {
     [super viewDidLoad];
     // Do any additional setup after loading the view.
-    [self allocTitle:@"群公告编辑"];
+    NSString *navTitle = self.isModify ? @"编辑群公告" : @"新建群公告";
+    [self allocTitle:navTitle];
     [self configUI];
 }
 

+ 32 - 23
KulexiuForTeacher/KulexiuForTeacher/Module/Chat/GroupNotice/Controller/GroupNoticeViewController.m

@@ -8,7 +8,7 @@
 #import "GroupNoticeViewController.h"
 #import "GroupNoticeCell.h"
 #import "GroupNoticeEditController.h"
-#import "LFPopupMenu.h"
+#import "KSPopView.h"
 #import "GroupNoticeModel.h"
 
 @interface GroupNoticeViewController ()<UITableViewDelegate, UITableViewDataSource>
@@ -42,7 +42,7 @@
 
 - (void)configUI {
     [self.view addSubview:self.tableView];
-    [self setPromptString:@"暂无公告" imageName:@"wd_img_zwsj" inView:self.tableView];
+    [self setPromptString:@"暂无公告" imageName:@"wd_img_zwsj" inView:self.tableView];
     MJWeakSelf;
     self.tableView.mj_header = [KSGifRefreshHeader headerWithRefreshingBlock:^{
         [weakSelf resetParamenter];
@@ -58,6 +58,7 @@
             [weakSelf.tableView.mj_footer endRefreshingWithNoMoreData];
         }
     }];
+    self.tableView.mj_footer.ignoredScrollViewContentInsetBottom = IS_iPhoneX ? iPhoneXSafeBottomMargin : 0;
 }
 
 - (void)endRefresh {
@@ -135,30 +136,38 @@
 }
 
 - (void)showPopViewWithSource:(id)source inView:(UIView *)view {
+    CGRect pointViewRect = [view.superview convertRect:view.frame toView:[NSObject getKeyWindow]];
+    CGPoint point = CGPointMake(CGRectGetMinX(pointViewRect), CGRectGetMaxY(pointViewRect));
+    point.y = CGRectGetMaxY(pointViewRect) - 6.5;
+    KSPopView *popView = [KSPopView shareInstance];
     GroupNoticeModel *model = source;
+    popView.isNoticeTop = model.top;
     MJWeakSelf;
-    LFPopupMenuItem *item1 = [LFPopupMenuItem createWithTitle:@"编辑公告" image:nil action:^{
-        // 编辑公告
-        [weakSelf editNotice:source];
-    }];
-    NSString *title = model.top ? @"取消置顶" : @"置顶";
-    LFPopupMenuItem *item2 = [LFPopupMenuItem createWithTitle:title image:nil action:^{
-        // 置顶或者取消置顶
-        [weakSelf operationAction:source];
+    [popView showPopToView:point callBack:^(KSPOP_TAG tag) {
+        [weakSelf popAction:tag source:source];
     }];
-    LFPopupMenuItem *item3 = [LFPopupMenuItem createWithTitle:@"删除公告" image:nil action:^{
-        // 删除公告
-        [weakSelf deleteNotice:source];
-    }];
-    LFPopupMenu *menu = [[LFPopupMenu alloc] init];
-    menu.needBorder = YES;
-    menu.rowHeight = 40.0f;
-    menu.minWidth = 150;
-    menu.textColor = HexRGB(0x333333);
-    menu.textFont = [UIFont systemFontOfSize:14.0f];
+}
 
-    [menu configWithItems:@[item1,item2,item3]];
-    [menu showArrowToView:view];
+- (void)popAction:(KSPOP_TAG)tag source:(id)source {
+    switch (tag) {
+        case KSPOP_TAG_EDIT:
+        {
+            [self editNotice:source];
+        }
+            break;
+        case KSPOP_TAG_TOP:
+        case KSPOP_TAG_CANCELTOP:
+        {
+            [self operationAction:source];
+        }
+            break;
+        case KSPOP_TAG_DELETE:
+        {
+            [self deleteNotice:source];
+        }
+        default:
+            break;
+    }
 }
 
 - (void)deleteNotice:(id)source {
@@ -235,7 +244,7 @@
 #pragma mark --- lazy
 - (UITableView *)tableView {
     if (!_tableView) {
-        _tableView = [[UITableView alloc] initWithFrame:CGRectMake(0, 1, kScreenWidth, kScreenHeight - kNaviBarHeight - iPhoneXSafeBottomMargin) style:UITableViewStylePlain];
+        _tableView = [[UITableView alloc] initWithFrame:CGRectMake(0, 0, KPortraitWidth, KPortraitHeight - kNaviBarHeight) style:UITableViewStylePlain];
         _tableView.delegate = self;
         _tableView.dataSource = self;
         _tableView.separatorStyle = UITableViewCellSeparatorStyleNone;

+ 34 - 0
KulexiuForTeacher/KulexiuForTeacher/Module/Chat/GroupNotice/Model/GroupNoticeDetailModel.h

@@ -0,0 +1,34 @@
+//
+//  GroupNoticeDetailModel.h
+//
+//  Created by Steven  on 2024/9/11
+//  Copyright (c) 2024 __MyCompanyName__. All rights reserved.
+//
+
+#import <Foundation/Foundation.h>
+
+
+
+@interface GroupNoticeDetailModel : NSObject <NSCoding, NSCopying>
+
+@property (nonatomic, strong) NSString *internalBaseClassIdentifier;
+@property (nonatomic, strong) NSString *updateTime;
+@property (nonatomic, assign) BOOL delFlag;
+@property (nonatomic, strong) NSString *clientType;
+@property (nonatomic, assign) BOOL isSentToNewMember;
+@property (nonatomic, strong) NSString *imGroupId;
+@property (nonatomic, assign) double tenantId;
+@property (nonatomic, strong) NSString *title;
+@property (nonatomic, strong) NSString *avatar;
+@property (nonatomic, strong) NSString *createTime;
+@property (nonatomic, strong) NSString *username;
+@property (nonatomic, assign) double operatorId;
+@property (nonatomic, assign) BOOL isTop;
+@property (nonatomic, strong) NSString *messageSeqId;
+@property (nonatomic, strong) NSString *content;
+
++ (instancetype)modelObjectWithDictionary:(NSDictionary *)dict;
+- (instancetype)initWithDictionary:(NSDictionary *)dict;
+- (NSDictionary *)dictionaryRepresentation;
+
+@end

+ 197 - 0
KulexiuForTeacher/KulexiuForTeacher/Module/Chat/GroupNotice/Model/GroupNoticeDetailModel.m

@@ -0,0 +1,197 @@
+//
+//  GroupNoticeDetailModel.m
+//
+//  Created by Steven  on 2024/9/11
+//  Copyright (c) 2024 __MyCompanyName__. All rights reserved.
+//
+
+#import "GroupNoticeDetailModel.h"
+
+
+NSString *const kGroupNoticeDetailModelId = @"id";
+NSString *const kGroupNoticeDetailModelUpdateTime = @"updateTime";
+NSString *const kGroupNoticeDetailModelDelFlag = @"delFlag";
+NSString *const kGroupNoticeDetailModelClientType = @"clientType";
+NSString *const kGroupNoticeDetailModelIsSentToNewMember = @"isSentToNewMember";
+NSString *const kGroupNoticeDetailModelImGroupId = @"imGroupId";
+NSString *const kGroupNoticeDetailModelTenantId = @"tenantId";
+NSString *const kGroupNoticeDetailModelTitle = @"title";
+NSString *const kGroupNoticeDetailModelAvatar = @"avatar";
+NSString *const kGroupNoticeDetailModelCreateTime = @"createTime";
+NSString *const kGroupNoticeDetailModelUsername = @"username";
+NSString *const kGroupNoticeDetailModelOperatorId = @"operatorId";
+NSString *const kGroupNoticeDetailModelIsTop = @"isTop";
+NSString *const kGroupNoticeDetailModelMessageSeqId = @"messageSeqId";
+NSString *const kGroupNoticeDetailModelContent = @"content";
+
+
+@interface GroupNoticeDetailModel ()
+
+- (id)objectOrNilForKey:(id)aKey fromDictionary:(NSDictionary *)dict;
+
+@end
+
+@implementation GroupNoticeDetailModel
+
+@synthesize internalBaseClassIdentifier = _internalBaseClassIdentifier;
+@synthesize updateTime = _updateTime;
+@synthesize delFlag = _delFlag;
+@synthesize clientType = _clientType;
+@synthesize isSentToNewMember = _isSentToNewMember;
+@synthesize imGroupId = _imGroupId;
+@synthesize tenantId = _tenantId;
+@synthesize title = _title;
+@synthesize avatar = _avatar;
+@synthesize createTime = _createTime;
+@synthesize username = _username;
+@synthesize operatorId = _operatorId;
+@synthesize isTop = _isTop;
+@synthesize messageSeqId = _messageSeqId;
+@synthesize content = _content;
+
+
++ (instancetype)modelObjectWithDictionary:(NSDictionary *)dict
+{
+    return [[self alloc] initWithDictionary:dict];
+}
+
+- (instancetype)initWithDictionary:(NSDictionary *)dict
+{
+    self = [super init];
+    
+    // This check serves to make sure that a non-NSDictionary object
+    // passed into the model class doesn't break the parsing.
+    if(self && [dict isKindOfClass:[NSDictionary class]]) {
+            self.internalBaseClassIdentifier = [self objectOrNilForKey:kGroupNoticeDetailModelId fromDictionary:dict];
+            self.updateTime = [self objectOrNilForKey:kGroupNoticeDetailModelUpdateTime fromDictionary:dict];
+            self.delFlag = [[self objectOrNilForKey:kGroupNoticeDetailModelDelFlag fromDictionary:dict] boolValue];
+            self.clientType = [self objectOrNilForKey:kGroupNoticeDetailModelClientType fromDictionary:dict];
+            self.isSentToNewMember = [[self objectOrNilForKey:kGroupNoticeDetailModelIsSentToNewMember fromDictionary:dict] boolValue];
+            self.imGroupId = [self objectOrNilForKey:kGroupNoticeDetailModelImGroupId fromDictionary:dict];
+            self.tenantId = [[self objectOrNilForKey:kGroupNoticeDetailModelTenantId fromDictionary:dict] doubleValue];
+            self.title = [self objectOrNilForKey:kGroupNoticeDetailModelTitle fromDictionary:dict];
+            self.avatar = [self objectOrNilForKey:kGroupNoticeDetailModelAvatar fromDictionary:dict];
+            self.createTime = [self objectOrNilForKey:kGroupNoticeDetailModelCreateTime fromDictionary:dict];
+            self.username = [self objectOrNilForKey:kGroupNoticeDetailModelUsername fromDictionary:dict];
+            self.operatorId = [[self objectOrNilForKey:kGroupNoticeDetailModelOperatorId fromDictionary:dict] doubleValue];
+            self.isTop = [[self objectOrNilForKey:kGroupNoticeDetailModelIsTop fromDictionary:dict] boolValue];
+            self.messageSeqId = [self objectOrNilForKey:kGroupNoticeDetailModelMessageSeqId fromDictionary:dict];
+            self.content = [self objectOrNilForKey:kGroupNoticeDetailModelContent fromDictionary:dict];
+
+    }
+    
+    return self;
+    
+}
+
+- (NSDictionary *)dictionaryRepresentation
+{
+    NSMutableDictionary *mutableDict = [NSMutableDictionary dictionary];
+    [mutableDict setValue:self.internalBaseClassIdentifier forKey:kGroupNoticeDetailModelId];
+    [mutableDict setValue:self.updateTime forKey:kGroupNoticeDetailModelUpdateTime];
+    [mutableDict setValue:[NSNumber numberWithBool:self.delFlag] forKey:kGroupNoticeDetailModelDelFlag];
+    [mutableDict setValue:self.clientType forKey:kGroupNoticeDetailModelClientType];
+    [mutableDict setValue:[NSNumber numberWithBool:self.isSentToNewMember] forKey:kGroupNoticeDetailModelIsSentToNewMember];
+    [mutableDict setValue:self.imGroupId forKey:kGroupNoticeDetailModelImGroupId];
+    [mutableDict setValue:[NSNumber numberWithDouble:self.tenantId] forKey:kGroupNoticeDetailModelTenantId];
+    [mutableDict setValue:self.title forKey:kGroupNoticeDetailModelTitle];
+    [mutableDict setValue:self.avatar forKey:kGroupNoticeDetailModelAvatar];
+    [mutableDict setValue:self.createTime forKey:kGroupNoticeDetailModelCreateTime];
+    [mutableDict setValue:self.username forKey:kGroupNoticeDetailModelUsername];
+    [mutableDict setValue:[NSNumber numberWithDouble:self.operatorId] forKey:kGroupNoticeDetailModelOperatorId];
+    [mutableDict setValue:[NSNumber numberWithBool:self.isTop] forKey:kGroupNoticeDetailModelIsTop];
+    [mutableDict setValue:self.messageSeqId forKey:kGroupNoticeDetailModelMessageSeqId];
+    [mutableDict setValue:self.content forKey:kGroupNoticeDetailModelContent];
+
+    return [NSDictionary dictionaryWithDictionary:mutableDict];
+}
+
+- (NSString *)description
+{
+    return [NSString stringWithFormat:@"%@", [self dictionaryRepresentation]];
+}
+
+#pragma mark - Helper Method
+- (id)objectOrNilForKey:(id)aKey fromDictionary:(NSDictionary *)dict
+{
+    id object = [dict objectForKey:aKey];
+    if ([object isKindOfClass:[NSNumber class]]) {
+        NSNumber *number = object;
+        object = [number stringValue];
+    }
+    return [object isEqual:[NSNull null]] ? nil : object;
+}
+
+
+#pragma mark - NSCoding Methods
+
+- (id)initWithCoder:(NSCoder *)aDecoder
+{
+    self = [super init];
+
+    self.internalBaseClassIdentifier = [aDecoder decodeObjectForKey:kGroupNoticeDetailModelId];
+    self.updateTime = [aDecoder decodeObjectForKey:kGroupNoticeDetailModelUpdateTime];
+    self.delFlag = [aDecoder decodeBoolForKey:kGroupNoticeDetailModelDelFlag];
+    self.clientType = [aDecoder decodeObjectForKey:kGroupNoticeDetailModelClientType];
+    self.isSentToNewMember = [aDecoder decodeBoolForKey:kGroupNoticeDetailModelIsSentToNewMember];
+    self.imGroupId = [aDecoder decodeObjectForKey:kGroupNoticeDetailModelImGroupId];
+    self.tenantId = [aDecoder decodeDoubleForKey:kGroupNoticeDetailModelTenantId];
+    self.title = [aDecoder decodeObjectForKey:kGroupNoticeDetailModelTitle];
+    self.avatar = [aDecoder decodeObjectForKey:kGroupNoticeDetailModelAvatar];
+    self.createTime = [aDecoder decodeObjectForKey:kGroupNoticeDetailModelCreateTime];
+    self.username = [aDecoder decodeObjectForKey:kGroupNoticeDetailModelUsername];
+    self.operatorId = [aDecoder decodeDoubleForKey:kGroupNoticeDetailModelOperatorId];
+    self.isTop = [aDecoder decodeBoolForKey:kGroupNoticeDetailModelIsTop];
+    self.messageSeqId = [aDecoder decodeObjectForKey:kGroupNoticeDetailModelMessageSeqId];
+    self.content = [aDecoder decodeObjectForKey:kGroupNoticeDetailModelContent];
+    return self;
+}
+
+- (void)encodeWithCoder:(NSCoder *)aCoder
+{
+
+    [aCoder encodeObject:_internalBaseClassIdentifier forKey:kGroupNoticeDetailModelId];
+    [aCoder encodeObject:_updateTime forKey:kGroupNoticeDetailModelUpdateTime];
+    [aCoder encodeBool:_delFlag forKey:kGroupNoticeDetailModelDelFlag];
+    [aCoder encodeObject:_clientType forKey:kGroupNoticeDetailModelClientType];
+    [aCoder encodeBool:_isSentToNewMember forKey:kGroupNoticeDetailModelIsSentToNewMember];
+    [aCoder encodeObject:_imGroupId forKey:kGroupNoticeDetailModelImGroupId];
+    [aCoder encodeDouble:_tenantId forKey:kGroupNoticeDetailModelTenantId];
+    [aCoder encodeObject:_title forKey:kGroupNoticeDetailModelTitle];
+    [aCoder encodeObject:_avatar forKey:kGroupNoticeDetailModelAvatar];
+    [aCoder encodeObject:_createTime forKey:kGroupNoticeDetailModelCreateTime];
+    [aCoder encodeObject:_username forKey:kGroupNoticeDetailModelUsername];
+    [aCoder encodeDouble:_operatorId forKey:kGroupNoticeDetailModelOperatorId];
+    [aCoder encodeBool:_isTop forKey:kGroupNoticeDetailModelIsTop];
+    [aCoder encodeObject:_messageSeqId forKey:kGroupNoticeDetailModelMessageSeqId];
+    [aCoder encodeObject:_content forKey:kGroupNoticeDetailModelContent];
+}
+
+- (id)copyWithZone:(NSZone *)zone
+{
+    GroupNoticeDetailModel *copy = [[GroupNoticeDetailModel alloc] init];
+    
+    if (copy) {
+
+        copy.internalBaseClassIdentifier = [self.internalBaseClassIdentifier copyWithZone:zone];
+        copy.updateTime = [self.updateTime copyWithZone:zone];
+        copy.delFlag = self.delFlag;
+        copy.clientType = [self.clientType copyWithZone:zone];
+        copy.isSentToNewMember = self.isSentToNewMember;
+        copy.imGroupId = [self.imGroupId copyWithZone:zone];
+        copy.tenantId = self.tenantId;
+        copy.title = [self.title copyWithZone:zone];
+        copy.avatar = [self.avatar copyWithZone:zone];
+        copy.createTime = [self.createTime copyWithZone:zone];
+        copy.username = [self.username copyWithZone:zone];
+        copy.operatorId = self.operatorId;
+        copy.isTop = self.isTop;
+        copy.messageSeqId = [self.messageSeqId copyWithZone:zone];
+        copy.content = [self.content copyWithZone:zone];
+    }
+    
+    return copy;
+}
+
+
+@end

+ 11 - 8
KulexiuForTeacher/KulexiuForTeacher/Module/Chat/GroupNotice/View/GroupNoticeCell.m

@@ -49,17 +49,20 @@
     if ([source isKindOfClass:[GroupNoticeModel class]]) {
         GroupNoticeModel *model = source;
         self.userName.text = [NSString returnNoNullStringWithString:model.username];
-        
-        [self.userLogo sd_setImageWithURL:[NSURL URLWithString:[model.avatar getUrlEndcodeString]] placeholderImage:[UIImage imageNamed:TEACHER_AVATAR]];
         self.noticeTitle.text = [NSString returnNoNullStringWithString:model.title];
-        
-        NSMutableParagraphStyle *paragraphStyle = [[NSMutableParagraphStyle alloc] init];
-        [paragraphStyle setLineSpacing:4];//调整行间距
-        NSMutableAttributedString *attrs = [[NSMutableAttributedString alloc] initWithString:[NSString returnNoNullStringWithString:model.content] attributes:@{NSParagraphStyleAttributeName:paragraphStyle,NSFontAttributeName:[UIFont systemFontOfSize:16.0f],NSForegroundColorAttributeName:HexRGB(0x777777)}];
-        self.noticeContent.attributedText = attrs;
-
         self.focusLabel.hidden = model.top ? NO : YES;
         self.modifyTime.text = [NSString returnNoNullStringWithString:model.updateTime];
+        [self.userLogo sd_setImageWithURL:[NSURL URLWithString:[model.avatar getUrlEndcodeString]] placeholderImage:[UIImage imageNamed:TEACHER_AVATAR]];
+        self.noticeContent.text = [NSString returnNoNullStringWithString:model.content];
+        if (![NSString isEmptyString:model.content]) {
+            NSMutableAttributedString *attrs = [[NSMutableAttributedString alloc] initWithString:model.content attributes:@{NSFontAttributeName:[UIFont systemFontOfSize:14 weight:UIFontWeightRegular], NSForegroundColorAttributeName:HexRGB(0x777777)}];
+            self.noticeContent.attributedText = attrs;
+        }
+        else {
+            self.noticeContent.text = @"";
+        }
+        
+        
     }
 }
 

+ 75 - 73
KulexiuForTeacher/KulexiuForTeacher/Module/Chat/GroupNotice/View/GroupNoticeCell.xib

@@ -3,7 +3,7 @@
     <device id="retina6_1" orientation="portrait" appearance="light"/>
     <dependencies>
         <deployment identifier="iOS"/>
-        <plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="22684"/>
+        <plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="22685"/>
         <capability name="Safe area layout guides" minToolsVersion="9.0"/>
         <capability name="System colors in document resources" minToolsVersion="11.0"/>
         <capability name="documents saved in the Xcode 8 format" minToolsVersion="8.0"/>
@@ -11,17 +11,17 @@
     <objects>
         <placeholder placeholderIdentifier="IBFilesOwner" id="-1" userLabel="File's Owner"/>
         <placeholder placeholderIdentifier="IBFirstResponder" id="-2" customClass="UIResponder"/>
-        <tableViewCell contentMode="scaleToFill" selectionStyle="default" indentationWidth="10" rowHeight="206" id="KGk-i7-Jjw" customClass="GroupNoticeCell">
-            <rect key="frame" x="0.0" y="0.0" width="359" height="206"/>
+        <tableViewCell contentMode="scaleToFill" selectionStyle="default" indentationWidth="10" rowHeight="253" id="KGk-i7-Jjw" customClass="GroupNoticeCell">
+            <rect key="frame" x="0.0" y="0.0" width="359" height="253"/>
             <autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMaxY="YES"/>
             <tableViewCellContentView key="contentView" opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" tableViewCell="KGk-i7-Jjw" id="H2p-sc-9uM">
-                <rect key="frame" x="0.0" y="0.0" width="359" height="206"/>
+                <rect key="frame" x="0.0" y="0.0" width="359" height="253"/>
                 <autoresizingMask key="autoresizingMask"/>
                 <subviews>
-                    <view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="qWq-La-TpT">
-                        <rect key="frame" x="13" y="12" width="333" height="194"/>
+                    <view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="Jdh-Fo-Wpn">
+                        <rect key="frame" x="13" y="12" width="333" height="241"/>
                         <subviews>
-                            <imageView clipsSubviews="YES" userInteractionEnabled="NO" contentMode="scaleAspectFill" horizontalHuggingPriority="251" verticalHuggingPriority="251" image="user_avatarRectangle" translatesAutoresizingMaskIntoConstraints="NO" id="Gkn-L8-UCb">
+                            <imageView clipsSubviews="YES" userInteractionEnabled="NO" contentMode="scaleAspectFill" horizontalHuggingPriority="251" verticalHuggingPriority="251" image="teacher_avatar" translatesAutoresizingMaskIntoConstraints="NO" id="Gkn-L8-UCb">
                                 <rect key="frame" x="12" y="12" width="48" height="48"/>
                                 <constraints>
                                     <constraint firstAttribute="height" constant="48" id="8bz-sK-gjT"/>
@@ -33,99 +33,102 @@
                                     </userDefinedRuntimeAttribute>
                                 </userDefinedRuntimeAttributes>
                             </imageView>
-                            <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="vad-UL-yLE">
-                                <rect key="frame" x="70" y="40" width="0.0" height="18"/>
+                            <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="陈老师" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="2c3-yX-YxS">
+                                <rect key="frame" x="70" y="14" width="207.5" height="22"/>
+                                <constraints>
+                                    <constraint firstAttribute="height" constant="22" id="dMw-tJ-YFP"/>
+                                </constraints>
+                                <fontDescription key="fontDescription" type="system" weight="semibold" pointSize="16"/>
+                                <color key="textColor" red="0.20000000000000001" green="0.20000000000000001" blue="0.20000000000000001" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
+                                <nil key="highlightedColor"/>
+                            </label>
+                            <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="2023-07-24 15:34:26" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="vad-UL-yLE">
+                                <rect key="frame" x="70" y="40" width="132.5" height="18"/>
                                 <constraints>
                                     <constraint firstAttribute="height" constant="18" id="G1H-uK-NYV"/>
                                 </constraints>
-                                <fontDescription key="fontDescription" type="system" pointSize="14"/>
-                                <color key="textColor" red="0.54117647058823526" green="0.54117647058823526" blue="0.54117647058823526" alpha="1" colorSpace="calibratedRGB"/>
+                                <fontDescription key="fontDescription" type="system" pointSize="13"/>
+                                <color key="textColor" red="0.46666666666666667" green="0.46666666666666667" blue="0.46666666666666667" alpha="1" colorSpace="calibratedRGB"/>
                                 <nil key="highlightedColor"/>
                             </label>
+                            <button opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="Gv9-px-E4j">
+                                <rect key="frame" x="289.5" y="5.5" width="40" height="40"/>
+                                <constraints>
+                                    <constraint firstAttribute="width" constant="40" id="0ay-Cx-fo8"/>
+                                    <constraint firstAttribute="height" constant="40" id="v9h-3o-0Hd"/>
+                                </constraints>
+                                <state key="normal" image="notice_action"/>
+                                <connections>
+                                    <action selector="editAction:" destination="KGk-i7-Jjw" eventType="touchUpInside" id="LKl-Wu-uAP"/>
+                                </connections>
+                            </button>
                             <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="置顶" textAlignment="center" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="Fse-Bd-Rui">
-                                <rect key="frame" x="76" y="39" width="40" height="20"/>
+                                <rect key="frame" x="208.5" y="39.5" width="40" height="19"/>
                                 <constraints>
-                                    <constraint firstAttribute="height" constant="20" id="eAd-Zt-CN7"/>
+                                    <constraint firstAttribute="height" constant="19" id="eAd-Zt-CN7"/>
                                     <constraint firstAttribute="width" constant="40" id="gtu-Jt-duR"/>
                                 </constraints>
-                                <fontDescription key="fontDescription" type="system" pointSize="13"/>
-                                <color key="textColor" red="0.99607843137254903" green="0.14117647058823529" blue="0.31764705882352939" alpha="1" colorSpace="calibratedRGB"/>
+                                <fontDescription key="fontDescription" type="system" pointSize="12"/>
+                                <color key="textColor" red="1" green="0.31764705882352939" blue="0.31764705882352939" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
                                 <nil key="highlightedColor"/>
                                 <userDefinedRuntimeAttributes>
                                     <userDefinedRuntimeAttribute type="number" keyPath="cornerRadius">
-                                        <real key="value" value="10"/>
+                                        <real key="value" value="9.5"/>
                                     </userDefinedRuntimeAttribute>
                                     <userDefinedRuntimeAttribute type="color" keyPath="borderColor">
-                                        <color key="value" red="0.99607843137254903" green="0.14117647058823529" blue="0.31764705882352939" alpha="1" colorSpace="calibratedRGB"/>
+                                        <color key="value" red="1" green="0.31764705882352939" blue="0.31764705882352939" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
                                     </userDefinedRuntimeAttribute>
                                     <userDefinedRuntimeAttribute type="number" keyPath="borderWidth">
                                         <real key="value" value="1"/>
                                     </userDefinedRuntimeAttribute>
                                 </userDefinedRuntimeAttributes>
                             </label>
-                            <button opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="Gv9-px-E4j">
-                                <rect key="frame" x="285" y="0.0" width="40" height="40"/>
+                            <view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="47L-aP-812">
+                                <rect key="frame" x="12" y="72" width="309" height="1"/>
+                                <color key="backgroundColor" red="0.94901960784313721" green="0.94901960784313721" blue="0.94901960784313721" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
                                 <constraints>
-                                    <constraint firstAttribute="width" constant="40" id="0ay-Cx-fo8"/>
-                                    <constraint firstAttribute="height" constant="40" id="v9h-3o-0Hd"/>
+                                    <constraint firstAttribute="height" constant="1" id="34R-6j-HXV"/>
                                 </constraints>
-                                <state key="normal" image="notice_action"/>
-                                <connections>
-                                    <action selector="editAction:" destination="KGk-i7-Jjw" eventType="touchUpInside" id="LKl-Wu-uAP"/>
-                                </connections>
-                            </button>
-                            <view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="038-4g-5JZ">
-                                <rect key="frame" x="12" y="76" width="309" height="1"/>
-                                <color key="backgroundColor" red="0.94901960784313721" green="0.94901960784313721" blue="0.94901960784313721" alpha="1" colorSpace="calibratedRGB"/>
+                            </view>
+                            <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" verticalCompressionResistancePriority="749" text="今日作业" textAlignment="natural" lineBreakMode="tailTruncation" numberOfLines="0" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="gxd-9e-9Xw">
+                                <rect key="frame" x="12" y="85" width="309" height="21"/>
                                 <constraints>
-                                    <constraint firstAttribute="height" constant="1" id="3Wh-Ue-Sj3"/>
+                                    <constraint firstAttribute="height" constant="21" id="JGE-BZ-edM"/>
                                 </constraints>
-                            </view>
-                            <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" verticalCompressionResistancePriority="749" text="" textAlignment="natural" lineBreakMode="tailTruncation" numberOfLines="0" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="gxd-9e-9Xw">
-                                <rect key="frame" x="12" y="93" width="309" height="79"/>
-                                <fontDescription key="fontDescription" type="system" weight="medium" pointSize="18"/>
+                                <fontDescription key="fontDescription" type="system" weight="semibold" pointSize="15"/>
                                 <color key="textColor" red="0.20000000000000001" green="0.20000000000000001" blue="0.20000000000000001" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
                                 <nil key="highlightedColor"/>
                             </label>
                             <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="252" text="" lineBreakMode="wordWrap" numberOfLines="0" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="FWq-QF-ONl">
-                                <rect key="frame" x="12" y="178" width="309" height="0.0"/>
-                                <fontDescription key="fontDescription" type="system" pointSize="16"/>
+                                <rect key="frame" x="12" y="111" width="298" height="114"/>
+                                <fontDescription key="fontDescription" type="system" pointSize="14"/>
                                 <color key="textColor" red="0.46666666666666667" green="0.46666666666666667" blue="0.46666666666666667" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
                                 <nil key="highlightedColor"/>
                             </label>
-                            <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="2c3-yX-YxS">
-                                <rect key="frame" x="70" y="14" width="203" height="22"/>
-                                <constraints>
-                                    <constraint firstAttribute="height" constant="22" id="dMw-tJ-YFP"/>
-                                </constraints>
-                                <fontDescription key="fontDescription" type="system" weight="medium" pointSize="18"/>
-                                <color key="textColor" red="0.20000000000000001" green="0.20000000000000001" blue="0.20000000000000001" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
-                                <nil key="highlightedColor"/>
-                            </label>
                         </subviews>
                         <color key="backgroundColor" systemColor="systemBackgroundColor"/>
                         <constraints>
-                            <constraint firstItem="Gv9-px-E4j" firstAttribute="top" secondItem="qWq-La-TpT" secondAttribute="top" id="2bt-UB-klh"/>
-                            <constraint firstAttribute="trailing" secondItem="038-4g-5JZ" secondAttribute="trailing" constant="12" id="ART-lR-s3C"/>
-                            <constraint firstItem="Gkn-L8-UCb" firstAttribute="leading" secondItem="qWq-La-TpT" secondAttribute="leading" constant="12" id="IYn-ew-2ea"/>
-                            <constraint firstItem="Gv9-px-E4j" firstAttribute="leading" secondItem="2c3-yX-YxS" secondAttribute="trailing" constant="12" id="Izw-tV-fyQ"/>
-                            <constraint firstItem="2c3-yX-YxS" firstAttribute="leading" secondItem="Gkn-L8-UCb" secondAttribute="trailing" constant="10" id="J3a-nQ-zqB"/>
-                            <constraint firstItem="vad-UL-yLE" firstAttribute="leading" secondItem="2c3-yX-YxS" secondAttribute="leading" id="JDu-Se-aI6"/>
-                            <constraint firstAttribute="trailing" secondItem="Gv9-px-E4j" secondAttribute="trailing" constant="8" id="N4A-xt-LAp"/>
-                            <constraint firstItem="vad-UL-yLE" firstAttribute="top" secondItem="2c3-yX-YxS" secondAttribute="bottom" constant="4" id="N7G-Ce-QIc"/>
-                            <constraint firstItem="gxd-9e-9Xw" firstAttribute="leading" secondItem="qWq-La-TpT" secondAttribute="leading" constant="12" id="NDs-Xr-hHO"/>
-                            <constraint firstItem="038-4g-5JZ" firstAttribute="top" secondItem="Gkn-L8-UCb" secondAttribute="bottom" constant="16" id="PH8-z7-60N"/>
-                            <constraint firstAttribute="trailing" secondItem="FWq-QF-ONl" secondAttribute="trailing" constant="12" id="RGL-31-rdK"/>
-                            <constraint firstAttribute="trailing" secondItem="gxd-9e-9Xw" secondAttribute="trailing" constant="12" id="S2d-pS-kaY"/>
-                            <constraint firstItem="FWq-QF-ONl" firstAttribute="top" secondItem="gxd-9e-9Xw" secondAttribute="bottom" constant="6" id="Vf4-jv-WpV"/>
-                            <constraint firstItem="gxd-9e-9Xw" firstAttribute="top" secondItem="038-4g-5JZ" secondAttribute="bottom" constant="16" id="WdV-Qv-AqI"/>
-                            <constraint firstAttribute="bottom" secondItem="FWq-QF-ONl" secondAttribute="bottom" constant="16" id="YVP-D4-aqo"/>
-                            <constraint firstItem="2c3-yX-YxS" firstAttribute="top" secondItem="Gkn-L8-UCb" secondAttribute="top" constant="2" id="ay7-jB-Ghd"/>
-                            <constraint firstItem="Fse-Bd-Rui" firstAttribute="leading" secondItem="vad-UL-yLE" secondAttribute="trailing" constant="6" id="b7x-ei-t05"/>
-                            <constraint firstItem="038-4g-5JZ" firstAttribute="leading" secondItem="qWq-La-TpT" secondAttribute="leading" constant="12" id="bC8-ah-beD"/>
-                            <constraint firstItem="FWq-QF-ONl" firstAttribute="leading" secondItem="qWq-La-TpT" secondAttribute="leading" constant="12" id="jAC-st-q1t"/>
-                            <constraint firstItem="Fse-Bd-Rui" firstAttribute="centerY" secondItem="vad-UL-yLE" secondAttribute="centerY" id="lF9-xB-hfp"/>
-                            <constraint firstItem="Gkn-L8-UCb" firstAttribute="top" secondItem="qWq-La-TpT" secondAttribute="top" constant="12" id="vJe-1d-d4U"/>
+                            <constraint firstItem="Gv9-px-E4j" firstAttribute="leading" secondItem="2c3-yX-YxS" secondAttribute="trailing" constant="12" id="0d1-2V-f0c"/>
+                            <constraint firstItem="vad-UL-yLE" firstAttribute="top" secondItem="2c3-yX-YxS" secondAttribute="bottom" constant="4" id="1f7-zg-Ca8"/>
+                            <constraint firstItem="Gkn-L8-UCb" firstAttribute="leading" secondItem="Jdh-Fo-Wpn" secondAttribute="leading" constant="12" id="3ZI-Dn-gaU"/>
+                            <constraint firstItem="vad-UL-yLE" firstAttribute="leading" secondItem="2c3-yX-YxS" secondAttribute="leading" id="42C-LT-gAz"/>
+                            <constraint firstAttribute="trailing" secondItem="FWq-QF-ONl" secondAttribute="trailing" constant="23" id="5Nd-hL-tIw"/>
+                            <constraint firstItem="Fse-Bd-Rui" firstAttribute="centerY" secondItem="vad-UL-yLE" secondAttribute="centerY" id="CZX-IK-w9g"/>
+                            <constraint firstAttribute="trailing" secondItem="47L-aP-812" secondAttribute="trailing" constant="12" id="HyT-AX-INN"/>
+                            <constraint firstAttribute="trailing" secondItem="gxd-9e-9Xw" secondAttribute="trailing" constant="12" id="KKO-wI-16S"/>
+                            <constraint firstItem="Fse-Bd-Rui" firstAttribute="leading" secondItem="vad-UL-yLE" secondAttribute="trailing" constant="6" id="Oss-CV-BSR"/>
+                            <constraint firstItem="2c3-yX-YxS" firstAttribute="top" secondItem="Jdh-Fo-Wpn" secondAttribute="top" constant="14" id="P5L-2G-u6a"/>
+                            <constraint firstItem="Gv9-px-E4j" firstAttribute="top" secondItem="Jdh-Fo-Wpn" secondAttribute="top" constant="5.5" id="QXL-oK-dMf"/>
+                            <constraint firstItem="gxd-9e-9Xw" firstAttribute="top" secondItem="47L-aP-812" secondAttribute="bottom" constant="12" id="V1V-pl-ind"/>
+                            <constraint firstItem="Gkn-L8-UCb" firstAttribute="top" secondItem="Jdh-Fo-Wpn" secondAttribute="top" constant="12" id="aQo-eC-AFc"/>
+                            <constraint firstItem="FWq-QF-ONl" firstAttribute="top" secondItem="gxd-9e-9Xw" secondAttribute="bottom" constant="5" id="cRa-gO-pGN"/>
+                            <constraint firstItem="gxd-9e-9Xw" firstAttribute="leading" secondItem="Jdh-Fo-Wpn" secondAttribute="leading" constant="12" id="d0r-ff-dgf"/>
+                            <constraint firstItem="FWq-QF-ONl" firstAttribute="leading" secondItem="Jdh-Fo-Wpn" secondAttribute="leading" constant="12" id="dK1-ff-rKg"/>
+                            <constraint firstItem="47L-aP-812" firstAttribute="leading" secondItem="Jdh-Fo-Wpn" secondAttribute="leading" constant="12" id="eRE-Hj-7oe"/>
+                            <constraint firstAttribute="bottom" secondItem="FWq-QF-ONl" secondAttribute="bottom" constant="16" id="gKg-yF-TE1"/>
+                            <constraint firstItem="47L-aP-812" firstAttribute="top" secondItem="Gkn-L8-UCb" secondAttribute="bottom" constant="12" id="oji-Pv-sfT"/>
+                            <constraint firstAttribute="trailing" secondItem="Gv9-px-E4j" secondAttribute="trailing" constant="3.5" id="upH-rK-Lrc"/>
+                            <constraint firstItem="2c3-yX-YxS" firstAttribute="leading" secondItem="Gkn-L8-UCb" secondAttribute="trailing" constant="10" id="xyi-iI-XSB"/>
                         </constraints>
                         <userDefinedRuntimeAttributes>
                             <userDefinedRuntimeAttribute type="number" keyPath="cornerRadius">
@@ -134,12 +137,11 @@
                         </userDefinedRuntimeAttributes>
                     </view>
                 </subviews>
-                <color key="backgroundColor" white="0.0" alpha="0.0" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
                 <constraints>
-                    <constraint firstItem="qWq-La-TpT" firstAttribute="top" secondItem="H2p-sc-9uM" secondAttribute="top" constant="12" id="3nM-FI-Z4T"/>
-                    <constraint firstAttribute="trailing" secondItem="qWq-La-TpT" secondAttribute="trailing" constant="13" id="4UE-wr-frc"/>
-                    <constraint firstItem="qWq-La-TpT" firstAttribute="leading" secondItem="H2p-sc-9uM" secondAttribute="leading" constant="13" id="5XS-Wg-4HZ"/>
-                    <constraint firstAttribute="bottom" secondItem="qWq-La-TpT" secondAttribute="bottom" id="ghz-gf-5wb"/>
+                    <constraint firstItem="Jdh-Fo-Wpn" firstAttribute="leading" secondItem="H2p-sc-9uM" secondAttribute="leading" constant="13" id="5Ur-ba-gvN"/>
+                    <constraint firstAttribute="bottom" secondItem="Jdh-Fo-Wpn" secondAttribute="bottom" id="7Cq-Lz-jgf"/>
+                    <constraint firstAttribute="trailing" secondItem="Jdh-Fo-Wpn" secondAttribute="trailing" constant="13" id="NCQ-Ic-naP"/>
+                    <constraint firstItem="Jdh-Fo-Wpn" firstAttribute="top" secondItem="H2p-sc-9uM" secondAttribute="top" constant="12" id="cig-xD-hB8"/>
                 </constraints>
             </tableViewCellContentView>
             <viewLayoutGuide key="safeArea" id="aW0-zy-SZf"/>
@@ -153,12 +155,12 @@
                 <outlet property="userLogo" destination="Gkn-L8-UCb" id="Gj8-xH-KxL"/>
                 <outlet property="userName" destination="2c3-yX-YxS" id="lOP-EJ-tfh"/>
             </connections>
-            <point key="canvasLocation" x="125.36231884057972" y="207.58928571428569"/>
+            <point key="canvasLocation" x="125.36231884057972" y="191.85267857142856"/>
         </tableViewCell>
     </objects>
     <resources>
         <image name="notice_action" width="24" height="25"/>
-        <image name="user_avatarRectangle" width="44" height="44"/>
+        <image name="teacher_avatar" width="150" height="150"/>
         <systemColor name="systemBackgroundColor">
             <color white="1" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
         </systemColor>

+ 24 - 0
KulexiuForTeacher/KulexiuForTeacher/Module/Chat/GroupNotice/View/GroupNoticeDetailBodyView.h

@@ -0,0 +1,24 @@
+//
+//  GroupNoticeDetailBodyView.h
+//  GuanYueTeamManager
+//
+//  Created by 王智 on 2024/9/2.
+//
+
+#import <UIKit/UIKit.h>
+#import "GroupNoticeCell.h"
+
+NS_ASSUME_NONNULL_BEGIN
+
+@interface GroupNoticeDetailBodyView : UIView
+
++ (instancetype)shareInstance;
+
+- (void)refreshSource:(id)source;
+
+- (void)configWithSource:(id)source enable:(BOOL)canEdit callback:(EditCallback)callback;
+
+
+@end
+
+NS_ASSUME_NONNULL_END

+ 85 - 0
KulexiuForTeacher/KulexiuForTeacher/Module/Chat/GroupNotice/View/GroupNoticeDetailBodyView.m

@@ -0,0 +1,85 @@
+//
+//  GroupNoticeDetailBodyView.m
+//  GuanYueTeamManager
+//
+//  Created by 王智 on 2024/9/2.
+//
+
+#import "GroupNoticeDetailBodyView.h"
+#import "GroupNoticeDetailModel.h"
+
+@interface GroupNoticeDetailBodyView ()
+
+@property (weak, nonatomic) IBOutlet UIImageView *userLogo;
+@property (weak, nonatomic) IBOutlet UILabel *userName;
+@property (weak, nonatomic) IBOutlet UILabel *modifyTime;
+@property (weak, nonatomic) IBOutlet UIButton *modifyButton;
+@property (weak, nonatomic) IBOutlet UILabel *focusLabel;
+@property (weak, nonatomic) IBOutlet UILabel *noticeTitle;
+@property (weak, nonatomic) IBOutlet UILabel *noticeContent;
+
+@property (nonatomic, copy) EditCallback callback;
+
+@property (nonatomic, strong) id sourceModel;
+
+@end
+
+@implementation GroupNoticeDetailBodyView
+
++ (instancetype)shareInstance {
+    GroupNoticeDetailBodyView *view = [[[NSBundle mainBundle] loadNibNamed:@"GroupNoticeDetailBodyView" owner:nil options:nil] firstObject];
+    return view;
+}
+
+- (void)refreshSource:(id)source {
+    self.sourceModel = source;
+    // 赋值
+    if ([source isKindOfClass:[GroupNoticeDetailModel class]]) {
+        GroupNoticeDetailModel *model = source;
+        self.userName.text = [NSString returnNoNullStringWithString:model.username];
+        [self.userLogo sd_setImageWithURL:[NSURL URLWithString:model.avatar] placeholderImage:[UIImage imageNamed:TEACHER_AVATAR]];
+        self.noticeTitle.text = [NSString returnNoNullStringWithString:model.title];
+        self.focusLabel.hidden = model.isTop ? NO : YES;
+        self.modifyTime.text = [NSString returnNoNullStringWithString:model.updateTime];
+        
+        self.noticeContent.text = [NSString returnNoNullStringWithString:model.content];
+        if (![NSString isEmptyString:model.content]) {
+            NSMutableAttributedString *attrs = [[NSMutableAttributedString alloc] initWithString:model.content attributes:@{NSFontAttributeName:[UIFont systemFontOfSize:14 weight:UIFontWeightRegular], NSForegroundColorAttributeName:HexRGB(0x777777)}];
+            self.noticeContent.attributedText = attrs;
+        }
+        else {
+            self.noticeContent.text = @"";
+        }
+    }
+}
+
+- (void)configWithSource:(id)source enable:(BOOL)canEdit callback:(EditCallback)callback {
+    if (callback) {
+        self.callback = callback;
+    }
+    [self refreshSource:source];
+    self.modifyButton.userInteractionEnabled = NO;
+    self.modifyButton.hidden = YES;
+    if (canEdit) {
+        self.modifyButton.userInteractionEnabled = YES;
+        self.modifyButton.hidden = NO;
+    }
+    
+    
+}
+
+- (IBAction)editAction:(UIButton *)sender {
+    if (self.callback) {
+        self.callback(self.sourceModel,sender);
+    }
+}
+
+/*
+// Only override drawRect: if you perform custom drawing.
+// An empty implementation adversely affects performance during animation.
+- (void)drawRect:(CGRect)rect {
+    // Drawing code
+}
+*/
+
+@end

+ 166 - 0
KulexiuForTeacher/KulexiuForTeacher/Module/Chat/GroupNotice/View/GroupNoticeDetailBodyView.xib

@@ -0,0 +1,166 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<document type="com.apple.InterfaceBuilder3.CocoaTouch.XIB" version="3.0" toolsVersion="32700.99.1234" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" useTraitCollections="YES" useSafeAreas="YES" colorMatched="YES">
+    <device id="retina6_12" orientation="portrait" appearance="light"/>
+    <dependencies>
+        <deployment identifier="iOS"/>
+        <plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="22685"/>
+        <capability name="Safe area layout guides" minToolsVersion="9.0"/>
+        <capability name="System colors in document resources" minToolsVersion="11.0"/>
+        <capability name="documents saved in the Xcode 8 format" minToolsVersion="8.0"/>
+    </dependencies>
+    <objects>
+        <placeholder placeholderIdentifier="IBFilesOwner" id="-1" userLabel="File's Owner"/>
+        <placeholder placeholderIdentifier="IBFirstResponder" id="-2" customClass="UIResponder"/>
+        <view contentMode="scaleToFill" id="iN0-l3-epB" customClass="GroupNoticeDetailBodyView">
+            <rect key="frame" x="0.0" y="0.0" width="393" height="852"/>
+            <autoresizingMask key="autoresizingMask"/>
+            <subviews>
+                <view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="U45-g3-TEP">
+                    <rect key="frame" x="13" y="12" width="367" height="127"/>
+                    <subviews>
+                        <imageView clipsSubviews="YES" userInteractionEnabled="NO" contentMode="scaleAspectFill" horizontalHuggingPriority="251" verticalHuggingPriority="251" image="teacher_avatar" translatesAutoresizingMaskIntoConstraints="NO" id="62c-65-fwx">
+                            <rect key="frame" x="12" y="12" width="48" height="48"/>
+                            <constraints>
+                                <constraint firstAttribute="height" constant="48" id="1IK-Yj-cYx"/>
+                                <constraint firstAttribute="width" constant="48" id="nKy-8p-3Ee"/>
+                            </constraints>
+                            <userDefinedRuntimeAttributes>
+                                <userDefinedRuntimeAttribute type="number" keyPath="cornerRadius">
+                                    <real key="value" value="24"/>
+                                </userDefinedRuntimeAttribute>
+                            </userDefinedRuntimeAttributes>
+                        </imageView>
+                        <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="70t-nX-m7j">
+                            <rect key="frame" x="69.999999999999986" y="14" width="243.66666666666663" height="22"/>
+                            <constraints>
+                                <constraint firstAttribute="height" constant="22" id="Oto-pk-Eo6"/>
+                            </constraints>
+                            <fontDescription key="fontDescription" type="system" weight="semibold" pointSize="16"/>
+                            <color key="textColor" red="0.20000000000000001" green="0.20000000000000001" blue="0.20000000000000001" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
+                            <nil key="highlightedColor"/>
+                        </label>
+                        <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="I5b-RG-0dE">
+                            <rect key="frame" x="70" y="40" width="0.0" height="18"/>
+                            <constraints>
+                                <constraint firstAttribute="height" constant="18" id="6DK-if-GKt"/>
+                            </constraints>
+                            <fontDescription key="fontDescription" type="system" pointSize="13"/>
+                            <color key="textColor" red="0.46666666670000001" green="0.46666666670000001" blue="0.46666666670000001" alpha="1" colorSpace="calibratedRGB"/>
+                            <nil key="highlightedColor"/>
+                        </label>
+                        <button opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="r31-Oy-hyD">
+                            <rect key="frame" x="323.66666666666669" y="5.6666666666666679" width="40" height="40"/>
+                            <constraints>
+                                <constraint firstAttribute="height" constant="40" id="6gF-M8-hb4"/>
+                                <constraint firstAttribute="width" constant="40" id="pkD-bc-Q44"/>
+                            </constraints>
+                            <state key="normal" image="notice_action"/>
+                            <connections>
+                                <action selector="editAction:" destination="iN0-l3-epB" eventType="touchUpInside" id="Ztu-Gg-myz"/>
+                            </connections>
+                        </button>
+                        <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="置顶" textAlignment="center" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="g5H-XJ-LiA">
+                            <rect key="frame" x="76" y="39.666666666666664" width="40" height="19"/>
+                            <constraints>
+                                <constraint firstAttribute="height" constant="19" id="eRu-fc-vHH"/>
+                                <constraint firstAttribute="width" constant="40" id="hi9-Wa-xYC"/>
+                            </constraints>
+                            <fontDescription key="fontDescription" type="system" pointSize="12"/>
+                            <color key="textColor" red="1" green="0.31764705882352939" blue="0.31764705882352939" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
+                            <nil key="highlightedColor"/>
+                            <userDefinedRuntimeAttributes>
+                                <userDefinedRuntimeAttribute type="number" keyPath="cornerRadius">
+                                    <real key="value" value="9.5"/>
+                                </userDefinedRuntimeAttribute>
+                                <userDefinedRuntimeAttribute type="color" keyPath="borderColor">
+                                    <color key="value" red="1" green="0.31764705882352939" blue="0.31764705882352939" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
+                                </userDefinedRuntimeAttribute>
+                                <userDefinedRuntimeAttribute type="number" keyPath="borderWidth">
+                                    <real key="value" value="1"/>
+                                </userDefinedRuntimeAttribute>
+                            </userDefinedRuntimeAttributes>
+                        </label>
+                        <view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="NH8-Zj-ieK">
+                            <rect key="frame" x="12" y="72" width="343" height="1"/>
+                            <color key="backgroundColor" red="0.94901960780000005" green="0.94901960780000005" blue="0.94901960780000005" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
+                            <constraints>
+                                <constraint firstAttribute="height" constant="1" id="P9W-60-LWJ"/>
+                            </constraints>
+                        </view>
+                        <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" verticalCompressionResistancePriority="749" text="" textAlignment="natural" lineBreakMode="tailTruncation" numberOfLines="0" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="6Xh-iI-Zl8">
+                            <rect key="frame" x="12" y="85" width="343" height="21"/>
+                            <constraints>
+                                <constraint firstAttribute="height" constant="21" id="qXR-a3-h5j"/>
+                            </constraints>
+                            <fontDescription key="fontDescription" type="system" weight="semibold" pointSize="15"/>
+                            <color key="textColor" red="0.20000000000000001" green="0.20000000000000001" blue="0.20000000000000001" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
+                            <nil key="highlightedColor"/>
+                        </label>
+                        <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="252" text="" lineBreakMode="wordWrap" numberOfLines="0" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="RUn-oI-u4C">
+                            <rect key="frame" x="12" y="111" width="332" height="0.0"/>
+                            <fontDescription key="fontDescription" type="system" pointSize="14"/>
+                            <color key="textColor" red="0.46666666666666667" green="0.46666666666666667" blue="0.46666666666666667" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
+                            <nil key="highlightedColor"/>
+                        </label>
+                    </subviews>
+                    <color key="backgroundColor" systemColor="systemBackgroundColor"/>
+                    <constraints>
+                        <constraint firstItem="62c-65-fwx" firstAttribute="top" secondItem="U45-g3-TEP" secondAttribute="top" constant="12" id="95n-hq-uux"/>
+                        <constraint firstAttribute="trailing" secondItem="6Xh-iI-Zl8" secondAttribute="trailing" constant="12" id="CDd-eV-WJh"/>
+                        <constraint firstItem="70t-nX-m7j" firstAttribute="top" secondItem="U45-g3-TEP" secondAttribute="top" constant="14" id="DzK-hi-wVo"/>
+                        <constraint firstItem="I5b-RG-0dE" firstAttribute="top" secondItem="70t-nX-m7j" secondAttribute="bottom" constant="4" id="Fc4-dB-leq"/>
+                        <constraint firstItem="NH8-Zj-ieK" firstAttribute="leading" secondItem="U45-g3-TEP" secondAttribute="leading" constant="12" id="H1p-dx-VTB"/>
+                        <constraint firstAttribute="trailing" secondItem="NH8-Zj-ieK" secondAttribute="trailing" constant="12" id="I1k-Ij-4yJ"/>
+                        <constraint firstItem="RUn-oI-u4C" firstAttribute="leading" secondItem="U45-g3-TEP" secondAttribute="leading" constant="12" id="QQo-RW-ufF"/>
+                        <constraint firstItem="RUn-oI-u4C" firstAttribute="top" secondItem="6Xh-iI-Zl8" secondAttribute="bottom" constant="5" id="QlV-bU-NDL"/>
+                        <constraint firstItem="g5H-XJ-LiA" firstAttribute="centerY" secondItem="I5b-RG-0dE" secondAttribute="centerY" id="WAK-Jv-OBg"/>
+                        <constraint firstItem="6Xh-iI-Zl8" firstAttribute="top" secondItem="NH8-Zj-ieK" secondAttribute="bottom" constant="12" id="Wfw-w5-jaS"/>
+                        <constraint firstAttribute="trailing" secondItem="RUn-oI-u4C" secondAttribute="trailing" constant="23" id="ZZY-7F-NSz"/>
+                        <constraint firstAttribute="bottom" secondItem="RUn-oI-u4C" secondAttribute="bottom" constant="16" id="ewD-oI-JY8"/>
+                        <constraint firstItem="g5H-XJ-LiA" firstAttribute="leading" secondItem="I5b-RG-0dE" secondAttribute="trailing" constant="6" id="jIe-U3-gnt"/>
+                        <constraint firstItem="70t-nX-m7j" firstAttribute="leading" secondItem="62c-65-fwx" secondAttribute="trailing" constant="10" id="lhs-RK-8UB"/>
+                        <constraint firstItem="r31-Oy-hyD" firstAttribute="leading" secondItem="70t-nX-m7j" secondAttribute="trailing" constant="10" id="lke-VY-HYi"/>
+                        <constraint firstItem="NH8-Zj-ieK" firstAttribute="top" secondItem="62c-65-fwx" secondAttribute="bottom" constant="12" id="oEx-Li-k9L"/>
+                        <constraint firstItem="62c-65-fwx" firstAttribute="leading" secondItem="U45-g3-TEP" secondAttribute="leading" constant="12" id="rCc-3u-NH1"/>
+                        <constraint firstItem="6Xh-iI-Zl8" firstAttribute="leading" secondItem="U45-g3-TEP" secondAttribute="leading" constant="12" id="ro4-MV-ZGq"/>
+                        <constraint firstAttribute="trailing" secondItem="r31-Oy-hyD" secondAttribute="trailing" constant="3.5" id="rpy-xC-GXd"/>
+                        <constraint firstItem="I5b-RG-0dE" firstAttribute="leading" secondItem="70t-nX-m7j" secondAttribute="leading" id="wQq-Pu-SxK"/>
+                        <constraint firstItem="r31-Oy-hyD" firstAttribute="top" secondItem="U45-g3-TEP" secondAttribute="top" constant="5.5" id="zYN-jN-bQk"/>
+                    </constraints>
+                    <userDefinedRuntimeAttributes>
+                        <userDefinedRuntimeAttribute type="number" keyPath="cornerRadius">
+                            <real key="value" value="10"/>
+                        </userDefinedRuntimeAttribute>
+                    </userDefinedRuntimeAttributes>
+                </view>
+            </subviews>
+            <viewLayoutGuide key="safeArea" id="vUN-kp-3ea"/>
+            <color key="backgroundColor" red="0.97254901960784312" green="0.97254901960784312" blue="0.97254901960784312" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
+            <constraints>
+                <constraint firstItem="U45-g3-TEP" firstAttribute="leading" secondItem="iN0-l3-epB" secondAttribute="leading" constant="13" id="64m-Px-O5U"/>
+                <constraint firstItem="U45-g3-TEP" firstAttribute="top" secondItem="iN0-l3-epB" secondAttribute="top" constant="12" id="dwy-C5-bXj"/>
+                <constraint firstItem="vUN-kp-3ea" firstAttribute="trailing" secondItem="U45-g3-TEP" secondAttribute="trailing" constant="13" id="w2Q-S6-cMM"/>
+            </constraints>
+            <nil key="simulatedTopBarMetrics"/>
+            <nil key="simulatedBottomBarMetrics"/>
+            <freeformSimulatedSizeMetrics key="simulatedDestinationMetrics"/>
+            <connections>
+                <outlet property="focusLabel" destination="g5H-XJ-LiA" id="mrU-gE-oBC"/>
+                <outlet property="modifyButton" destination="r31-Oy-hyD" id="oBq-87-yDO"/>
+                <outlet property="modifyTime" destination="I5b-RG-0dE" id="72O-5k-3IT"/>
+                <outlet property="noticeContent" destination="RUn-oI-u4C" id="Imh-Ye-imh"/>
+                <outlet property="noticeTitle" destination="6Xh-iI-Zl8" id="dOp-LE-gpT"/>
+                <outlet property="userLogo" destination="62c-65-fwx" id="pNk-fp-hlD"/>
+                <outlet property="userName" destination="70t-nX-m7j" id="e4Z-yA-lxV"/>
+            </connections>
+            <point key="canvasLocation" x="65" y="20"/>
+        </view>
+    </objects>
+    <resources>
+        <image name="notice_action" width="24" height="25"/>
+        <image name="teacher_avatar" width="150" height="150"/>
+        <systemColor name="systemBackgroundColor">
+            <color white="1" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
+        </systemColor>
+    </resources>
+</document>

+ 30 - 0
KulexiuForTeacher/KulexiuForTeacher/Module/Chat/GroupNotice/View/KSPopView.h

@@ -0,0 +1,30 @@
+//
+//  KSPopView.h
+//  GuanYueTeamManager
+//
+//  Created by 王智 on 2024/9/10.
+//
+
+#import <UIKit/UIKit.h>
+
+typedef NS_ENUM(NSInteger, KSPOP_TAG) {
+    KSPOP_TAG_EDIT,    // 编辑
+    KSPOP_TAG_TOP,     // 设为置顶
+    KSPOP_TAG_CANCELTOP, // 取消置顶
+    KSPOP_TAG_DELETE,  // 删除公告
+};
+typedef void(^PopActionCallback)(KSPOP_TAG tag);
+
+NS_ASSUME_NONNULL_BEGIN
+
+@interface KSPopView : UIView
+
+@property (nonatomic, assign) BOOL isNoticeTop;
+
++ (instancetype)shareInstance;
+
+- (void)showPopToView:(CGPoint)locationPoint callBack:(PopActionCallback)callback;
+
+@end
+
+NS_ASSUME_NONNULL_END

+ 105 - 0
KulexiuForTeacher/KulexiuForTeacher/Module/Chat/GroupNotice/View/KSPopView.m

@@ -0,0 +1,105 @@
+//
+//  KSPopView.m
+//  GuanYueTeamManager
+//
+//  Created by 王智 on 2024/9/10.
+//
+
+#import "KSPopView.h"
+#define POP_VIEW_HEIGHT (133)
+#define POP_VIEW_MARGIN (16)
+
+@interface KSPopView ()<UIGestureRecognizerDelegate>
+
+@property (weak, nonatomic) IBOutlet UIView *containerView;
+
+@property (weak, nonatomic) IBOutlet NSLayoutConstraint *topSpace;
+
+@property (weak, nonatomic) IBOutlet UILabel *topTitleLabel;
+
+@property (nonatomic, copy) PopActionCallback callback;
+
+@end
+
+@implementation KSPopView
+
+- (void)awakeFromNib {
+    [super awakeFromNib];
+    UITapGestureRecognizer *gesture = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(tapAction:)];
+    gesture.delegate = self;
+    [self addGestureRecognizer:gesture];
+}
+
+- (void)tapAction:(UITapGestureRecognizer *)gesture {
+    [self hideView];
+}
+
+- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceiveTouch:(UITouch *)touch {
+    if ([touch.view isDescendantOfView:self.containerView]) {
+        return NO;
+    }
+    return YES;
+}
+
++ (instancetype)shareInstance {
+    KSPopView *view = [[[NSBundle mainBundle] loadNibNamed:@"KSPopView" owner:nil options:nil] firstObject];
+    view.frame = CGRectMake(0, 0, KPortraitWidth, KPortraitHeight);
+    return view;
+}
+
+- (void)showPopToView:(CGPoint)locationPoint callBack:(PopActionCallback)callback {
+    if (callback) {
+        self.callback = callback;
+    }
+    [[NSObject getKeyWindow] addSubview:self];
+    CGFloat maxY = locationPoint.y;
+    CGFloat topSpace = maxY;
+    if (maxY + POP_VIEW_HEIGHT + POP_VIEW_MARGIN > KPortraitHeight) {
+        topSpace = maxY - POP_VIEW_HEIGHT;
+    }
+    self.topSpace.constant = topSpace;
+}
+
+- (void)hideView {
+    [self removeFromSuperview];
+}
+
+- (IBAction)editAction:(id)sender {
+    if (self.callback) {
+        self.callback(KSPOP_TAG_EDIT);
+    }
+    [self hideView];
+}
+
+- (IBAction)topEdit:(id)sender {
+    if (self.callback) {
+        KSPOP_TAG tag = self.isNoticeTop ? KSPOP_TAG_CANCELTOP : KSPOP_TAG_TOP;
+        self.callback(tag);
+    }
+    [self hideView];
+}
+
+- (IBAction)deleteAction:(id)sender {
+    if (self.callback) {
+        self.callback(KSPOP_TAG_DELETE);
+    }
+    [self hideView];
+}
+
+- (void)setIsNoticeTop:(BOOL)isNoticeTop {
+    _isNoticeTop = isNoticeTop;
+    NSString *text = isNoticeTop ? @"取消置顶" : @"设为置顶";
+    self.topTitleLabel.text = text;
+}
+
+
+
+/*
+// Only override drawRect: if you perform custom drawing.
+// An empty implementation adversely affects performance during animation.
+- (void)drawRect:(CGRect)rect {
+    // Drawing code
+}
+*/
+
+@end

+ 147 - 0
KulexiuForTeacher/KulexiuForTeacher/Module/Chat/GroupNotice/View/KSPopView.xib

@@ -0,0 +1,147 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<document type="com.apple.InterfaceBuilder3.CocoaTouch.XIB" version="3.0" toolsVersion="32700.99.1234" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" useTraitCollections="YES" colorMatched="YES">
+    <device id="retina6_12" orientation="portrait" appearance="light"/>
+    <dependencies>
+        <deployment identifier="iOS"/>
+        <plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="22685"/>
+        <capability name="System colors in document resources" minToolsVersion="11.0"/>
+        <capability name="documents saved in the Xcode 8 format" minToolsVersion="8.0"/>
+    </dependencies>
+    <objects>
+        <placeholder placeholderIdentifier="IBFilesOwner" id="-1" userLabel="File's Owner"/>
+        <placeholder placeholderIdentifier="IBFirstResponder" id="-2" customClass="UIResponder"/>
+        <view contentMode="scaleToFill" id="iN0-l3-epB" customClass="KSPopView">
+            <rect key="frame" x="0.0" y="0.0" width="393" height="852"/>
+            <autoresizingMask key="autoresizingMask"/>
+            <subviews>
+                <view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="6Df-ZE-Y9L">
+                    <rect key="frame" x="248" y="12" width="120" height="133"/>
+                    <subviews>
+                        <view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="IDo-c1-nTp">
+                            <rect key="frame" x="10" y="44" width="100" height="0.6666666666666643"/>
+                            <color key="backgroundColor" red="0.94901960784313721" green="0.94901960784313721" blue="0.94901960784313721" alpha="1" colorSpace="calibratedRGB"/>
+                            <constraints>
+                                <constraint firstAttribute="height" constant="0.5" id="Upm-wN-YY5"/>
+                            </constraints>
+                        </view>
+                        <view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="hQI-LV-wxX">
+                            <rect key="frame" x="12" y="88.666666666666671" width="96" height="0.3333333333333286"/>
+                            <color key="backgroundColor" red="0.94901960780000005" green="0.94901960780000005" blue="0.94901960780000005" alpha="1" colorSpace="calibratedRGB"/>
+                            <constraints>
+                                <constraint firstAttribute="height" constant="0.5" id="dqg-PY-dXB"/>
+                            </constraints>
+                        </view>
+                        <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="编辑公告" textAlignment="center" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="7ix-16-rz7">
+                            <rect key="frame" x="31" y="12" width="58" height="20"/>
+                            <fontDescription key="fontDescription" type="system" pointSize="14"/>
+                            <color key="textColor" red="0.20000000000000001" green="0.20000000000000001" blue="0.20000000000000001" alpha="1" colorSpace="calibratedRGB"/>
+                            <nil key="highlightedColor"/>
+                        </label>
+                        <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="设为置顶" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="QP3-T1-SDn">
+                            <rect key="frame" x="31" y="56.666666666666671" width="58" height="20"/>
+                            <fontDescription key="fontDescription" type="system" pointSize="14"/>
+                            <color key="textColor" red="0.20000000000000001" green="0.20000000000000001" blue="0.20000000000000001" alpha="1" colorSpace="calibratedRGB"/>
+                            <nil key="highlightedColor"/>
+                        </label>
+                        <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="删除公告" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="klu-yq-5fT">
+                            <rect key="frame" x="31" y="101" width="58" height="20"/>
+                            <fontDescription key="fontDescription" type="system" pointSize="14"/>
+                            <color key="textColor" red="0.96862745098039216" green="0.24705882352941178" blue="0.23137254901960785" alpha="1" colorSpace="calibratedRGB"/>
+                            <nil key="highlightedColor"/>
+                        </label>
+                        <button opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="stG-tB-UBc">
+                            <rect key="frame" x="0.0" y="0.0" width="120" height="44"/>
+                            <inset key="imageEdgeInsets" minX="0.0" minY="0.0" maxX="2.2250738585072014e-308" maxY="0.0"/>
+                            <connections>
+                                <action selector="editAction:" destination="iN0-l3-epB" eventType="touchUpInside" id="37I-Eu-bQK"/>
+                            </connections>
+                        </button>
+                        <button opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="mPU-Ib-uuF">
+                            <rect key="frame" x="0.0" y="44.666666666666657" width="120" height="44"/>
+                            <inset key="imageEdgeInsets" minX="0.0" minY="0.0" maxX="2.2250738585072014e-308" maxY="0.0"/>
+                            <connections>
+                                <action selector="topEdit:" destination="iN0-l3-epB" eventType="touchUpInside" id="Xu2-Ic-2yE"/>
+                            </connections>
+                        </button>
+                        <button opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="PGh-2k-dsu">
+                            <rect key="frame" x="0.0" y="89" width="120" height="44"/>
+                            <inset key="imageEdgeInsets" minX="0.0" minY="0.0" maxX="2.2250738585072014e-308" maxY="0.0"/>
+                            <connections>
+                                <action selector="deleteAction:" destination="iN0-l3-epB" eventType="touchUpInside" id="4HP-aM-4jY"/>
+                            </connections>
+                        </button>
+                    </subviews>
+                    <color key="backgroundColor" systemColor="systemBackgroundColor"/>
+                    <constraints>
+                        <constraint firstItem="stG-tB-UBc" firstAttribute="leading" secondItem="6Df-ZE-Y9L" secondAttribute="leading" id="1Su-Q2-LRV"/>
+                        <constraint firstItem="7ix-16-rz7" firstAttribute="centerX" secondItem="6Df-ZE-Y9L" secondAttribute="centerX" id="3DY-aN-ydn"/>
+                        <constraint firstAttribute="bottom" secondItem="klu-yq-5fT" secondAttribute="bottom" constant="12" id="5gI-7a-HqV"/>
+                        <constraint firstItem="hQI-LV-wxX" firstAttribute="top" secondItem="IDo-c1-nTp" secondAttribute="bottom" constant="44" id="BDY-k5-b1o"/>
+                        <constraint firstAttribute="trailing" secondItem="stG-tB-UBc" secondAttribute="trailing" id="DtU-sX-SmK"/>
+                        <constraint firstItem="IDo-c1-nTp" firstAttribute="top" secondItem="7ix-16-rz7" secondAttribute="bottom" constant="12" id="E6F-Zl-PRK"/>
+                        <constraint firstItem="hQI-LV-wxX" firstAttribute="top" secondItem="QP3-T1-SDn" secondAttribute="bottom" constant="12" id="HyF-9q-2ja"/>
+                        <constraint firstItem="hQI-LV-wxX" firstAttribute="leading" secondItem="6Df-ZE-Y9L" secondAttribute="leading" constant="12" id="Md0-I2-asL"/>
+                        <constraint firstItem="PGh-2k-dsu" firstAttribute="top" secondItem="hQI-LV-wxX" secondAttribute="bottom" id="Nm5-cp-nCe"/>
+                        <constraint firstItem="QP3-T1-SDn" firstAttribute="centerX" secondItem="6Df-ZE-Y9L" secondAttribute="centerX" id="OfU-vw-Ny9"/>
+                        <constraint firstAttribute="trailing" secondItem="PGh-2k-dsu" secondAttribute="trailing" id="PQK-MR-FnD"/>
+                        <constraint firstItem="IDo-c1-nTp" firstAttribute="top" secondItem="6Df-ZE-Y9L" secondAttribute="top" constant="44" id="Tqc-mB-AdP"/>
+                        <constraint firstItem="mPU-Ib-uuF" firstAttribute="leading" secondItem="6Df-ZE-Y9L" secondAttribute="leading" id="V8L-32-uZA"/>
+                        <constraint firstItem="klu-yq-5fT" firstAttribute="centerX" secondItem="6Df-ZE-Y9L" secondAttribute="centerX" id="WPJ-qi-pCj"/>
+                        <constraint firstItem="stG-tB-UBc" firstAttribute="top" secondItem="6Df-ZE-Y9L" secondAttribute="top" id="Y8g-Kf-Aii"/>
+                        <constraint firstAttribute="height" constant="133" id="c3y-QS-uab"/>
+                        <constraint firstItem="7ix-16-rz7" firstAttribute="top" secondItem="6Df-ZE-Y9L" secondAttribute="top" constant="12" id="d7d-Ik-NbW"/>
+                        <constraint firstItem="klu-yq-5fT" firstAttribute="top" secondItem="hQI-LV-wxX" secondAttribute="bottom" constant="12" id="dNk-mN-i8i"/>
+                        <constraint firstAttribute="trailing" secondItem="hQI-LV-wxX" secondAttribute="trailing" constant="12" id="hAM-Xc-tKU"/>
+                        <constraint firstItem="mPU-Ib-uuF" firstAttribute="top" secondItem="IDo-c1-nTp" secondAttribute="bottom" id="l7C-2S-enQ"/>
+                        <constraint firstAttribute="trailing" secondItem="IDo-c1-nTp" secondAttribute="trailing" constant="10" id="m1W-Vw-0hf"/>
+                        <constraint firstItem="IDo-c1-nTp" firstAttribute="leading" secondItem="6Df-ZE-Y9L" secondAttribute="leading" constant="10" id="mX4-62-bPs"/>
+                        <constraint firstItem="hQI-LV-wxX" firstAttribute="top" secondItem="mPU-Ib-uuF" secondAttribute="bottom" id="nSR-NF-Iz4"/>
+                        <constraint firstItem="PGh-2k-dsu" firstAttribute="leading" secondItem="6Df-ZE-Y9L" secondAttribute="leading" id="o8f-n3-nE9"/>
+                        <constraint firstAttribute="width" constant="120" id="qIr-uu-bRn"/>
+                        <constraint firstItem="IDo-c1-nTp" firstAttribute="top" secondItem="stG-tB-UBc" secondAttribute="bottom" id="v4k-k6-ECn"/>
+                        <constraint firstAttribute="trailing" secondItem="mPU-Ib-uuF" secondAttribute="trailing" id="vib-w7-zhb"/>
+                        <constraint firstAttribute="bottom" secondItem="PGh-2k-dsu" secondAttribute="bottom" id="wMz-nk-GIO"/>
+                        <constraint firstItem="QP3-T1-SDn" firstAttribute="top" secondItem="IDo-c1-nTp" secondAttribute="bottom" constant="12" id="xiS-LV-bLP"/>
+                    </constraints>
+                    <userDefinedRuntimeAttributes>
+                        <userDefinedRuntimeAttribute type="number" keyPath="cornerRadius">
+                            <real key="value" value="12"/>
+                        </userDefinedRuntimeAttribute>
+                        <userDefinedRuntimeAttribute type="size" keyPath="shadowOffset">
+                            <size key="value" width="0.0" height="2"/>
+                        </userDefinedRuntimeAttribute>
+                        <userDefinedRuntimeAttribute type="color" keyPath="shadowUIColor">
+                            <color key="value" red="0.0" green="0.0" blue="0.0" alpha="0.10000000000000001" colorSpace="custom" customColorSpace="calibratedRGB"/>
+                        </userDefinedRuntimeAttribute>
+                        <userDefinedRuntimeAttribute type="number" keyPath="shadowOpacity">
+                            <real key="value" value="1"/>
+                        </userDefinedRuntimeAttribute>
+                        <userDefinedRuntimeAttribute type="number" keyPath="shadowRadius">
+                            <real key="value" value="10"/>
+                        </userDefinedRuntimeAttribute>
+                        <userDefinedRuntimeAttribute type="boolean" keyPath="maskToBounces" value="NO"/>
+                    </userDefinedRuntimeAttributes>
+                </view>
+            </subviews>
+            <color key="backgroundColor" white="0.0" alpha="0.0" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
+            <constraints>
+                <constraint firstAttribute="trailing" secondItem="6Df-ZE-Y9L" secondAttribute="trailing" constant="25" id="Uck-oi-EdS"/>
+                <constraint firstItem="6Df-ZE-Y9L" firstAttribute="top" secondItem="iN0-l3-epB" secondAttribute="top" constant="12" id="sZE-qw-O3j"/>
+            </constraints>
+            <nil key="simulatedTopBarMetrics"/>
+            <nil key="simulatedBottomBarMetrics"/>
+            <freeformSimulatedSizeMetrics key="simulatedDestinationMetrics"/>
+            <connections>
+                <outlet property="containerView" destination="6Df-ZE-Y9L" id="w9t-eM-Hg2"/>
+                <outlet property="topSpace" destination="sZE-qw-O3j" id="QZo-VV-AvM"/>
+                <outlet property="topTitleLabel" destination="QP3-T1-SDn" id="6yJ-kU-yoy"/>
+            </connections>
+            <point key="canvasLocation" x="43.511450381679388" y="19.718309859154932"/>
+        </view>
+    </objects>
+    <resources>
+        <systemColor name="systemBackgroundColor">
+            <color white="1" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
+        </systemColor>
+    </resources>
+</document>

+ 5 - 0
KulexiuForTeacher/KulexiuForTeacher/Module/Chat/GroupNotice/View/NoticeEditBodyView.h

@@ -18,6 +18,11 @@ typedef void(^PublishBlock)(void);
 @property (weak, nonatomic) IBOutlet UITextView *contentArea;
 
 @property (weak, nonatomic) IBOutlet UILabel *tipsLabel;
+
+@property (weak, nonatomic) IBOutlet UILabel *titleCount;
+
+@property (weak, nonatomic) IBOutlet UILabel *contentCount;
+
 @property (nonatomic, assign) BOOL isOn;
 
 + (instancetype)shareInstance;

+ 10 - 6
KulexiuForTeacher/KulexiuForTeacher/Module/Chat/GroupNotice/View/NoticeEditBodyView.m

@@ -10,6 +10,7 @@
 
 @interface NoticeEditBodyView ()<UITextViewDelegate>
 
+
 @property (weak, nonatomic) IBOutlet UIButton *focusButton;
 
 @property (nonatomic, copy) PublishBlock callback;
@@ -72,8 +73,9 @@
     else {
         self.tipsLabel.hidden = YES;
     }
-    
 }
+
+
 - (void)textViewDidEndEditing:(UITextView *)textView {
     if ([NSString isEmptyString:textView.text]) {
         if (textView == self.titleView) {
@@ -86,21 +88,23 @@
 }
 
 - (BOOL)textView:(UITextView *)textView shouldChangeTextInRange:(NSRange)range replacementText:(NSString *)text {
-//    if ([text isEqualToString:@"\n"]) {
-//        [self endEditing:YES];
-//        return YES;
-//    }
+    if ([text isEqualToString:@""]) {
+        return YES;
+    }
     if (textView == self.titleView) {
         NSString *newText = [[textView text] stringByReplacingCharactersInRange:range withString:text];
         if (newText.length > 25) {
             return NO;
         }
+        self.titleCount.text = [NSString stringWithFormat:@"%zd/25",newText.length];
     }
     else {
         NSString *newText = [[textView text] stringByReplacingCharactersInRange:range withString:text];
-        if (newText.length > 255) {
+        if (newText.length > 200) {
             return NO;
         }
+        self.contentCount.text = [NSString stringWithFormat:@"%zd/200",newText.length];
+
     }
     return YES;
 }

+ 106 - 68
KulexiuForTeacher/KulexiuForTeacher/Module/Chat/GroupNotice/View/NoticeEditBodyView.xib

@@ -1,9 +1,9 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<document type="com.apple.InterfaceBuilder3.CocoaTouch.XIB" version="3.0" toolsVersion="20037" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" useTraitCollections="YES" colorMatched="YES">
+<document type="com.apple.InterfaceBuilder3.CocoaTouch.XIB" version="3.0" toolsVersion="32700.99.1234" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" useTraitCollections="YES" colorMatched="YES">
     <device id="retina6_1" orientation="portrait" appearance="light"/>
     <dependencies>
         <deployment identifier="iOS"/>
-        <plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="20020"/>
+        <plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="22685"/>
         <capability name="System colors in document resources" minToolsVersion="11.0"/>
         <capability name="documents saved in the Xcode 8 format" minToolsVersion="8.0"/>
     </dependencies>
@@ -15,18 +15,18 @@
             <autoresizingMask key="autoresizingMask"/>
             <subviews>
                 <view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="DPp-n1-uMt">
-                    <rect key="frame" x="0.0" y="359" width="414" height="55"/>
+                    <rect key="frame" x="13" y="418" width="388" height="58"/>
                     <subviews>
-                        <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="设置置顶" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="l5E-hK-DeW">
-                            <rect key="frame" x="16" y="17" width="70" height="21"/>
-                            <fontDescription key="fontDescription" type="system" pointSize="17"/>
-                            <color key="textColor" red="0.1019607843" green="0.1019607843" blue="0.1019607843" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
+                        <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="设置置顶" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="l5E-hK-DeW">
+                            <rect key="frame" x="16" y="19.5" width="82" height="19.5"/>
+                            <fontDescription key="fontDescription" type="system" pointSize="16"/>
+                            <color key="textColor" red="0.20000000000000001" green="0.20000000000000001" blue="0.20000000000000001" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
                             <nil key="highlightedColor"/>
                         </label>
                         <button opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="Ecm-Xk-VkC">
-                            <rect key="frame" x="351" y="7.5" width="47" height="40"/>
+                            <rect key="frame" x="326" y="9" width="46" height="40"/>
                             <constraints>
-                                <constraint firstAttribute="width" constant="47" id="2jb-Nl-yZE"/>
+                                <constraint firstAttribute="width" constant="46" id="2jb-Nl-yZE"/>
                                 <constraint firstAttribute="height" constant="40" id="iWn-MT-fIV"/>
                             </constraints>
                             <state key="normal" image="switch_on"/>
@@ -38,22 +38,28 @@
                     <color key="backgroundColor" systemColor="systemBackgroundColor"/>
                     <constraints>
                         <constraint firstItem="l5E-hK-DeW" firstAttribute="centerY" secondItem="DPp-n1-uMt" secondAttribute="centerY" id="7xc-EX-u7f"/>
-                        <constraint firstAttribute="height" constant="55" id="SsT-T3-0VD"/>
+                        <constraint firstAttribute="height" constant="58" id="SsT-T3-0VD"/>
                         <constraint firstAttribute="trailing" secondItem="Ecm-Xk-VkC" secondAttribute="trailing" constant="16" id="dea-Hz-qka"/>
                         <constraint firstItem="l5E-hK-DeW" firstAttribute="leading" secondItem="DPp-n1-uMt" secondAttribute="leading" constant="16" id="hZA-Ld-I4x"/>
                         <constraint firstItem="Ecm-Xk-VkC" firstAttribute="centerY" secondItem="DPp-n1-uMt" secondAttribute="centerY" id="uGK-uV-C7w"/>
                     </constraints>
+                    <userDefinedRuntimeAttributes>
+                        <userDefinedRuntimeAttribute type="number" keyPath="cornerRadius">
+                            <real key="value" value="10"/>
+                        </userDefinedRuntimeAttribute>
+                    </userDefinedRuntimeAttributes>
                 </view>
                 <button opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="qJK-yj-z34">
-                    <rect key="frame" x="28" y="816" width="358" height="44"/>
-                    <color key="backgroundColor" red="0.1764705882" green="0.78039215689999997" blue="0.66666666669999997" alpha="1" colorSpace="calibratedRGB"/>
+                    <rect key="frame" x="28" y="806" width="358" height="50"/>
+                    <color key="backgroundColor" red="0.0039215686274509803" green="0.75686274509803919" blue="0.70980392156862748" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
                     <constraints>
-                        <constraint firstAttribute="height" constant="44" id="QoY-dF-gEu"/>
+                        <constraint firstAttribute="height" constant="50" id="QoY-dF-gEu"/>
                     </constraints>
+                    <fontDescription key="fontDescription" type="system" weight="medium" pointSize="18"/>
                     <state key="normal" title="发布"/>
                     <userDefinedRuntimeAttributes>
                         <userDefinedRuntimeAttribute type="number" keyPath="cornerRadius">
-                            <real key="value" value="22"/>
+                            <real key="value" value="25"/>
                         </userDefinedRuntimeAttribute>
                     </userDefinedRuntimeAttributes>
                     <connections>
@@ -61,114 +67,148 @@
                     </connections>
                 </button>
                 <view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="FrK-Ex-Tpw">
-                    <rect key="frame" x="0.0" y="1" width="414" height="137"/>
+                    <rect key="frame" x="13" y="12" width="388" height="109"/>
                     <subviews>
-                        <imageView clipsSubviews="YES" userInteractionEnabled="NO" contentMode="scaleAspectFit" horizontalHuggingPriority="251" verticalHuggingPriority="251" image="accell_left" translatesAutoresizingMaskIntoConstraints="NO" id="Rjv-ht-ibu">
-                            <rect key="frame" x="12" y="22" width="4" height="14"/>
-                        </imageView>
                         <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="标题" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="qAA-M4-xu3">
-                            <rect key="frame" x="21" y="14" width="33" height="30"/>
+                            <rect key="frame" x="40" y="15" width="33" height="22"/>
                             <constraints>
-                                <constraint firstAttribute="height" constant="30" id="c4e-iB-Yll"/>
+                                <constraint firstAttribute="height" constant="22" id="c4e-iB-Yll"/>
                             </constraints>
                             <fontDescription key="fontDescription" type="system" weight="medium" pointSize="16"/>
                             <color key="textColor" red="0.20000000000000001" green="0.20000000000000001" blue="0.20000000000000001" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
                             <nil key="highlightedColor"/>
                         </label>
                         <textView clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="scaleToFill" textAlignment="natural" translatesAutoresizingMaskIntoConstraints="NO" id="K7m-In-fyw">
-                            <rect key="frame" x="21" y="49" width="373" height="83"/>
+                            <rect key="frame" x="12" y="42" width="364" height="62"/>
                             <color key="backgroundColor" systemColor="systemBackgroundColor"/>
-                            <color key="textColor" systemColor="labelColor"/>
-                            <fontDescription key="fontDescription" type="system" pointSize="14"/>
+                            <color key="textColor" red="0.20000000000000001" green="0.20000000000000001" blue="0.20000000000000001" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
+                            <fontDescription key="fontDescription" type="system" pointSize="15"/>
                             <textInputTraits key="textInputTraits" autocapitalizationType="sentences"/>
                         </textView>
-                        <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="请输入(1-25字)" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="6fi-W7-TxF">
-                            <rect key="frame" x="21" y="56" width="116" height="17"/>
+                        <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="请输入标题" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="6fi-W7-TxF">
+                            <rect key="frame" x="12" y="47" width="76.5" height="18"/>
+                            <fontDescription key="fontDescription" type="system" pointSize="15"/>
+                            <color key="textColor" red="0.66666666666666663" green="0.66666666666666663" blue="0.66666666666666663" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
+                            <nil key="highlightedColor"/>
+                        </label>
+                        <imageView clipsSubviews="YES" userInteractionEnabled="NO" contentMode="scaleAspectFit" horizontalHuggingPriority="251" verticalHuggingPriority="251" image="notice_title" translatesAutoresizingMaskIntoConstraints="NO" id="oFy-z4-fIL">
+                            <rect key="frame" x="12" y="16" width="22" height="22"/>
+                        </imageView>
+                        <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="0/25" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="nAS-1X-U1q">
+                            <rect key="frame" x="343" y="16" width="30" height="20"/>
+                            <constraints>
+                                <constraint firstAttribute="height" constant="20" id="AQJ-RG-MWv"/>
+                            </constraints>
                             <fontDescription key="fontDescription" type="system" pointSize="14"/>
-                            <color key="textColor" red="0.40000000000000002" green="0.40000000000000002" blue="0.40000000000000002" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
+                            <color key="textColor" red="0.66666666666666663" green="0.66666666666666663" blue="0.66666666666666663" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
                             <nil key="highlightedColor"/>
                         </label>
                     </subviews>
                     <color key="backgroundColor" systemColor="systemBackgroundColor"/>
                     <constraints>
-                        <constraint firstItem="Rjv-ht-ibu" firstAttribute="leading" secondItem="FrK-Ex-Tpw" secondAttribute="leading" constant="12" id="0mX-JP-7VJ"/>
-                        <constraint firstItem="qAA-M4-xu3" firstAttribute="centerY" secondItem="Rjv-ht-ibu" secondAttribute="centerY" id="1g1-9w-LXn"/>
-                        <constraint firstItem="Rjv-ht-ibu" firstAttribute="top" secondItem="FrK-Ex-Tpw" secondAttribute="top" constant="22" id="94a-ZV-oy3"/>
-                        <constraint firstAttribute="height" constant="137" id="9ZO-7P-kDC"/>
-                        <constraint firstItem="K7m-In-fyw" firstAttribute="leading" secondItem="qAA-M4-xu3" secondAttribute="leading" id="HtV-i1-XGf"/>
+                        <constraint firstItem="qAA-M4-xu3" firstAttribute="top" secondItem="FrK-Ex-Tpw" secondAttribute="top" constant="15" id="0JQ-sa-Lxy"/>
+                        <constraint firstItem="qAA-M4-xu3" firstAttribute="leading" secondItem="oFy-z4-fIL" secondAttribute="trailing" constant="6" id="6eo-RC-pFY"/>
+                        <constraint firstAttribute="height" constant="109" id="9ZO-7P-kDC"/>
+                        <constraint firstAttribute="trailing" secondItem="nAS-1X-U1q" secondAttribute="trailing" constant="15" id="Gko-NB-O89"/>
                         <constraint firstAttribute="bottom" secondItem="K7m-In-fyw" secondAttribute="bottom" constant="5" id="JSe-Yg-8ng"/>
-                        <constraint firstItem="6fi-W7-TxF" firstAttribute="top" secondItem="qAA-M4-xu3" secondAttribute="bottom" constant="12" id="LYv-A0-Ebn"/>
-                        <constraint firstAttribute="trailing" secondItem="K7m-In-fyw" secondAttribute="trailing" constant="20" id="TyF-fg-XNc"/>
-                        <constraint firstItem="6fi-W7-TxF" firstAttribute="leading" secondItem="FrK-Ex-Tpw" secondAttribute="leading" constant="21" id="ZkS-79-BWT"/>
-                        <constraint firstItem="qAA-M4-xu3" firstAttribute="leading" secondItem="Rjv-ht-ibu" secondAttribute="trailing" constant="5" id="axU-mk-Gq8"/>
+                        <constraint firstItem="6fi-W7-TxF" firstAttribute="top" secondItem="qAA-M4-xu3" secondAttribute="bottom" constant="10" id="LYv-A0-Ebn"/>
+                        <constraint firstAttribute="trailing" secondItem="K7m-In-fyw" secondAttribute="trailing" constant="12" id="TyF-fg-XNc"/>
+                        <constraint firstItem="6fi-W7-TxF" firstAttribute="leading" secondItem="FrK-Ex-Tpw" secondAttribute="leading" constant="12" id="ZkS-79-BWT"/>
                         <constraint firstItem="K7m-In-fyw" firstAttribute="top" secondItem="qAA-M4-xu3" secondAttribute="bottom" constant="5" id="diA-O2-FKN"/>
+                        <constraint firstItem="K7m-In-fyw" firstAttribute="leading" secondItem="FrK-Ex-Tpw" secondAttribute="leading" constant="12" id="fy3-x3-HZi"/>
+                        <constraint firstItem="oFy-z4-fIL" firstAttribute="leading" secondItem="FrK-Ex-Tpw" secondAttribute="leading" constant="12" id="jYg-oT-xSt"/>
+                        <constraint firstItem="nAS-1X-U1q" firstAttribute="top" secondItem="FrK-Ex-Tpw" secondAttribute="top" constant="16" id="pq7-dY-Hok"/>
+                        <constraint firstItem="oFy-z4-fIL" firstAttribute="top" secondItem="FrK-Ex-Tpw" secondAttribute="top" constant="16" id="zUT-eW-Rzq"/>
                     </constraints>
+                    <userDefinedRuntimeAttributes>
+                        <userDefinedRuntimeAttribute type="number" keyPath="cornerRadius">
+                            <real key="value" value="10"/>
+                        </userDefinedRuntimeAttribute>
+                    </userDefinedRuntimeAttributes>
                 </view>
                 <view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="pTW-LF-xP7">
-                    <rect key="frame" x="0.0" y="148" width="414" height="201"/>
+                    <rect key="frame" x="13" y="131" width="388" height="277"/>
                     <subviews>
-                        <imageView clipsSubviews="YES" userInteractionEnabled="NO" contentMode="scaleAspectFit" horizontalHuggingPriority="251" verticalHuggingPriority="251" image="accell_left" translatesAutoresizingMaskIntoConstraints="NO" id="hAR-SI-iG1">
-                            <rect key="frame" x="12" y="22" width="4" height="14"/>
-                        </imageView>
                         <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="公告内容" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="l9g-va-J4X">
-                            <rect key="frame" x="21" y="14" width="65.5" height="30"/>
+                            <rect key="frame" x="40" y="15" width="65.5" height="22"/>
                             <constraints>
-                                <constraint firstAttribute="height" constant="30" id="QC3-rJ-0hr"/>
+                                <constraint firstAttribute="height" constant="22" id="QC3-rJ-0hr"/>
                             </constraints>
                             <fontDescription key="fontDescription" type="system" weight="medium" pointSize="16"/>
                             <color key="textColor" red="0.20000000000000001" green="0.20000000000000001" blue="0.20000000000000001" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
                             <nil key="highlightedColor"/>
                         </label>
                         <textView clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="scaleToFill" textAlignment="natural" translatesAutoresizingMaskIntoConstraints="NO" id="iDM-RV-MKu">
-                            <rect key="frame" x="21" y="49" width="373" height="147"/>
+                            <rect key="frame" x="12" y="42" width="364" height="230"/>
                             <color key="backgroundColor" systemColor="systemBackgroundColor"/>
-                            <color key="textColor" systemColor="labelColor"/>
-                            <fontDescription key="fontDescription" type="system" pointSize="14"/>
+                            <color key="textColor" red="0.20000000000000001" green="0.20000000000000001" blue="0.20000000000000001" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
+                            <fontDescription key="fontDescription" type="system" pointSize="15"/>
                             <textInputTraits key="textInputTraits" autocapitalizationType="sentences"/>
                         </textView>
-                        <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="请输入(1-255字)" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="mUd-aN-ASn">
-                            <rect key="frame" x="21" y="56" width="124" height="17"/>
+                        <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="请输入公告内容" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="mUd-aN-ASn">
+                            <rect key="frame" x="12" y="47" width="107.5" height="18"/>
+                            <fontDescription key="fontDescription" type="system" pointSize="15"/>
+                            <color key="textColor" red="0.66666666666666663" green="0.66666666666666663" blue="0.66666666666666663" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
+                            <nil key="highlightedColor"/>
+                        </label>
+                        <imageView clipsSubviews="YES" userInteractionEnabled="NO" contentMode="scaleAspectFit" horizontalHuggingPriority="251" verticalHuggingPriority="251" image="notice_content" translatesAutoresizingMaskIntoConstraints="NO" id="F8D-K6-BVg">
+                            <rect key="frame" x="12" y="15" width="22" height="22"/>
+                        </imageView>
+                        <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="0/200" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="NoL-pI-hfp">
+                            <rect key="frame" x="334.5" y="16" width="38.5" height="20"/>
+                            <constraints>
+                                <constraint firstAttribute="height" constant="20" id="Hch-UE-8w8"/>
+                            </constraints>
                             <fontDescription key="fontDescription" type="system" pointSize="14"/>
-                            <color key="textColor" red="0.40000000000000002" green="0.40000000000000002" blue="0.40000000000000002" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
+                            <color key="textColor" red="0.66666666669999997" green="0.66666666669999997" blue="0.66666666669999997" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
                             <nil key="highlightedColor"/>
                         </label>
                     </subviews>
                     <color key="backgroundColor" systemColor="systemBackgroundColor"/>
                     <constraints>
-                        <constraint firstItem="hAR-SI-iG1" firstAttribute="leading" secondItem="pTW-LF-xP7" secondAttribute="leading" constant="12" id="1zJ-cn-wbb"/>
-                        <constraint firstItem="mUd-aN-ASn" firstAttribute="leading" secondItem="pTW-LF-xP7" secondAttribute="leading" constant="21" id="2KO-48-fEi"/>
-                        <constraint firstAttribute="height" constant="201" id="6gX-5k-vK1"/>
-                        <constraint firstItem="hAR-SI-iG1" firstAttribute="top" secondItem="pTW-LF-xP7" secondAttribute="top" constant="22" id="9hI-OY-i5Y"/>
-                        <constraint firstItem="iDM-RV-MKu" firstAttribute="leading" secondItem="l9g-va-J4X" secondAttribute="leading" id="EYf-TL-G3z"/>
+                        <constraint firstItem="mUd-aN-ASn" firstAttribute="leading" secondItem="pTW-LF-xP7" secondAttribute="leading" constant="12" id="2KO-48-fEi"/>
+                        <constraint firstItem="l9g-va-J4X" firstAttribute="top" secondItem="pTW-LF-xP7" secondAttribute="top" constant="15" id="2cy-Zx-bPJ"/>
+                        <constraint firstItem="iDM-RV-MKu" firstAttribute="leading" secondItem="pTW-LF-xP7" secondAttribute="leading" constant="12" id="3dZ-UH-lPO"/>
+                        <constraint firstAttribute="height" constant="277" id="6gX-5k-vK1"/>
+                        <constraint firstAttribute="trailing" secondItem="NoL-pI-hfp" secondAttribute="trailing" constant="15" id="9Tg-ji-Cl5"/>
+                        <constraint firstItem="F8D-K6-BVg" firstAttribute="leading" secondItem="pTW-LF-xP7" secondAttribute="leading" constant="12" id="A5W-UH-ZQB"/>
                         <constraint firstAttribute="bottom" secondItem="iDM-RV-MKu" secondAttribute="bottom" constant="5" id="FVS-Ae-O1B"/>
-                        <constraint firstItem="mUd-aN-ASn" firstAttribute="top" secondItem="l9g-va-J4X" secondAttribute="bottom" constant="12" id="Gky-Dd-mqM"/>
-                        <constraint firstAttribute="trailing" secondItem="iDM-RV-MKu" secondAttribute="trailing" constant="20" id="Pp3-6C-qct"/>
+                        <constraint firstItem="mUd-aN-ASn" firstAttribute="top" secondItem="l9g-va-J4X" secondAttribute="bottom" constant="10" id="Gky-Dd-mqM"/>
+                        <constraint firstAttribute="trailing" secondItem="iDM-RV-MKu" secondAttribute="trailing" constant="12" id="Pp3-6C-qct"/>
+                        <constraint firstItem="l9g-va-J4X" firstAttribute="leading" secondItem="F8D-K6-BVg" secondAttribute="trailing" constant="6" id="RNc-me-OZc"/>
                         <constraint firstItem="iDM-RV-MKu" firstAttribute="top" secondItem="l9g-va-J4X" secondAttribute="bottom" constant="5" id="S3J-af-rpD"/>
-                        <constraint firstItem="l9g-va-J4X" firstAttribute="leading" secondItem="hAR-SI-iG1" secondAttribute="trailing" constant="5" id="d9H-kI-vOU"/>
-                        <constraint firstItem="l9g-va-J4X" firstAttribute="centerY" secondItem="hAR-SI-iG1" secondAttribute="centerY" id="wWt-Bw-9Sm"/>
+                        <constraint firstItem="NoL-pI-hfp" firstAttribute="top" secondItem="pTW-LF-xP7" secondAttribute="top" constant="16" id="pOn-0V-udr"/>
+                        <constraint firstItem="F8D-K6-BVg" firstAttribute="top" secondItem="pTW-LF-xP7" secondAttribute="top" constant="15" id="uK9-47-brQ"/>
                     </constraints>
+                    <userDefinedRuntimeAttributes>
+                        <userDefinedRuntimeAttribute type="number" keyPath="cornerRadius">
+                            <real key="value" value="10"/>
+                        </userDefinedRuntimeAttribute>
+                    </userDefinedRuntimeAttributes>
                 </view>
             </subviews>
             <color key="backgroundColor" white="0.0" alpha="0.0" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
             <constraints>
-                <constraint firstItem="DPp-n1-uMt" firstAttribute="leading" secondItem="iN0-l3-epB" secondAttribute="leading" id="4lI-aa-WyS"/>
-                <constraint firstAttribute="trailing" secondItem="DPp-n1-uMt" secondAttribute="trailing" id="5bw-LP-fLM"/>
+                <constraint firstItem="DPp-n1-uMt" firstAttribute="leading" secondItem="iN0-l3-epB" secondAttribute="leading" constant="13" id="4lI-aa-WyS"/>
+                <constraint firstAttribute="trailing" secondItem="DPp-n1-uMt" secondAttribute="trailing" constant="13" id="5bw-LP-fLM"/>
                 <constraint firstItem="qJK-yj-z34" firstAttribute="leading" secondItem="iN0-l3-epB" secondAttribute="leading" constant="28" id="DcX-90-XFk"/>
                 <constraint firstAttribute="trailing" secondItem="qJK-yj-z34" secondAttribute="trailing" constant="28" id="HI2-76-aVf"/>
-                <constraint firstItem="FrK-Ex-Tpw" firstAttribute="top" secondItem="iN0-l3-epB" secondAttribute="top" constant="1" id="St1-kh-Q1f"/>
-                <constraint firstAttribute="trailing" secondItem="pTW-LF-xP7" secondAttribute="trailing" id="Xof-wW-i6O"/>
+                <constraint firstItem="FrK-Ex-Tpw" firstAttribute="top" secondItem="iN0-l3-epB" secondAttribute="top" constant="12" id="St1-kh-Q1f"/>
+                <constraint firstAttribute="trailing" secondItem="pTW-LF-xP7" secondAttribute="trailing" constant="13" id="Xof-wW-i6O"/>
                 <constraint firstItem="pTW-LF-xP7" firstAttribute="top" secondItem="FrK-Ex-Tpw" secondAttribute="bottom" constant="10" id="cUt-uD-VUX"/>
-                <constraint firstItem="pTW-LF-xP7" firstAttribute="leading" secondItem="iN0-l3-epB" secondAttribute="leading" id="de9-U3-EV7"/>
-                <constraint firstItem="FrK-Ex-Tpw" firstAttribute="leading" secondItem="iN0-l3-epB" secondAttribute="leading" id="dea-ad-kyo"/>
-                <constraint firstAttribute="trailing" secondItem="FrK-Ex-Tpw" secondAttribute="trailing" id="n4L-Dh-BAv"/>
-                <constraint firstAttribute="bottom" secondItem="qJK-yj-z34" secondAttribute="bottom" constant="36" id="nr4-km-iWf"/>
+                <constraint firstItem="pTW-LF-xP7" firstAttribute="leading" secondItem="iN0-l3-epB" secondAttribute="leading" constant="13" id="de9-U3-EV7"/>
+                <constraint firstItem="FrK-Ex-Tpw" firstAttribute="leading" secondItem="iN0-l3-epB" secondAttribute="leading" constant="13" id="dea-ad-kyo"/>
+                <constraint firstAttribute="trailing" secondItem="FrK-Ex-Tpw" secondAttribute="trailing" constant="13" id="n4L-Dh-BAv"/>
+                <constraint firstAttribute="bottom" secondItem="qJK-yj-z34" secondAttribute="bottom" constant="40" id="nr4-km-iWf"/>
                 <constraint firstItem="DPp-n1-uMt" firstAttribute="top" secondItem="pTW-LF-xP7" secondAttribute="bottom" constant="10" id="x7R-Jc-b7r"/>
             </constraints>
             <freeformSimulatedSizeMetrics key="simulatedDestinationMetrics"/>
             <connections>
                 <outlet property="contentArea" destination="iDM-RV-MKu" id="Lyw-QZ-xlo"/>
+                <outlet property="contentCount" destination="NoL-pI-hfp" id="Dvz-md-ybt"/>
                 <outlet property="focusButton" destination="Ecm-Xk-VkC" id="zyI-lq-qI4"/>
                 <outlet property="tipsLabel" destination="mUd-aN-ASn" id="gkK-oq-60l"/>
+                <outlet property="titleCount" destination="nAS-1X-U1q" id="HkR-aQ-dCa"/>
                 <outlet property="titleView" destination="K7m-In-fyw" id="uN8-N6-TmN"/>
                 <outlet property="topTipsLabel" destination="6fi-W7-TxF" id="9jn-OK-FDO"/>
             </connections>
@@ -176,11 +216,9 @@
         </view>
     </objects>
     <resources>
-        <image name="accell_left" width="4" height="14"/>
+        <image name="notice_content" width="22" height="22"/>
+        <image name="notice_title" width="22" height="22"/>
         <image name="switch_on" width="47" height="24"/>
-        <systemColor name="labelColor">
-            <color white="0.0" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
-        </systemColor>
         <systemColor name="systemBackgroundColor">
             <color white="1" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
         </systemColor>

+ 16 - 16
KulexiuForTeacher/Pods/Pods.xcodeproj/project.pbxproj

@@ -1551,6 +1551,10 @@
 		BC130C3F5186143C94F10D04C0B62B97 /* WhitePptPage.h in Headers */ = {isa = PBXBuildFile; fileRef = 4CCBE080085C4462334D36145124850F /* WhitePptPage.h */; settings = {ATTRIBUTES = (Project, ); }; };
 		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, ); }; };
+		BC2820F12C9183AE008BD2CC /* TXGroupNoticeMessageCell.m in Sources */ = {isa = PBXBuildFile; fileRef = BC2820ED2C9183AD008BD2CC /* TXGroupNoticeMessageCell.m */; };
+		BC2820F22C9183AE008BD2CC /* TXGroupNoticeMessageContentView.h in Headers */ = {isa = PBXBuildFile; fileRef = BC2820EE2C9183AD008BD2CC /* TXGroupNoticeMessageContentView.h */; };
+		BC2820F32C9183AE008BD2CC /* TXGroupNoticeMessageCell.h in Headers */ = {isa = PBXBuildFile; fileRef = BC2820EF2C9183AD008BD2CC /* TXGroupNoticeMessageCell.h */; };
+		BC2820F42C9183AE008BD2CC /* TXGroupNoticeMessageContentView.m in Sources */ = {isa = PBXBuildFile; fileRef = BC2820F02C9183AD008BD2CC /* TXGroupNoticeMessageContentView.m */; };
 		BC3300232BBAC4AA003D4921 /* TXShareLiveCellContentView.h in Headers */ = {isa = PBXBuildFile; fileRef = BC33001B2BBAC4A9003D4921 /* TXShareLiveCellContentView.h */; };
 		BC3300242BBAC4AA003D4921 /* TXChatMusicShareCell.h in Headers */ = {isa = PBXBuildFile; fileRef = BC33001C2BBAC4A9003D4921 /* TXChatMusicShareCell.h */; };
 		BC3300252BBAC4AA003D4921 /* TXShareMusicCellContentView.m in Sources */ = {isa = PBXBuildFile; fileRef = BC33001D2BBAC4A9003D4921 /* TXShareMusicCellContentView.m */; };
@@ -1566,10 +1570,6 @@
 		BC39164671956A06963E783D36DE9AB5 /* QCloudHosts.m in Sources */ = {isa = PBXBuildFile; fileRef = E14515D799B017007060ECA87CA06921 /* QCloudHosts.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; };
 		BC51861B2C913D4800806A8A /* TXGroupNoticeMessage.m in Sources */ = {isa = PBXBuildFile; fileRef = BC5186192C913D4800806A8A /* TXGroupNoticeMessage.m */; };
 		BC51861C2C913D4800806A8A /* TXGroupNoticeMessage.h in Headers */ = {isa = PBXBuildFile; fileRef = BC51861A2C913D4800806A8A /* TXGroupNoticeMessage.h */; };
-		BC5186212C913D5A00806A8A /* TXGroupNoticeMessageCell.m in Sources */ = {isa = PBXBuildFile; fileRef = BC51861D2C913D5A00806A8A /* TXGroupNoticeMessageCell.m */; };
-		BC5186222C913D5A00806A8A /* TXGroupNoticeMessageContentView.m in Sources */ = {isa = PBXBuildFile; fileRef = BC51861E2C913D5A00806A8A /* TXGroupNoticeMessageContentView.m */; };
-		BC5186232C913D5A00806A8A /* TXGroupNoticeMessageContentView.h in Headers */ = {isa = PBXBuildFile; fileRef = BC51861F2C913D5A00806A8A /* TXGroupNoticeMessageContentView.h */; };
-		BC5186242C913D5A00806A8A /* TXGroupNoticeMessageCell.h in Headers */ = {isa = PBXBuildFile; fileRef = BC5186202C913D5A00806A8A /* TXGroupNoticeMessageCell.h */; };
 		BCB13876DAE2BF3E8AC7A539C1A69B6D /* LOTShapeFill.m in Sources */ = {isa = PBXBuildFile; fileRef = B6574B2B98D36024CCCAC387F45C6E4B /* LOTShapeFill.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; };
 		BCCE8FB859A66819765E8033629F3622 /* KS3ListBucketsResponse.h in Headers */ = {isa = PBXBuildFile; fileRef = CA1E2A9BFCDC4456A49F29E716C13955 /* KS3ListBucketsResponse.h */; settings = {ATTRIBUTES = (Project, ); }; };
 		BD10398526C4373DCCCDE772C65A8F5C /* JXCategoryTitleVerticalZoomCell.h in Headers */ = {isa = PBXBuildFile; fileRef = 329557B8F792DDD5250B397045715225 /* JXCategoryTitleVerticalZoomCell.h */; settings = {ATTRIBUTES = (Project, ); }; };
@@ -4264,6 +4264,10 @@
 		BB9B96A93ADE42D7C803A600132B7A77 /* JXCategoryIndicatorTriangleView.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = JXCategoryIndicatorTriangleView.h; path = Sources/Indicator/IndicatorViews/JXCategoryIndicatorTriangleView.h; sourceTree = "<group>"; };
 		BBF07385A53A4D80E635DD91D5F014B6 /* DDASLLogger.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = DDASLLogger.m; path = Sources/CocoaLumberjack/DDASLLogger.m; sourceTree = "<group>"; };
 		BC14B0E21FFBE97C55AC67FBE075CDC6 /* TXLiteAVEncodedDataProcessingListener.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = TXLiteAVEncodedDataProcessingListener.h; path = "TXLiteAVSDK_Professional/TXLiteAVSDK_Professional.xcframework/ios-arm64_armv7/TXLiteAVSDK_Professional.framework/Headers/TXLiteAVEncodedDataProcessingListener.h"; sourceTree = "<group>"; };
+		BC2820ED2C9183AD008BD2CC /* TXGroupNoticeMessageCell.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = TXGroupNoticeMessageCell.m; path = ../../../../mandaya_ios/ManageDaya/Pods/TUIChat/TXGroupNoticeMessageCell.m; sourceTree = "<group>"; };
+		BC2820EE2C9183AD008BD2CC /* TXGroupNoticeMessageContentView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = TXGroupNoticeMessageContentView.h; path = ../../../../mandaya_ios/ManageDaya/Pods/TUIChat/TXGroupNoticeMessageContentView.h; sourceTree = "<group>"; };
+		BC2820EF2C9183AD008BD2CC /* TXGroupNoticeMessageCell.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = TXGroupNoticeMessageCell.h; path = ../../../../mandaya_ios/ManageDaya/Pods/TUIChat/TXGroupNoticeMessageCell.h; sourceTree = "<group>"; };
+		BC2820F02C9183AD008BD2CC /* TXGroupNoticeMessageContentView.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = TXGroupNoticeMessageContentView.m; path = ../../../../mandaya_ios/ManageDaya/Pods/TUIChat/TXGroupNoticeMessageContentView.m; sourceTree = "<group>"; };
 		BC33001B2BBAC4A9003D4921 /* TXShareLiveCellContentView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = TXShareLiveCellContentView.h; sourceTree = "<group>"; };
 		BC33001C2BBAC4A9003D4921 /* TXChatMusicShareCell.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = TXChatMusicShareCell.h; sourceTree = "<group>"; };
 		BC33001D2BBAC4A9003D4921 /* TXShareMusicCellContentView.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = TXShareMusicCellContentView.m; sourceTree = "<group>"; };
@@ -4279,10 +4283,6 @@
 		BC4BAB8D9E95606E485D6C4CD4ABF75E /* LOTValueCallback.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = LOTValueCallback.h; path = "lottie-ios/Classes/PublicHeaders/LOTValueCallback.h"; sourceTree = "<group>"; };
 		BC5186192C913D4800806A8A /* TXGroupNoticeMessage.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = TXGroupNoticeMessage.m; sourceTree = "<group>"; };
 		BC51861A2C913D4800806A8A /* TXGroupNoticeMessage.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = TXGroupNoticeMessage.h; sourceTree = "<group>"; };
-		BC51861D2C913D5A00806A8A /* TXGroupNoticeMessageCell.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = TXGroupNoticeMessageCell.m; sourceTree = "<group>"; };
-		BC51861E2C913D5A00806A8A /* TXGroupNoticeMessageContentView.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = TXGroupNoticeMessageContentView.m; sourceTree = "<group>"; };
-		BC51861F2C913D5A00806A8A /* TXGroupNoticeMessageContentView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = TXGroupNoticeMessageContentView.h; sourceTree = "<group>"; };
-		BC5186202C913D5A00806A8A /* TXGroupNoticeMessageCell.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = TXGroupNoticeMessageCell.h; sourceTree = "<group>"; };
 		BC5F8D238EFC359C796EAE4F05DB931B /* MJRefreshAutoNormalFooter.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MJRefreshAutoNormalFooter.h; path = MJRefresh/Custom/Footer/Auto/MJRefreshAutoNormalFooter.h; sourceTree = "<group>"; };
 		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>"; };
@@ -7602,10 +7602,10 @@
 				BC3300222BBAC4AA003D4921 /* TXShareLiveCellContentView.m */,
 				BC3300202BBAC4A9003D4921 /* TXShareMusicCellContentView.h */,
 				BC33001D2BBAC4A9003D4921 /* TXShareMusicCellContentView.m */,
-				BC5186202C913D5A00806A8A /* TXGroupNoticeMessageCell.h */,
-				BC51861D2C913D5A00806A8A /* TXGroupNoticeMessageCell.m */,
-				BC51861F2C913D5A00806A8A /* TXGroupNoticeMessageContentView.h */,
-				BC51861E2C913D5A00806A8A /* TXGroupNoticeMessageContentView.m */,
+				BC2820EF2C9183AD008BD2CC /* TXGroupNoticeMessageCell.h */,
+				BC2820ED2C9183AD008BD2CC /* TXGroupNoticeMessageCell.m */,
+				BC2820EE2C9183AD008BD2CC /* TXGroupNoticeMessageContentView.h */,
+				BC2820F02C9183AD008BD2CC /* TXGroupNoticeMessageContentView.m */,
 			);
 			name = Custom;
 			sourceTree = "<group>";
@@ -9805,7 +9805,6 @@
 				325633F4BD4954346E5D03E1AAE2BBDD /* dec_if.h in Headers */,
 				86C43A14370A23B5DF9295C83FD4E0EF /* EMVoiceConverter.h in Headers */,
 				52A831BC6F5B3081AB25A963D1F6C625 /* if_rom.h in Headers */,
-				BC5186242C913D5A00806A8A /* TXGroupNoticeMessageCell.h in Headers */,
 				170A0254BA38D37B93B502F6DB3D325C /* interf_dec.h in Headers */,
 				9635CE9E20DEA2E742D787D3453CB83E /* interf_enc.h in Headers */,
 				BC3300312BBAC4C7003D4921 /* TXChatMusicMessage.h in Headers */,
@@ -9849,6 +9848,7 @@
 				C66D5A452151BE6CE182FBA9D7CF803D /* TUIChatService.h in Headers */,
 				CE3C397E5C4E6E70BAAAEB4B3585F84B /* TUIChatSmallTongueView.h in Headers */,
 				268F4B932FC7D6CA019062E457586EC0 /* TUICircleLodingView.h in Headers */,
+				BC2820F32C9183AE008BD2CC /* TXGroupNoticeMessageCell.h in Headers */,
 				97820505B7D31046ADA2C4DC75D694FE /* TUICloudCustomDataTypeCenter.h in Headers */,
 				843EF43EAF652BDC324BB460589DAEAE /* TUIEmojiCell.h in Headers */,
 				E0E6A06DBCBE5F2DA3C96F683AED38B3 /* TUIEmojiCellData.h in Headers */,
@@ -9859,10 +9859,10 @@
 				9179EC3688C0362596AFFEAD0B252B31 /* TUIFaceView.h in Headers */,
 				DC710BA9EB6AB429ED93A7266220AD08 /* TUIFileMessageCell.h in Headers */,
 				3A0B27785A3D9643F334EE0C628A789B /* TUIFileMessageCellData.h in Headers */,
-				BC5186232C913D5A00806A8A /* TXGroupNoticeMessageContentView.h in Headers */,
 				281E437B671AE7A98367099C8C1BDBB1 /* TUIFileReplyQuoteView.h in Headers */,
 				BC3300232BBAC4AA003D4921 /* TXShareLiveCellContentView.h in Headers */,
 				65E72E78B6193CC7300F7B4BD53FC93A /* TUIFileReplyQuoteViewData.h in Headers */,
+				BC2820F22C9183AE008BD2CC /* TXGroupNoticeMessageContentView.h in Headers */,
 				A31ACDB8827375D55C8BE13257DB96D5 /* TUIFileViewController.h in Headers */,
 				8EB019580FE70CB5D50A5A748045F6D1 /* TUIGroupChatViewController.h in Headers */,
 				EE748E5FF08AAA481264E34D9EF90FFB /* TUIGroupCreatedCell.h in Headers */,
@@ -12156,7 +12156,6 @@
 				2CA4D83BA56B6268FA4719D5ACBA735D /* TUIAIDenoiseSignatureManager.m in Sources */,
 				0B986249F4E96093B8BF0790E4D5549F /* TUIAudioRecorder.m in Sources */,
 				97DD31D3F9E8CDD69FC386EFB1B57C77 /* TUIBaseChatViewController.m in Sources */,
-				BC5186212C913D5A00806A8A /* TXGroupNoticeMessageCell.m in Sources */,
 				7C1FB86B4FBCD60EFEEEB60B30C1A1B4 /* TUIBaseMessageController.m in Sources */,
 				4971C450A45962B4ADB5D7ADC526506C /* TUIC2CChatViewController.m in Sources */,
 				103CF0A869629AABF3FEF222687A2322 /* TUICameraManager.m in Sources */,
@@ -12201,6 +12200,7 @@
 				941C28A8B451D2EDF058FF9907928CF7 /* TUIFileReplyQuoteView.m in Sources */,
 				B13D2A910B4DD46EFE2DE0A785567A2D /* TUIFileReplyQuoteViewData.m in Sources */,
 				BC33002A2BBAC4AA003D4921 /* TXShareLiveCellContentView.m in Sources */,
+				BC2820F42C9183AE008BD2CC /* TXGroupNoticeMessageContentView.m in Sources */,
 				D4C7E936C1AAA094DA16F4A4575181B8 /* TUIFileViewController.m in Sources */,
 				787BD77E1A916AA51362C3026F5A66E9 /* TUIGroupChatViewController.m in Sources */,
 				7FECB331BEA63553BA9DCCD69FE4A38E /* TUIGroupCreatedCell.m in Sources */,
@@ -12210,12 +12210,12 @@
 				926A3D04542EB0F353D851DA98F1C740 /* TUIImageCollectionCell.m in Sources */,
 				BC33002F2BBAC4C7003D4921 /* TXChatMusicMessage.m in Sources */,
 				5117C3511DFFD59BB261CB80771D0D04 /* TUIImageMessageCell.m in Sources */,
+				BC2820F12C9183AE008BD2CC /* TXGroupNoticeMessageCell.m in Sources */,
 				99B0DB871DB5AF6C96C2A68B2AA40D23 /* TUIImageMessageCellData.m in Sources */,
 				E11CD385184927AB722B3AE4ED5B3A01 /* TUIImageReplyQuoteView.m in Sources */,
 				195DCBAEA060DE4AFC096310D0D4BF77 /* TUIImageReplyQuoteViewData.m in Sources */,
 				D03740F96296877941183CA683A3520A /* TUIInputBar.m in Sources */,
 				2DE6EFC6954664571E24274735B35E1B /* TUIInputController.m in Sources */,
-				BC5186222C913D5A00806A8A /* TXGroupNoticeMessageContentView.m in Sources */,
 				4CA0B1AE608069E7042DDF6C00B4CCC5 /* TUIInputMoreCell.m in Sources */,
 				CDB24D6E39F18ACAA7E3E319CF5C1C95 /* TUIInputMoreCellData.m in Sources */,
 				108EF93ECFD8F51E6E46CCB93CE543DA /* TUIJoinGroupMessageCell.m in Sources */,