美文网首页
UITabBarController遇到的3个问题:UITabB

UITabBarController遇到的3个问题:UITabB

作者: 魏梓雄 | 来源:发表于2018-01-30 15:49 被阅读59次

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

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


    WX20180130-141558.png
    [UIImage imageNamed:@"home_icon_book_selected"]
    //替换
    [UIImage imageNamed:@"home_icon_read"] imageWithRenderingMode:UIImageRenderingModeAlwaysOriginal]
    

    现在就显示正常了


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

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


    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];
    
    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;
    }
    
    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个问题:UITabB

          本文链接:https://www.haomeiwen.com/subject/amhczxtx.html