Files
keyboard/keyBoard/Class/Base/VC/BaseTabBarController.m
2026-01-26 16:53:41 +08:00

186 lines
6.0 KiB
Objective-C
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

//
// BaseTabBarController.m
// keyBoard
//
// Created by Mac on 2025/10/29.
//
#import "BaseTabBarController.h"
#import "HomeMainVC.h"
#import "KBAiMainVC.h"
#import "KBShopVC.h"
#import "MyVC.h"
#import "KBAIHomeVC.h"
// #import "KBCommunityVC.h"
#import "BaseNavigationController.h"
#import "KBAuthManager.h"
#import "KBCustomTabBar.h"
#import "Masonry.h"
@interface BaseTabBarController () <KBCustomTabBarDelegate>
/// 自定义 TabBar
@property(nonatomic, strong) KBCustomTabBar *customTabBar;
@end
@implementation BaseTabBarController
- (void)viewDidLoad {
[super viewDidLoad];
self.delegate = self;
// 组装 4 个 Tab首页 / 商城 / 社区 / 我的
// 图标位于 Assets.xcassets/Tabbar 下tab_home/tab_home_selected 等
// 首页
HomeMainVC *home = [[HomeMainVC alloc] init];
BaseNavigationController *navHome =
[[BaseNavigationController alloc] initWithRootViewController:home];
navHome.tabBarItem = [self tabItemWithTitle:KBLocalized(@"Home")
image:@"tab_home"
selectedImg:@"tab_home_selected"];
// 商城
KBShopVC *shop = [[KBShopVC alloc] init];
BaseNavigationController *navShop =
[[BaseNavigationController alloc] initWithRootViewController:shop];
navShop.tabBarItem = [self tabItemWithTitle:KBLocalized(@"Shop")
image:@"tab_shop"
selectedImg:@"tab_shop_selected"];
// AI
KBAIHomeVC *aiMainVC = [[KBAIHomeVC alloc] init];
// community.title = KBLocalized(@"Circle");
BaseNavigationController *navCommunity =
[[BaseNavigationController alloc] initWithRootViewController:aiMainVC];
navCommunity.tabBarItem = [self tabItemWithTitle:KBLocalized(@"Circle")
image:@"tab_shequ"
selectedImg:@"tab_shequ_selected"];
// 我的
MyVC *my = [[MyVC alloc] init];
BaseNavigationController *navMy =
[[BaseNavigationController alloc] initWithRootViewController:my];
navMy.tabBarItem = [self tabItemWithTitle:KBLocalized(@"Mine")
image:@"tab_my"
selectedImg:@"tab_my_selected"];
self.viewControllers = @[ navHome, navShop, navCommunity, navMy ];
// 不隐藏系统 TabBar而是将自定义视图添加到 TabBar 上
[self setupCustomTabBarOnNativeTabBar];
// 测试储存Token
// [[KBAuthManager shared] saveAccessToken:@"TEST" refreshToken:nil
// expiryDate:[NSDate dateWithTimeIntervalSinceNow:3600]
// userIdentifier:nil];
// [[KBAuthManager shared] signOut];
}
- (void)setupCustomTabBarOnNativeTabBar {
// 1. 持续隐藏原生 TabBar 的所有按钮
[self hideNativeTabBarButtons];
// 2. 创建自定义 TabBar
NSMutableArray *items = [NSMutableArray array];
for (UIViewController *vc in self.viewControllers) {
[items addObject:vc.tabBarItem];
}
self.customTabBar = [[KBCustomTabBar alloc] initWithItems:items];
self.customTabBar.delegate = self;
// 3. 设置 frame 覆盖整个 TabBar 区域
self.customTabBar.frame = self.tabBar.bounds;
// 4. 使用 autoresizingMask 自动适配尺寸变化
self.customTabBar.autoresizingMask =
UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight;
// 5. 将自定义 TabBar 添加到原生 TabBar 上
[self.tabBar addSubview:self.customTabBar];
// 6. 禁用原生 TabBar 的交互,只让自定义视图响应
self.tabBar.userInteractionEnabled = YES;
for (UIView *subview in self.tabBar.subviews) {
if (subview != self.customTabBar &&
![NSStringFromClass([subview class]) containsString:@"Background"]) {
subview.userInteractionEnabled = NO;
subview.hidden = YES;
}
}
// 7. 设置初始背景色默认选中索引0白色背景
[self.customTabBar setTransparentBackground:NO];
}
- (void)hideNativeTabBarButtons {
// 移除或隐藏原生 TabBar 的所有子视图(按钮等)
for (UIView *subview in self.tabBar.subviews) {
// 保留系统的 _UIBarBackground 背景视图,隐藏其他视图
if (![NSStringFromClass([subview class]) containsString:@"Background"] &&
subview != self.customTabBar) {
subview.hidden = YES;
subview.alpha = 0;
}
}
}
- (void)viewWillAppear:(BOOL)animated {
[super viewWillAppear:animated];
// 每次视图即将出现时,确保原生按钮被隐藏
[self hideNativeTabBarButtons];
}
// 统一构造 TabBarItem原图渲染避免被系统 Tint 着色
- (UITabBarItem *)tabItemWithTitle:(NSString *)title
image:(NSString *)imageName
selectedImg:(NSString *)selectedName {
UIImage *img = [[UIImage imageNamed:imageName]
imageWithRenderingMode:UIImageRenderingModeAlwaysOriginal];
UIImage *sel = [[UIImage imageNamed:selectedName]
imageWithRenderingMode:UIImageRenderingModeAlwaysOriginal];
UITabBarItem *item = [[UITabBarItem alloc] initWithTitle:title
image:img
selectedImage:sel];
return item;
}
#pragma mark - KBCustomTabBarDelegate
- (void)customTabBar:(KBCustomTabBar *)tabBar
didSelectItemAtIndex:(NSInteger)index {
// 登录检查
if ((index == 1 || index == 2) && ![KBUserSessionManager shared].isLoggedIn) {
[[KBUserSessionManager shared] goLoginVC];
return;
}
// 切换 VC
self.selectedIndex = index;
// 设置 TabBar 背景索引2是 KBAiMainVC
if (index == 2) {
[self.customTabBar setTransparentBackground:YES];
} else {
[self.customTabBar setTransparentBackground:NO];
}
}
/*
#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