1. 程式人生 > >iOS:hidesBottomBarWhenPushed的正確用法

iOS:hidesBottomBarWhenPushed的正確用法

設置 ati ase 屏幕 hide ini nim 接收不到 很多

今天說的是在TabBar嵌套Nav時,進行Push的時候隱藏TabBar的問題。

之前項目也需要這麽做,那時候iOS7還沒出,也是各種搜羅,後來的解決方法是當push操作的時候自己隱藏Tabbar,push過去視圖拉伸適應屏幕,再pop回來的時候接再顯示Tabbar,過程復雜還需要自己寫動畫,最終效果也不是很理想。

前兩天公司APP上架,當時沒有適配iOS7,在XCode4.6上開發編譯並發布,居然在iOS7下跑起來沒有太大的問題,只是一個Nav的文字錯位,有閃退,不過勉強還能用,其中有自定義Tabbar,有很多動畫,後來在一篇介紹iOS7適配的文章中看到這麽一句話:

在Xcode 4.6上使用iOS 6 SDK進行編譯的app在iOS
7上運行時是采用一種特殊的模擬模式,它試圖保存app原來的樣子。但是一旦你升級到了Xcode 5,在iOS
7SDK上編譯,你的app就會開始出現狀況了。

已經寫的很清楚了,於是我再到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。

我講的場景大概為這個樣子:

技術分享圖片

最外面是一個TabBarController,套了兩個NavgationController,當其中一個VC push下去的時候,一般情況是這樣:

技術分享圖片

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

技術分享圖片

怎麽樣,是不是有時候確實會遇到這樣的情況?其實蘋果真的考慮的很周全,為我們創造了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隱藏掉,然後添加到自己繪制的Tabbar
View上去,缺點就是這樣你的自定義的TabBarview接收不到系統應有的一些響應,於是我嘗試著把自定義的TabBar
View添加到原來的TabBar View上,也就是不隱藏原生的TabBar,而是覆蓋在上面,看不出任何區別,效果也能達到上面圖片的效果!

iOS:hidesBottomBarWhenPushed的正確用法