- 自iOS7開(kāi)始,系統(tǒng)自帶的右滑返回效果,也可以讓有NavigationBar的視圖切換很絲滑流暢。當(dāng)然你也可能會(huì)遇到有些視圖并沒(méi)有NavigationBar(實(shí)際上是隱藏了),然后從這樣的視圖中push一個(gè)有NavigationBar的視圖,這種需求很常見(jiàn),實(shí)現(xiàn)起來(lái)也很簡(jiǎn)單,就是在不同的視圖里對(duì)NavigationBar設(shè)置隱藏和顯示就可以了,代碼如下:
- (void)viewWillAppear:(BOOL)animated
{
[super viewWillAppear:animated];
self.navigationController.navigationBarHidden = YES;
}
這里需要注意一點(diǎn),因?yàn)樵O(shè)置'NavigationBar'的隱藏或顯示是作用到當(dāng)前'navigation controller'的,他會(huì)影響到整個(gè)navigationcontroller的NavigationBar的顯示情況,所以一定要放到viewWillAppear里,不能放到viewDidLoad里。
看下效果:
效果圖01
效果圖02
- 嗯,好像還不錯(cuò)。等等,pop的時(shí)候好像右上角有個(gè)黑色的東東,那是什么鬼?用iOS7系統(tǒng)自帶的右滑返回功能仔細(xì)看看(手指按住不松開(kāi)可以慢慢移動(dòng)看看效果):
效果圖03
- 哦,shit!!!告訴我這不是真的!但這就是真的!接受現(xiàn)實(shí)吧,騷年!
心中一萬(wàn)只草泥馬奔騰過(guò)后,開(kāi)始尋找解決辦法。 - 解決方法如下:如下代碼
- (void)viewWillAppear:(BOOL)animated {
[super viewWillAppear:animated];
// self.navigationController.navigationBarHidden = YES;
[self.navigationController setNavigationBarHidden:YES animated:YES];
}
- 再看下現(xiàn)在的效果圖:
效果圖04
- 總結(jié)1: 問(wèn)題的關(guān)鍵在于那個(gè)animated,必須是YES才能達(dá)到理想的效果,如果換成下面的代碼
[self.navigationController setNavigationBarHidden:YES animated:NO],
依然會(huì)有黑色底。定位到這個(gè)方法里看到這么一句話:
If animated, it will transition vertically using UINavigationControllerHideShowBarDuration.
大致意思是,如果
animated=YES,
會(huì)使用
UINavigationControllerHideShowBarDuration進(jìn)行垂直過(guò)渡。UINavigationControllerHideShowBarDuration是一個(gè)CGFloat類型的常量。
可是我并沒(méi)有很好的理解它所謂的transition vertically到底是個(gè)什么概念,也許就是后來(lái)看到的那個(gè)效果吧。 - 總結(jié)2:
[self.navigationController setNavigationBarHidden:YES animated:NO];
的優(yōu)先級(jí)比
self.navigationController.navigationBarHidden = YES;
的優(yōu)先級(jí)更高, 有yes就有no