今天說的是在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
self.hidesBottomBarWhenPushed = YES; UIViewController *vc = [self.storyboard instantiateViewControllerWithIdentifier:@"state"]; [self.navigationController pushViewController:vc animated:YES]; self.hidesBottomBarWhenPushed = NO;
Case2:拉線,也就是Storyboard用performSegue
self.hidesBottomBarWhenPushed = YES; [self performSegueWithIdentifier:@"index2notice" sender:nil]; self.hidesBottomBarWhenPushed = NO;
Tip:經測試證明,此種方式只會對后面的一級生效,繼續往后Push還會出現TabBar,要繼續往后push也隱藏Tabbar還得使用Case3的方法!
Case3:拉線,在prepareForSegue函數里
-(void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender { [segue.destinationViewController setHidesBottomBarWhenPushed:YES]; }
暫時就用到這幾點,我之前的做法,自己手動隱藏,拉伸view,顯示不但麻煩,兼容性也不好,移到iOS7上問題多多,不過用這個屬性可以非常方便的實現此需求,並且在iOS6上也完美兼容哦。
注意:還有個問題,這個屬性只支持非自定義的Tabbar,也就是只支持原生Tabbar,如果是自定義的Tabbar會產生你意想不到的效果,我之前就遇到過,因為使用hidesBottomBarWhenPushed后,系統內部會處理TabbarController上Tabbar這個View,我之前自定義的Tabbar做法是吧原生Tabbar這個View隱藏掉,然后添加到自己繪制的Tabbar View上去,缺點就是這樣你的自定義的TabBarview接收不到系統應有的一些響應,於是我嘗試着把自定義的TabBar View添加到原來的TabBar View上,也就是不隱藏原生的TabBar,而是覆蓋在上面,看不出任何區別,效果也能達到上面圖片的效果!