UITabBarController遇到的3个问题:UITabBarItem图标,UITabBarController生命周期,UITabBar隐藏


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];

但是出来的效果呢,只是看到了图片的轮廓,内部都是用蓝色填充了。


UITabBarController遇到的3个问题:UITabBarItem图标,UITabBarController生命周期,UITabBar隐藏_第1张图片
WX20180130-141558.png
[UIImage imageNamed:@"home_icon_book_selected"]
//替换
[UIImage imageNamed:@"home_icon_read"] imageWithRenderingMode:UIImageRenderingModeAlwaysOriginal]

现在就显示正常了


UITabBarController遇到的3个问题:UITabBarItem图标,UITabBarController生命周期,UITabBar隐藏_第2张图片
WX20180130-141923.png

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的隐藏问题

按照上面的写法,我们出现的效果是


UITabBarController遇到的3个问题:UITabBarItem图标,UITabBarController生命周期,UITabBar隐藏_第3张图片
2018-01-30 14_51_58.gif

底部的UITabBar都显示着,这显然不是我们的效果。
我们发现UIViewController有这个属性hidesBottomBarWhenPushed

Page_B *vc = [Page_B new];
vc.hidesBottomBarWhenPushed = YES;
[self.navigationController pushViewController:vc animated:YES];
UITabBarController遇到的3个问题:UITabBarItem图标,UITabBarController生命周期,UITabBar隐藏_第4张图片
2018-01-30 15_06_32.gif

这样可以解决我们遇到的问题了。但是我们似乎缺少考虑了实际情况,
我们现在在Tab1_A只放置了一个按钮,在项目中,可能会有很多个入口进入二级页面,这就需要我们每个入口都加上这个设置,而且TabBar栏上面一般都是4-5个Tab,想想都觉得可怕,这样的实现难免会有遗漏的时候。

//一般我们项目都BaseVC,项目中用到的UIViewController都会继承BaseVC,那么我BaseVC viewWillAppear 设置隐藏,是否可以解决呢
- (void)viewWillAppear:(BOOL)animated{
    [super viewWillAppear:animated];
    self.hidesBottomBarWhenPushed = YES;
}
UITabBarController遇到的3个问题:UITabBarItem图标,UITabBarController生命周期,UITabBar隐藏_第5张图片
2018-01-30 15_17_07.gif

图中显示,打开�二级页面确实隐藏了,但是回来的时候,也给隐藏了。显然这也不是我们要的。
解决方案:

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隐藏的问题。

你可能感兴趣的:(UITabBarController遇到的3个问题:UITabBarItem图标,UITabBarController生命周期,UITabBar隐藏)