RDSTabbarController.m 9.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260
  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 "RDSFindVC.h"
  13. #import "RDSMyVC.h"
  14. #import "RDSResetDeviceVC.h"
  15. #import "RDSAddView.h"
  16. #import "SPAlertController.h"
  17. #import "PopView.h"
  18. #define TabBarVC @"vc" //--tabbar对应的视图控制器
  19. #define TabBarTitle @"title" //--tabbar标题
  20. #define TabBarImage @"image" //--未选中时tabbar的图片
  21. #define TabBarSelectedImage @"selectedImage" //--选中时tabbar的图片
  22. #define TabBarItemBadgeValue @"badgeValue" //--未读个数
  23. #define TabBarCount 4 //--tabbarItem的个数
  24. typedef NS_ENUM(NSInteger,RDSTabType) {
  25. // --这里的顺序,决定了 tabbar 从左到右item的显示顺序
  26. RDSTabTypeHome, // 首页
  27. RDSTabTypeRoom, // 房间
  28. //RDSTabTypeAdd, // 添加(只作占位用)
  29. RDSTabTypeFind, // 资讯
  30. RDSTabTypeMy, // 设置
  31. };
  32. @interface RDSTabbarController ()
  33. @property (nonatomic, strong) NSDictionary *configs;
  34. @property (nonatomic, strong) RDSHomeVC *homeVC;
  35. @property (nonatomic, strong) RDSRoomVC *roomVC;
  36. @property (nonatomic, strong) RDSFindVC *findVC;
  37. @property (nonatomic, strong) RDSMyVC *myVC;
  38. @property (nonatomic, strong) RDSAddView *addView;
  39. @property (nonatomic, assign) int curIndex;// 记录当前tabbar item 下标,用于push添加房间页面
  40. @end
  41. @implementation RDSTabbarController
  42. - (void)viewDidLoad {
  43. [super viewDidLoad];
  44. // Do any additional setup after loading the view.
  45. // 取出tabbar顶部分割线
  46. if (@available(iOS 13.0, *)) {
  47. UITabBarAppearance *appearance = [UITabBarAppearance new];
  48. [appearance configureWithOpaqueBackground];
  49. UIColor *color = [UIColor whiteColor];
  50. appearance.shadowImage = [UIImage rds_imageWithColor:color];
  51. appearance.backgroundColor = color;
  52. self.tabBar.standardAppearance = appearance;
  53. /// 这里有点区别。导航栏是iOS13开始。这里是iOS15才有的
  54. if (@available(iOS 15.0, *)) {
  55. self.tabBar.scrollEdgeAppearance = self.tabBar.standardAppearance;
  56. }
  57. }
  58. [self setUpSubNav];
  59. // 中间+加号按钮
  60. // [self addMidButton];
  61. }
  62. - (NSArray*)tabbars{
  63. NSMutableArray *items = [[NSMutableArray alloc] init];
  64. for (NSInteger tabbar = 0; tabbar < TabBarCount; tabbar++) {
  65. [items addObject:@(tabbar)];
  66. }
  67. return items;
  68. }
  69. - (void)setUpSubNav {
  70. NSMutableArray *vcArray = [[NSMutableArray alloc] init];
  71. [self.tabbars enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) {
  72. NSNumber *tabbar = obj;
  73. NSDictionary * item =[self vcInfoForTabType:[tabbar integerValue]];
  74. NSString *vcName = item[TabBarVC];
  75. NSString *title = item[TabBarTitle];
  76. NSString *imageName = item[TabBarImage];
  77. NSString *imageSelected = item[TabBarSelectedImage];
  78. Class clazz = NSClassFromString(vcName);
  79. UIViewController *vc = [[clazz alloc] init];
  80. if ([vc isKindOfClass:[RDSHomeVC class]]) {
  81. self.homeVC = (RDSHomeVC *)vc;
  82. }
  83. else if ([vc isKindOfClass:[RDSRoomVC class]]){
  84. self.roomVC = (RDSRoomVC *)vc;
  85. }
  86. else if ([vc isKindOfClass:[RDSFindVC class]]){
  87. self.findVC = (RDSFindVC *)vc;
  88. }
  89. else if ([vc isKindOfClass:[RDSMyVC class]]){
  90. self.myVC = (RDSMyVC *)vc;
  91. }
  92. vc.hidesBottomBarWhenPushed = NO;
  93. RDSNavController *nav = [[RDSNavController alloc] initWithRootViewController:vc];
  94. nav.tabBarItem = [[UITabBarItem alloc] initWithTitle:title
  95. image:[[UIImage imageNamed:imageName] imageWithRenderingMode:UIImageRenderingModeAlwaysOriginal]
  96. selectedImage:[[UIImage imageNamed:imageSelected] imageWithRenderingMode:UIImageRenderingModeAlwaysOriginal]];
  97. // 设置TabBar上 字体颜色
  98. self.tabBar.tintColor = RGB(51, 51, 51);
  99. nav.tabBarItem.tag = idx;
  100. NSInteger badge = [item[TabBarItemBadgeValue] integerValue];
  101. if (badge) {
  102. nav.tabBarItem.badgeValue = [NSString stringWithFormat:@"%zd",badge];
  103. }
  104. // 隐藏中间按钮 和发现页面
  105. // if(idx == 2){
  106. // nav.tabBarItem.enabled = NO;
  107. // }
  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 : @"icon_tab_home",
  180. TabBarSelectedImage: @"icon_tab_home_sel",
  181. TabBarItemBadgeValue: @(0)
  182. },
  183. @(RDSTabTypeRoom): @{
  184. TabBarVC : @"RDSRoomVC",
  185. TabBarTitle : @"房间",
  186. TabBarImage : @"icon_tab_room",
  187. TabBarSelectedImage: @"icon_tab_room_sel",
  188. TabBarItemBadgeValue: @(0)
  189. },
  190. // @(RDSTabTypeAdd): @{
  191. // TabBarVC : @"UIViewController",
  192. // TabBarTitle : @"",
  193. // TabBarImage : @"icon_tab_clear",
  194. // TabBarSelectedImage: @"icon_tab_clear",
  195. // TabBarItemBadgeValue: @(0)
  196. // },
  197. @(RDSTabTypeFind): @{
  198. TabBarVC : @"RDSFindVC",
  199. TabBarTitle : @"发现",
  200. TabBarImage : @"icon_tab_found",
  201. TabBarSelectedImage: @"icon_tab_found_sel",
  202. TabBarItemBadgeValue: @(0)
  203. },
  204. @(RDSTabTypeMy) : @{
  205. TabBarVC : @"RDSMyVC",
  206. TabBarTitle : @"我的",
  207. TabBarImage : @"icon_tab_me",
  208. TabBarSelectedImage: @"icon_tab_me_sel",
  209. TabBarItemBadgeValue: @(0)
  210. }
  211. };
  212. }
  213. return _configs[@(type)];
  214. }
  215. @end