iOS:hidesBottomBarWhenPushed的正確用法

今天說的是在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>push</center>

當隱藏Tabbar的時候再push,效果是這樣:

<center>push next</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,而是覆蓋在上面,看不出任何區別,效果也能達到上面圖片的效果!

相關文章
相關標籤/搜索