RDSTabbarController.m 8.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254
  1. //
  2. // RDSTabbarController.m
  3. // HealthPot
  4. //
  5. // Created by Rayson on 2019/7/10.
  6. // Copyright © 2019 RDIOT. All rights reserved.
  7. //
  8. #import "RDSTabbarController.h"
  9. #import "UIImage+Extension.h"
  10. #import "RDSHomeVC.h"
  11. #import "RDSRoomVC.h"
  12. #import "YXSceneViewController.h"
  13. #import "YXFindViewController.h"
  14. #import "RDSMyVC.h"
  15. #import "YXMyViewController.h"
  16. #import "RDSResetDeviceVC.h"
  17. #import "RDSAddView.h"
  18. #import "SPAlertController.h"
  19. #import "PopView.h"
  20. #define TabBarVC @"vc" //--tabbar对应的视图控制器
  21. #define TabBarTitle @"title" //--tabbar标题
  22. #define TabBarImage @"image" //--未选中时tabbar的图片
  23. #define TabBarSelectedImage @"selectedImage" //--选中时tabbar的图片
  24. #define TabBarItemBadgeValue @"badgeValue" //--未读个数
  25. #define TabBarCount 4 //--tabbarItem的个数
  26. typedef NS_ENUM(NSInteger,RDSTabType) {
  27. // --这里的顺序,决定了 tabbar 从左到右item的显示顺序
  28. RDSTabTypeHome, // 首页
  29. RDSTabTypeScene, // 场景
  30. RDSTabTypeFind, // 发现
  31. RDSTabTypeMine, // 我的
  32. };
  33. @interface RDSTabbarController ()
  34. @property (nonatomic, strong) NSDictionary *configs;
  35. @property (nonatomic, strong) RDSHomeVC *homeVC;
  36. @property (nonatomic, strong) YXSceneViewController *sceneVC;
  37. @property (nonatomic, strong) YXFindViewController *findVC;
  38. @property (nonatomic, strong) YXMyViewController *myVC;
  39. @property (nonatomic, strong) RDSAddView *addView;
  40. @property (nonatomic, assign) int curIndex;// 记录当前tabbar item 下标,用于push添加房间页面
  41. @end
  42. @implementation RDSTabbarController
  43. - (void)viewDidLoad {
  44. [super viewDidLoad];
  45. // Do any additional setup after loading the view.
  46. // 取出tabbar顶部分割线
  47. if (@available(iOS 13.0, *)) {
  48. UITabBarAppearance *appearance = [UITabBarAppearance new];
  49. [appearance configureWithOpaqueBackground];
  50. UIColor *color = [UIColor whiteColor];
  51. appearance.shadowImage = [UIImage rds_imageWithColor:color];
  52. appearance.backgroundColor = color;
  53. self.tabBar.standardAppearance = appearance;
  54. /// 这里有点区别。导航栏是iOS13开始。这里是iOS15才有的
  55. if (@available(iOS 15.0, *)) {
  56. self.tabBar.scrollEdgeAppearance = self.tabBar.standardAppearance;
  57. }
  58. }
  59. [self setUpSubNav];
  60. // 中间+加号按钮
  61. // [self addMidButton];
  62. }
  63. - (NSArray*)tabbars{
  64. NSMutableArray *items = [[NSMutableArray alloc] init];
  65. for (NSInteger tabbar = 0; tabbar < TabBarCount; tabbar++) {
  66. [items addObject:@(tabbar)];
  67. }
  68. return items;
  69. }
  70. - (void)setUpSubNav {
  71. NSMutableArray *vcArray = [[NSMutableArray alloc] init];
  72. [self.tabbars enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) {
  73. NSNumber *tabbar = obj;
  74. NSDictionary * item =[self vcInfoForTabType:[tabbar integerValue]];
  75. NSString *vcName = item[TabBarVC];
  76. NSString *title = item[TabBarTitle];
  77. NSString *imageName = item[TabBarImage];
  78. NSString *imageSelected = item[TabBarSelectedImage];
  79. Class clazz = NSClassFromString(vcName);
  80. UIViewController *vc = [[clazz alloc] init];
  81. if ([vc isKindOfClass:[RDSHomeVC class]]) {
  82. self.homeVC = (RDSHomeVC *)vc;
  83. }
  84. else if ([vc isKindOfClass:[YXSceneViewController class]]){
  85. self.sceneVC = (YXSceneViewController *)vc;
  86. }
  87. else if ([vc isKindOfClass:[YXFindViewController class]]){
  88. self.findVC = (YXFindViewController *)vc;
  89. }
  90. else if ([vc isKindOfClass:[YXMyViewController class]]){
  91. self.myVC = (YXMyViewController *)vc;
  92. }
  93. vc.hidesBottomBarWhenPushed = NO;
  94. RDSNavController *nav = [[RDSNavController alloc] initWithRootViewController:vc];
  95. nav.tabBarItem = [[UITabBarItem alloc] initWithTitle:title
  96. image:[[UIImage imageNamed:imageName] imageWithRenderingMode:UIImageRenderingModeAlwaysOriginal]
  97. selectedImage:[[UIImage imageNamed:imageSelected] imageWithRenderingMode:UIImageRenderingModeAlwaysOriginal]];
  98. // 设置TabBar上 字体颜色
  99. self.tabBar.tintColor = RGB(51, 51, 51);
  100. nav.tabBarItem.tag = idx;
  101. NSInteger badge = [item[TabBarItemBadgeValue] integerValue];
  102. if (badge) {
  103. nav.tabBarItem.badgeValue = [NSString stringWithFormat:@"%zd",badge];
  104. }
  105. // 隐藏中间按钮 和发现页面
  106. // if(idx == 2){
  107. // nav.tabBarItem.enabled = NO;
  108. // }
  109. [vcArray addObject:nav];
  110. }];
  111. self.viewControllers = [NSArray arrayWithArray:vcArray];
  112. }
  113. // 中间按钮
  114. -(void)addMidButton{
  115. dispatch_async(dispatch_get_main_queue(), ^{
  116. CGFloat height = 60;//self.tabBar.frame.size.height - [UIApplication sharedApplication].keyWindow.safeAreaInsets.bottom;
  117. UIButton * shot = [[UIButton alloc] initWithFrame:CGRectMake((self.tabBar.frame.size.width - height)*0.5, -5, height, height)];
  118. [shot addTarget:self action:@selector(showMidBtn:) forControlEvents:UIControlEventTouchUpInside];
  119. [shot setBackgroundImage:[UIImage imageNamed:@"icon_tab_add_sel"] forState:UIControlStateNormal];
  120. shot.layer.cornerRadius = height * 0.5;
  121. [self.tabBar addSubview:shot];
  122. });
  123. }
  124. - (void)tabBar:(UITabBar *)tabBar didSelectItem:(UITabBarItem *)item{
  125. // if (item.tag != 2) {
  126. // [self hiddenAddView];
  127. // }
  128. _curIndex = (int)item.tag;
  129. }
  130. // 显示添加房间、场景按钮
  131. - (void)showMidBtn:(UIButton *)sender{
  132. if(self.addView.isHidden){
  133. self.addView.hidden = NO;
  134. // 渐变动画
  135. [UIView animateWithDuration:0.2 animations:^{
  136. self.addView.alpha = 1;
  137. }];
  138. }
  139. }
  140. - (void)hiddenAddView{
  141. if(!self.addView.isHidden){
  142. // 渐变动画
  143. [UIView animateWithDuration:0.2 animations:^{
  144. self.addView.alpha = 0;
  145. } completion:^(BOOL finished) {
  146. self.addView.hidden = YES;
  147. }];
  148. }
  149. }
  150. - (RDSAddView *)addView{
  151. if(_addView == nil){
  152. CGFloat heihgt = SCREEN_HEIGHT-self.tabBar.rds_height;
  153. _addView = [RDSAddView rds_loadViewFromNib];
  154. _addView.frame = CGRectMake(0, 0, SCREEN_WIDTH, heihgt);
  155. _addView.alpha = 0;
  156. _addView.hidden = YES;
  157. [[UIApplication sharedApplication].windows.firstObject addSubview:_addView];
  158. RDS_WEAKSELF(weakSelf)
  159. _addView.onHideBtnClick = ^{
  160. [weakSelf hiddenAddView];
  161. };
  162. _addView.onRoomBtnClick = ^{
  163. [weakSelf hiddenAddView];
  164. RDSResetDeviceVC *vc = [[RDSResetDeviceVC alloc] init];
  165. vc.hidesBottomBarWhenPushed = YES;
  166. [weakSelf.viewControllers[weakSelf.curIndex] pushViewController:vc animated:YES];
  167. };
  168. }
  169. return _addView;
  170. }
  171. #pragma mark - VC
  172. - (NSDictionary *)vcInfoForTabType:(RDSTabType)type{
  173. if (_configs == nil)
  174. {
  175. _configs = @{
  176. @(RDSTabTypeHome) : @{
  177. TabBarVC : @"RDSHomeVC",
  178. TabBarTitle : @"首页",
  179. TabBarImage : @"tabbar_home_unsel",
  180. TabBarSelectedImage: @"tabbar_home_sel",
  181. TabBarItemBadgeValue: @(0)
  182. },
  183. @(RDSTabTypeScene): @{
  184. TabBarVC : @"YXSceneViewController",
  185. TabBarTitle : @"场景",
  186. TabBarImage : @"tabbar_scene_unsel",
  187. TabBarSelectedImage: @"tabbar_scene_sel",
  188. TabBarItemBadgeValue: @(0)
  189. },
  190. @(RDSTabTypeFind): @{
  191. TabBarVC : @"YXFindViewController",
  192. TabBarTitle : @"发现",
  193. TabBarImage : @"tabbar_find_unsel",
  194. TabBarSelectedImage: @"tabbar_find_sel",
  195. TabBarItemBadgeValue: @(0)
  196. },
  197. @(RDSTabTypeMine) : @{
  198. TabBarVC : @"YXMyViewController",
  199. TabBarTitle : @"我的",
  200. TabBarImage : @"tabbar_mine_unsel",
  201. TabBarSelectedImage: @"tabbar_mine_sel",
  202. TabBarItemBadgeValue: @(0)
  203. }
  204. };
  205. }
  206. return _configs[@(type)];
  207. }
  208. @end