tabbar隐藏(tabbar变黑和切换tab时突然被隐藏)

关于tabbar隐藏,有两种方法:
(个人最优隐藏方案在最后)

1、self.tabBarController.tabBar.hidden = YES;

这是tabbar自带的方法。在需要的页面直接使用self.tabBarController.tabBar.hidden = NO;和self.tabBarController.tabBar.hidden = YES;来控制显示和隐藏。

这种方式可能会造成推出的页面底下tabbar位置变黑或者点击事件无响应。这种你打开图层去看,就能看到,\color{red}{原因}是view的frame没有全屏:

层级图

\color{red}{解决:}在需要的页面修改frame即可。

-(void)viewWillLayoutSubviews{
    //这里改成你需要的frame。
    self.view.frame = CGRectMake(0, SafeAreaTopHeight, ScreenWidth, ScreenHeight - SafeAreaTopHeight);
    [super viewWillLayoutSubviews];
}

2、vc.hidesBottomBarWhenPushed = YES;

(此处的vc是你要push的那个子页面vc,不是当前vc!,如果要使用当前vc,则在当前push代码后面要加self.hidesBottomBarWhenPushed = NO;那更烦人了,我不会这么用。而且看完后面原因解释也能理解为什么是子页面vc。)
  这是viewcontroller的方法。如果你是在重写UINavigationController的push方法中直接设置的,会出现两个问题:1、push进去tabbar会隐藏,但是返回之后tabbar不会显示;2、运行好后直接点击切换tab,tabbar也会隐藏。
(单独在某个页面的点击按钮事件里写这个是没有问题,但项目里一般都会写在重写UINavigationController的push方法中进行全局设置,以减少代码量。造成问题原因写在后面。)
  于是,在tab的几个主页面上用self.tabBarController.tabBar.hidden = NO;来控制回到根控制器时tabbar的显示,以此来解决问题1。然后在tabbar的didSelectViewController代理里再进行一次显示, 以此来解决问题2。
  第一次push进去和返回都没问题,点击来回切换也没有问题,然而当你第一次push完成返回到根控制器之后进行另一个页面push的时候,tab并没有被隐藏。
  于是,在vc.hidesBottomBarWhenPushed = YES;的地方再加上一句self.tabBarController.tabBar.hidden = YES;(层层面向问题逐个解决,至此可以解决问题,但有点麻烦!了解原因之后,可以面向根本解决问题。)

//1、在tab的几个主页面的viewwillappear里面写不隐藏tabbar
self.tabBarController.tabBar.hidden = NO;

//2、一般这两句会写在自定义UINavigationController或者重写的UINavigationController中的push方法里,做整体设置,这样不用到处写。
self.tabBarController.tabBar.hidden = YES;
viewController.hidesBottomBarWhenPushed = YES;

//3、解决来回切换tab时,tabbar突然隐藏
#pragma mark --- tabbarDelegate
-(void)tabBarController:(UITabBarController *)tabBarController didSelectViewController:(UIViewController *)viewController{
    if (self.tab.tabBar.isHidden) {
        self.tab.tabBar.hidden = NO;
    }
}

\color{red}{原因:}

hidesBottomBarWhenPushed官方文档解释
  百度翻译一下:添加为导航控制器子级的视图控制器可以在屏幕底部显示可选工具栏。最顶层视图控制器上此属性的值确定工具栏是否可见。如果此属性的值为true,则工具栏将隐藏。如果此属性的值为false,则该条可见。
  不理解?看下xcode中的解释,是不是就清晰明了了:
xcode解释
  个人总结一下:官方解释中的关键点就是”添加为导航控制器子级“和”最顶层视图控制器“。本质就是压栈,当vc压入栈时,设置了隐藏tabbar,那么包含此vc的之后所有vc的tabbar都将被隐藏。(这点可解释为什么vc.hidesBottomBarWhenPushed的vc是你要push的那个子页面vc。)
  知道原因之后,上面那种面向过程的解决方法就不是最优的解决方法了(至少从代码量上看,并不精简),可以把所有有关tabbar隐藏的代码都删掉,只需要在重写UINavigationController的push方法中如下设置即可:(\color{red}{我认为的最优隐藏方案:}

- (void)pushViewController:(UIViewController *)viewController animated:(BOOL)animated{

    if (self.childViewControllers.count > 0) {
        viewController.hidesBottomBarWhenPushed = YES;
    }
    
    [super pushViewController:viewController animated:animated];
}

关于代码中 0 的解释:这是表示当push了第几个页面之后,tabbar会跟随push动作一起隐藏,>0表示从第一个push出的那个页面就会隐藏tabbar,进一步解释:如果是>3,则表示,当push出的页面是第4个被push出的页面的时候,tabbar隐藏,前3个push出的页面不会隐藏tabbar。

  此时来解释为什么一开始在重写push方法中不加childVC.count的判断而直接使用viewController.hidesBottomBarWhenPushed = YES;会导致返回之后的tab也消失:当你运行项目的时候,nav因为是加在根控制器上,所以项目加载根控制器时是采用push的方式,将根控制器推出,此时你在push方法中打断点会发现,它走过了这个方法,而当前走进这个方法的vc是你tab主页的那几个vc(但它们不是childVC,人家是根视图,这点要搞清楚,这跟count设置值有关),此时它也就直接进行了hidesBottomBarWhenPushed = YES的赋值,也就是说当你启动项目的时候,tab主页的hidesBottomBarWhenPushed也被设置成了YES,于是你首页push返回和点击切换tab的时候,tab主页的tabbar都会隐藏。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 202,056评论 5 474
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 84,842评论 2 378
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 148,938评论 0 335
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,296评论 1 272
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,292评论 5 363
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,413评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,824评论 3 393
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,493评论 0 256
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,686评论 1 295
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,502评论 2 318
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,553评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,281评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,820评论 3 305
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,873评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,109评论 1 258
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,699评论 2 348
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,257评论 2 341

推荐阅读更多精彩内容