今天說的是在TabBar嵌套Nav時(shí)撞鹉,進(jìn)行Push的時(shí)候隱藏TabBar的問題疟丙。
之前項(xiàng)目也需要這么做,那時(shí)候iOS7還沒出鸟雏,也是各種搜羅享郊,后來的解決方法是當(dāng)push操作的時(shí)候自己隱藏Tabbar,push過去視圖拉伸適應(yīng)屏幕孝鹊,再pop回來的時(shí)候接再顯示Tabbar炊琉,過程復(fù)雜還需要自己寫動(dòng)畫,最終效果也不是很理想。
前兩天公司APP上架苔咪,當(dāng)時(shí)沒有適配iOS7锰悼,在XCode4.6上開發(fā)編譯并發(fā)布,居然在iOS7下跑起來沒有太大的問題团赏,只是一個(gè)Nav的文字錯(cuò)位箕般,有閃退,不過勉強(qiáng)還能用舔清,其中有自定義Tabbar丝里,有很多動(dòng)畫,后來在一篇介紹iOS7適配的文章中看到這么一句話:
在Xcode 4.6上使用iOS 6 SDK進(jìn)行編譯的app在iOS
7上運(yùn)行時(shí)是采用一種特殊的模擬模式鸠踪,它試圖保存app原來的樣子丙者。但是一旦你升級(jí)到了Xcode 5,在iOS
7SDK上編譯营密,你的app就會(huì)開始出現(xiàn)狀況了械媒。
已經(jīng)寫的很清楚了,于是我再到Xcode5中編譯運(yùn)行原來的項(xiàng)目评汰,就破漏百出了纷捞,開始完全崩潰,各種問題浮現(xiàn)被去。
好了主儡,回到今天說的正題,先和大家說說hidesBottomBarWhenPushed惨缆,從這個(gè)屬性名也能知道它的意思了糜值,官方的解釋是這樣:
If YES, then when this view controller is pushed into a controller hierarchy with a bottom bar (like a tab bar), the bottom bar will slide out. Default is NO.
大致意思是如果為YES,當(dāng)這個(gè)控制器push的時(shí)候坯墨,底部的Bar寂汇,比如Tabbar會(huì)滑走,也就是不會(huì)在push后的視圖上顯示出來捣染,默認(rèn)值為NO骄瓣。
我講的場(chǎng)景大概為這個(gè)樣子:
最外面是一個(gè)TabBarController,套了兩個(gè)NavgationController耍攘,當(dāng)其中一個(gè)VC push下去的時(shí)候榕栏,一般情況是這樣:
當(dāng)隱藏Tabbar的時(shí)候再push,效果是這樣:
怎么樣蕾各,是不是有時(shí)候確實(shí)會(huì)遇到這樣的情況扒磁?其實(shí)蘋果真的考慮的很周全,為我們創(chuàng)造了hidesBottomBarWhenPushed這個(gè)屬性式曲,為了解決這個(gè)問題渗磅。代碼非常簡(jiǎn)單,一句或者兩句話即可检访,這里得分幾種Push的情況始鱼。
Case1:xib加載或者Storyboard用identifier獲取Controller
UIViewController *v2 = [self.storyboard instantiateViewControllerWithIdentifier:@"v2"];
v2.hidesBottomBarWhenPushed = YES;
[self.navigationController pushViewController:v2 animated:YES];
Case2:拉線,也就是Storyboard用performSegue
self.hidesBottomBarWhenPushed = YES;
[self performSegueWithIdentifier:@"tov2" sender:nil];
self.hidesBottomBarWhenPushed = NO;
Tip:經(jīng)測(cè)試證明脆贵,此種方式只會(huì)對(duì)后面的一級(jí)生效医清,繼續(xù)往后Push還會(huì)出現(xiàn)TabBar,要繼續(xù)往后push也隱藏Tabbar還得使用Case3的方法卖氨,也建議如此会烙!
Case3:拉線,在prepareForSegue函數(shù)里
-(void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
{
[segue.destinationViewController setHidesBottomBarWhenPushed:YES];
}
更方便的做法:如果你在用 Storyboard筒捺,可以在 ViewController 的設(shè)置面板中把Hide Bottom Bar on Push屬性勾選上柏腻,效果和上文代碼一樣。
暫時(shí)就用到這幾點(diǎn)系吭,我之前的做法五嫂,自己手動(dòng)隱藏,拉伸view肯尺,顯示不但麻煩沃缘,兼容性也不好,移到iOS7上問題多多则吟,不過用這個(gè)屬性可以非常方便的實(shí)現(xiàn)此需求槐臀,并且在iOS6上也完美兼容哦。
注意:還有個(gè)問題氓仲,這個(gè)屬性只支持非自定義的Tabbar水慨,也就是只支持原生Tabbar,如果是自定義的Tabbar會(huì)產(chǎn)生你意想不到的效果敬扛,我之前就遇到過晰洒,因?yàn)槭褂胔idesBottomBarWhenPushed后,系統(tǒng)內(nèi)部會(huì)處理TabbarController上Tabbar這個(gè)View舔哪,我之前自定義的Tabbar做法是吧原生Tabbar這個(gè)View隱藏掉欢顷,然后添加到自己繪制的Tabbar
View上去,缺點(diǎn)就是這樣你的自定義的TabBarview接收不到系統(tǒng)應(yīng)有的一些響應(yīng)捉蚤,于是我嘗試著把自定義的TabBar
View添加到原來的TabBar View上抬驴,也就是不隱藏原生的TabBar,而是覆蓋在上面缆巧,看不出任何區(qū)別布持,效果也能達(dá)到上面圖片的效果!