ChatViewController.m 7.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217
  1. //
  2. // ChatViewController.m
  3. // KulexiuForTeacher
  4. //
  5. // Created by Kyle on 2022/3/17.
  6. //
  7. #import "ChatViewController.h"
  8. #import "ChatNavView.h"
  9. #import "CreateFansGroupViewController.h"
  10. #import "ChatAddressViewController.h"
  11. #import "KSChatListViewController.h"
  12. #import "KSTabBarViewController.h"
  13. @interface ChatViewController ()<JXCategoryViewDelegate>
  14. @property (nonatomic, strong) ChatNavView *navView;
  15. @property (nonatomic, strong) JXCategoryTitleView *myCategoryView;
  16. @property (nonatomic, assign) NSInteger currentIndex;
  17. @property (nonatomic, strong) KSChatListViewController *chatListCtrl;
  18. @end
  19. @implementation ChatViewController
  20. - (void)viewDidLoad {
  21. [super viewDidLoad];
  22. // Do any additional setup after loading the view.
  23. self.ks_prefersNavigationBarHidden = YES;
  24. self.titles = @[@"聊天", @"联系人"];
  25. [self configUI];
  26. [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(refreshChatList) name:CHATVIEW_REFRESH object:nil];
  27. }
  28. - (void)refreshChatList {
  29. if (self.chatListCtrl) {
  30. [self.chatListCtrl refreshChatListMessage];
  31. }
  32. }
  33. - (void)configUI {
  34. [self.scrollView removeFromSuperview];
  35. [self.view addSubview:self.navView];
  36. CGFloat topSpace = kNaviBarHeight;
  37. self.myCategoryView.frame = CGRectMake(0, topSpace, KPortraitWidth, 10);
  38. self.myCategoryView.backgroundColor = HexRGB(0xf6f8f9);
  39. self.myCategoryView.titles = self.titles;
  40. self.myCategoryView.titleFont = [UIFont systemFontOfSize:16.0f];
  41. self.myCategoryView.titleSelectedFont = [UIFont systemFontOfSize:16.0f weight:UIFontWeightMedium];
  42. self.myCategoryView.titleSelectedColor = THEMECOLOR;
  43. self.myCategoryView.titleColor = HexRGB(0x777777);
  44. self.myCategoryView.titleColorGradientEnabled = YES;
  45. self.myCategoryView.hidden = YES;
  46. [self.view addSubview:self.categoryView];
  47. [self.view addSubview:self.listContainerView];
  48. }
  49. - (void)viewDidLayoutSubviews {
  50. [super viewDidLayoutSubviews];
  51. CGFloat topSpace = kNaviBarHeight;
  52. self.categoryView.frame = CGRectMake(0, topSpace, self.view.bounds.size.width, [self preferredCategoryViewHeight]);
  53. self.listContainerView.frame = CGRectMake(0, topSpace + [self preferredCategoryViewHeight], self.view.bounds.size.width, self.view.bounds.size.height - topSpace - [self preferredCategoryViewHeight]);
  54. }
  55. - (void)viewDidAppear:(BOOL)animated {
  56. [super viewDidAppear:animated];
  57. [UIApplication sharedApplication].statusBarStyle = UIStatusBarStyleLightContent;
  58. // 处于第一个item的时候,才允许屏幕边缘手势返回
  59. self.navigationController.interactivePopGestureRecognizer.enabled = (self.categoryView.selectedIndex == 0);
  60. }
  61. - (void)scrollToFirstPage {
  62. [self.myCategoryView selectItemAtIndex:0];
  63. }
  64. - (void)viewWillDisappear:(BOOL)animated {
  65. [super viewWillDisappear:animated];
  66. // 离开页面的时候,需要恢复屏幕边缘手势,不能影响其他页面
  67. self.navigationController.interactivePopGestureRecognizer.enabled = YES;
  68. }
  69. - (JXCategoryTitleView *)myCategoryView {
  70. return (JXCategoryTitleView *)self.categoryView;
  71. }
  72. - (CGFloat)preferredCategoryViewHeight {
  73. return CGFLOAT_MIN;
  74. }
  75. - (JXCategoryBaseView *)preferredCategoryView {
  76. return [[JXCategoryTitleView alloc] init];
  77. }
  78. #pragma mark - JXCategoryViewDelegate
  79. // 点击选中或者滚动选中都会调用该方法。适用于只关心选中事件,不关心具体是点击还是滚动选中的。
  80. - (void)categoryView:(JXCategoryBaseView *)categoryView didSelectedItemAtIndex:(NSInteger)index {
  81. NSLog(@"%@", NSStringFromSelector(_cmd));
  82. bool scrollChatTable = index == 0 ? YES : NO;
  83. [self.navView scrollChatTable:scrollChatTable];
  84. // 侧滑手势处理
  85. self.navigationController.interactivePopGestureRecognizer.enabled = (index == 0);
  86. }
  87. #pragma mark - JXCategoryListContainerViewDelegate
  88. - (id<JXCategoryListContentViewDelegate>)listContainerView:(JXCategoryListContainerView *)listContainerView initListForIndex:(NSInteger)index {
  89. if (index == 0) {
  90. KSChatListViewController *listVC = [[KSChatListViewController alloc] init];
  91. listVC.view.frame = CGRectMake(0, 0, KPortraitWidth, KPortraitHeight - kNaviBarHeight - kTabBarHeight);
  92. self.chatListCtrl = listVC;
  93. return listVC;
  94. }
  95. else {
  96. ChatAddressViewController *list = [[ChatAddressViewController alloc] init];
  97. list.titles = @[@"联系人",@"群组"];
  98. return list;
  99. }
  100. }
  101. // 返回列表的数量
  102. - (NSInteger)numberOfListsInlistContainerView:(JXCategoryListContainerView *)listContainerView {
  103. return self.titles.count;
  104. }
  105. #pragma mark - JXCategoryListContainerViewDelegate
  106. - (void)listContainerViewDidScroll:(UIScrollView *)scrollView{
  107. if ([self isKindOfClass:[ChatAddressViewController class]]) {
  108. CGFloat index = scrollView.contentOffset.x/scrollView.bounds.size.width;
  109. CGFloat absIndex = fabs(index - self.currentIndex);
  110. if (absIndex >= 1) {
  111. //”快速滑动的时候,只响应最外层VC持有的scrollView“,说实话,完全可以不用处理这种情况。如果你们的产品经理坚持认为这是个问题,就把这块代码加上吧。
  112. //嵌套使用的时候,最外层的VC持有的scrollView在翻页之后,就断掉一次手势。解决快速滑动的时候,只响应最外层VC持有的scrollView。子VC持有的scrollView却没有响应
  113. self.listContainerView.scrollView.panGestureRecognizer.enabled = NO;
  114. self.listContainerView.scrollView.panGestureRecognizer.enabled = YES;
  115. _currentIndex = floor(index);
  116. }
  117. }
  118. }
  119. - (ChatNavView *)navView {
  120. if (!_navView) {
  121. _navView = [ChatNavView shareInstance];
  122. _navView.frame = CGRectMake(0, 0, KPortraitWidth, kNaviBarHeight);
  123. MJWeakSelf;
  124. [_navView chatNavAction:^(CHATNAVACTION action) {
  125. [weakSelf navAction:action];
  126. }];
  127. }
  128. return _navView;
  129. }
  130. - (void)navAction:(CHATNAVACTION)action {
  131. switch (action) {
  132. case CHATNAVACTION_LIST:
  133. {
  134. [self.categoryView selectItemAtIndex:0];
  135. }
  136. break;
  137. case CHATNAVACTION_CONTACTS:
  138. {
  139. [self.categoryView selectItemAtIndex:1];
  140. }
  141. break;
  142. case CHATNAVACTION_CREATE:
  143. {
  144. CreateFansGroupViewController *ctrl = [[CreateFansGroupViewController alloc] init];
  145. [self.navigationController pushViewController:ctrl animated:YES];
  146. }
  147. break;
  148. default:
  149. break;
  150. }
  151. }
  152. #pragma mark - Custom Accessors
  153. // 分页菜单视图
  154. - (JXCategoryBaseView *)categoryView {
  155. if (!_categoryView) {
  156. _categoryView = [self preferredCategoryView];
  157. _categoryView.delegate = self;
  158. // !!!: 将列表容器视图关联到 categoryView
  159. _categoryView.listContainer = self.listContainerView;
  160. }
  161. return _categoryView;
  162. }
  163. // 列表容器视图
  164. - (JXCategoryListContainerView *)listContainerView {
  165. if (!_listContainerView) {
  166. _listContainerView = [[JXCategoryListContainerView alloc] initWithType:JXCategoryListContainerType_ScrollView delegate:self];
  167. _listContainerView.scrollView.scrollEnabled = NO;
  168. }
  169. return _listContainerView;
  170. }
  171. /*
  172. #pragma mark - Navigation
  173. // In a storyboard-based application, you will often want to do a little preparation before navigation
  174. - (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender {
  175. // Get the new view controller using [segue destinationViewController].
  176. // Pass the selected object to the new view controller.
  177. }
  178. */
  179. @end