今天說的是在TabBar嵌套Nav時,進行Push的時候隱藏TabBar的問題。segmentfault
以前項目也須要這麼作,那時候 iOS7 還沒出,也是各類蒐羅,後來的解決方法是當push操做的時候本身隱藏 Tabbar,push 過去視圖拉伸適應屏幕,再 pop 回來的時候接再顯示 Tabbar,過程複雜還須要本身寫動畫,最終效果也不是很理想。併發
前兩天公司 APP上架,當時沒有適配 iOS7,在 XCode4.6 上開發編譯併發布,竟然在iOS7下跑起來沒有太大的問題,只是一個Nav的文字錯位,有閃退,不過勉強還能用,其中有自定義Tabbar,有不少動畫,後來在一篇介紹 iOS7 適配的文章中看到這麼一句話:app
在Xcode 4.6上使用iOS 6 SDK進行編譯的app在iOS
7上運行時是採用一種特殊的模擬模式,它試圖保存app原來的樣子。可是一旦你升級到了Xcode 5,在iOS
7SDK上編譯,你的app就會開始出現情況了。ide
已經寫的很清楚了,因而我再到Xcode5中編譯運行原來的項目,就破漏百出了,開始徹底崩潰,各類問題浮現。函數
好了,回到今天說的正題,先和你們說說hidesBottomBarWhenPushed,從這個屬性名也能知道它的意思了,官方的解釋是這樣:測試
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,當這個控制器push的時候,底部的Bar,好比Tabbar會滑走,也就是不會在push後的視圖上顯示出來,默認值爲NO。this
我講的場景大概爲這個樣子:spa
<center></center>code
最外面是一個TabBarController,套了兩個NavgationController,當其中一個VC push下去的時候,通常狀況是這樣:
<center></center>
當隱藏Tabbar的時候再push,效果是這樣:
<center></center>
怎麼樣,是否是有時候確實會遇到這樣的狀況?其實蘋果然的考慮的很周全,爲咱們創造了hidesBottomBarWhenPushed這個屬性,爲了解決這個問題。代碼很是簡單,一句或者兩句話便可,這裏得分幾種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:經測試證實,此種方式只會對後面的一級生效,繼續日後Push還會出現TabBar,要繼續日後push也隱藏Tabbar還得使用Case3的方法,也建議如此!
Case3:拉線,在prepareForSegue函數裏
-(void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender { [segue.destinationViewController setHidesBottomBarWhenPushed:YES]; }
更方便的作法:若是用 Storyboard,能夠在 ViewController 的設置面板中把 Hide Bottom Bar on Push
屬性勾選上,效果和上文代碼同樣。
暫時就用到這幾點,我以前的作法,本身手動隱藏,拉伸view,顯示不但麻煩,兼容性也很差,移到iOS7上問題多多,不過用這個屬性能夠很是方便的實現此需求,而且在iOS6上也完美兼容哦。
注意:還有個問題,這個屬性只支持非自定義的Tabbar,也就是隻支持原生Tabbar,若是是自定義的Tabbar會產生你意想不到的效果,我以前就遇到過,由於使用hidesBottomBarWhenPushed後,系統內部會處理TabbarController上Tabbar這個View,我以前自定義的Tabbar作法是吧原生Tabbar這個View隱藏掉,而後添加到本身繪製的TabbarView上去,缺點就是這樣你的自定義的TabBarview接收不到系統應有的一些響應,因而我嘗試着把自定義的TabBarView添加到原來的TabBar View上,也就是不隱藏原生的TabBar,而是覆蓋在上面,看不出任何區別,效果也能達到上面圖片的效果!