1. UITabBarItem 显示正常的图标
我们使用 UITabBarController 都会这么写
Tab1_A *firstVC = [[Tab1_A alloc] init];
NavigationController *firstNavVC = [[NavigationController alloc] initWithRootViewController:firstVC];
firstNavVC.tabBarItem = [[UITabBarItem alloc] initWithTitle:@"栏目一" image:[UIImage imageNamed:@"home_icon_read"] selectedImage:[UIImage imageNamed:@"home_icon_read_selected"]];
Tab2_A *secondVC = [[Tab2_A alloc] init];
NavigationController *secondNavVC = [[NavigationController alloc] initWithRootViewController:secondVC];
secondNavVC.tabBarItem = [[UITabBarItem alloc] initWithTitle:@"栏目二" image:[UIImage imageNamed:@"home_icon_book"] selectedImage:[UIImage imageNamed:@"home_icon_book_selected"]];
self.viewControllers = @[firstNavVC,secondNavVC];
但是出来的效果呢,只是看到了图片的轮廓,内部都是用蓝色填充了。
[UIImage imageNamed:@"home_icon_book_selected"]
//替换
[UIImage imageNamed:@"home_icon_read"] imageWithRenderingMode:UIImageRenderingModeAlwaysOriginal]
现在就显示正常了
2. UITabBarController的生命周期
//下面是UIViewController的生命周期
UIViewController *vc = [[UIViewController alloc] init];
//上面执行后,会调用
//- (instancetype)init;
[self.navigationController pushViewController:vc animated:YES];
//上面执行后,会调用
//- (void)viewDidLoad;
//- (void)viewWillAppear:(BOOL)animated;
//- (void)viewDidAppear:(BOOL)animated;
UITabBarController *vc = [UITabBarController new];
//上面执行后,会调用
//- (instancetype)init;
//- (void)viewDidLoad;
[self presentViewController:vc animated:YES completion:nil];
//- (void)viewWillAppear:(BOOL)animated;
//- (void)viewDidAppear:(BOOL)animated;
//对比上面的信息,UITabBarController 在调用父类的初始化方法后,
self = [super init];
//就会调用 - (void)viewDidLoad;这个跟UIViewController的生命周期有点区别。
UITabBarController *vc = [UITabBarController new];
vc.model = [NSObject new];
- (void)viewDidLoad {
[super viewDidLoad];
//在里面 vc.model 永远为null。
//正如上面所说,第一行代码执行时就已经调用该方法了。
}
3. UITabBarController 跳转页面后,UITabBar的隐藏问题
按照上面的写法,我们出现的效果是
底部的UITabBar都显示着,这显然不是我们的效果。
我们发现UIViewController有这个属性hidesBottomBarWhenPushed
Page_B *vc = [Page_B new];
vc.hidesBottomBarWhenPushed = YES;
[self.navigationController pushViewController:vc animated:YES];
这样可以解决我们遇到的问题了。但是我们似乎缺少考虑了实际情况,
我们现在在Tab1_A只放置了一个按钮,在项目中,可能会有很多个入口进入二级页面,这就需要我们每个入口都加上这个设置,而且TabBar栏上面一般都是4-5个Tab,想想都觉得可怕,这样的实现难免会有遗漏的时候。
//一般我们项目都BaseVC,项目中用到的UIViewController都会继承BaseVC,那么我BaseVC viewWillAppear 设置隐藏,是否可以解决呢
- (void)viewWillAppear:(BOOL)animated{
[super viewWillAppear:animated];
self.hidesBottomBarWhenPushed = YES;
}
图中显示,打开�二级页面确实隐藏了,但是回来的时候,也给隐藏了。显然这也不是我们要的。
解决方案:
a.BaseVC的设置
//在BaseVC
- (void)viewWillAppear:(BOOL)animated;
- (void)viewDidAppear:(BOOL)animated;
//任意一个设置 self.hidesBottomBarWhenPushed = YES;
在Tab1_A,Tab2_A,Tab3_A,Tab4_A,这些页面
- (void)viewWillAppear:(BOOL)animated;
- (void)viewWillDisappear:(BOOL)animated;
- (void)viewDidDisappear:(BOOL)animated;
任意一个设置 self.hidesBottomBarWhenPushed = NO;
b.定义 UINavigationController 的子类
//UINavigationController的子类,重写pushViewController的方法
-(void)pushViewController:(UIViewController *)viewController animated:(BOOL)animated{
if (self.childViewControllers.count==1) {
viewController.hidesBottomBarWhenPushed = YES;
}
[super pushViewController:viewController animated:animated];
}
c.使用 RTRootNavigationController
因为我在项目中使用 RTRootNavigationController 解决navigationBar跳转出现的黑色块,所以遇到这个UITabBarController的问题,也会查看这个类库的用法。
//使用RTRootNavigationController包裹UITabBarController,
//注意要用initWithRootViewControllerNoWrapping这个初始化方法
TabBarVC *vc = [[TabBarVC alloc] init];
RTRootNavigationController *nav = [[RTRootNavigationController alloc] initWithRootViewControllerNoWrapping:vc];
//使用RTContainerNavigationController 包裹是UIViewController
Tab1_A *firstVC = [[Tab1_A alloc] init];
RTContainerNavigationController *firstNavVC = [[RTContainerNavigationController alloc] initWithRootViewController:firstVC];
firstNavVC.tabBarItem = [[UITabBarItem alloc] initWithTitle:@"一号" image:[UIImage new] selectedImage:[UIImage new]];
self.viewControllers = @[firstNavVC,secondNavVC];
以上3个方法,都可以完美解决UITabBar隐藏的问题。