最近項目里折騰了下隱藏導(dǎo)航欄的問題骗灶。折騰的難度沒有預(yù)期的那么低惨恭。秉馏。耙旦。
現(xiàn)在在這里總結(jié)一下:
基礎(chǔ)版
- (void)viewWillAppear:(BOOL)animated {
[self.navigationController setNavigationBarHidden:YES animated:animated];
[super viewWillAppear:animated];
}
- (void)viewWillDisappear:(BOOL)animated {
[self.navigationController setNavigationBarHidden:NO animated:animated];
[super viewWillDisappear:animated];
}
基礎(chǔ)版使用系統(tǒng)自帶的方法,優(yōu)點是簡單實用萝究,能夠解決返回的時候隱藏導(dǎo)航欄動畫問題免都。這在隱藏頁面在導(dǎo)航控制器中間的時候沒有問題。但是如果頁面是導(dǎo)航控制器的根視圖控制器帆竹,而這個導(dǎo)航欄又處于tabbar控制器的某一欄里绕娘,當(dāng)你從別的tabbar切換到這個控制器就會發(fā)現(xiàn)導(dǎo)航欄會跳一下。這里的處理就不那么簡單了栽连。(勘誤险领,有網(wǎng)友指出侨舆,把[super viewWillAppear:animated]
放到[self.navigationController setNavigationBarHidden:YES animated:animated]
后面執(zhí)行就可以解決tabbar跳動問題,待驗證)
進階版
進階版是我找到的別人做法
iOS透明導(dǎo)航欄的平滑過渡(進階版)大概看了下绢陌,這位哥們的思路是把導(dǎo)航欄搞成透明的挨下。然后我就把他的category拖到了工程里。試用了下脐湾,結(jié)果發(fā)現(xiàn)不行臭笆。。秤掌。不行愁铺。。闻鉴。恩茵乱,好吧,那我再換另一個教程孟岛,于是就找到了下面這位大哥的教程:
【iOS】讓我們一次性解決導(dǎo)航欄的所有問題看標(biāo)題就高大上啊似将。受此影響,我也給自己的這篇教程取了個高大上又裝逼蚀苛,然而并沒有多少內(nèi)涵的標(biāo)題在验。。堵未。好吧腋舌,這不是重點。重點是渗蟹,我把它的東西拖進來了块饺,發(fā)現(xiàn)還是不行。雌芽。授艰。難道是我的姿勢不對?- -世落,除了顯示有問題之外淮腾,它用起來還特別卡。屉佳。谷朝。還要繼承它的類,對我自己原來的項目傾入性還很大武花。
終極大招
恩圆凰, 好吧。經(jīng)過一番思考体箕,我自己提出了一套解決方案专钉,基本思路如下:
這套方案里挑童,我使用的還是setNavigationBarHidden: animated:
還是這個方法犁河。假設(shè)我們tabbar控制器里有3個控制器 A枢里、B型凳、C造成,C控制器需要隱藏導(dǎo)航欄牍陌,并且C控制器里有個按鈕铅歼,可以push到D控制器余佃,且D控制器需要顯示導(dǎo)航欄鞠呈。但是所以我們需要實現(xiàn)的就是玉雾,從A翔试、B到C的時候,setNavigationBarHidden: animated:
的animated
參數(shù)需要設(shè)置為NO
复旬,而從D控制器pop回C控制器的時候垦缅,需要設(shè)置為YES
。這樣就能完美解決動畫問題驹碍。為了能夠統(tǒng)一控制壁涎,且易于以后擴展到別的控制器,我把tabbarController跟navigationController做了繼承志秃,通過在navigationcontroller的代理方法- navigationController: willShowViewController: animated:
里完成隱藏與現(xiàn)實導(dǎo)航欄的操作怔球。這里我們需要判斷我們是從A、B控制器到C控制器浮还,還是從D控制器pop回C控制器竟坛。我的實現(xiàn)思路如下:我給BaseTabBarViewController
設(shè)置了一個delayIndex
屬性來記錄上一次tabbarController所在的index。然后我在BaseTabBarViewController
的代理方法里設(shè)置delayIndex
- (BOOL)tabBarController:(UITabBarController *)tabBarController shouldSelectViewController:(UIViewController *)viewController {
self.delayIndex = self.selectedIndex;
return YES;
}
由于這個代理方法執(zhí)行的時候钧舌,頁面還沒有跳到選中的控制器担汤,就完成了記錄上一次選中標(biāo)簽的工作。這樣洼冻,在navigationcontroller的代理方法里判斷delayIndex
如果是0或者1崭歧,那么就是從A或者B控制器過來的,這時候就不需要動畫:
- (void)navigationController:(UINavigationController *)navigationController willShowViewController:(UIViewController *)viewController animated:(BOOL)animated{
BOOL hiddenAnimate = NO;
NSInteger count = ((BaseTabBarViewController *)viewController.tabBarController).delayIndex;
if (count == 2) {
hiddenAnimate = YES;
}
BOOL isShowHomePage = [viewController isKindOfClass:[SecondViewController class]];
[self setNavigationBarHidden:isShowHomePage animated:hiddenAnimate];
}
接下來解決從D控制器pop回去需要動畫的問題撞牢。這里我想到去判斷navigationController的棧里如果有大于1個的控制器率碾,那就說明是push出去了。這時候讓delayIndex等于當(dāng)前tabbarController的selectedIndex普泡。就可以解決了播掷。代碼如下:
- (void)navigationController:(UINavigationController *)navigationController didShowViewController:(UIViewController *)viewController animated:(BOOL)animated{
if (viewController.tabBarController.selectedIndex == 2 && [self.viewControllers count] > 1) {
((BaseTabBarViewController *)viewController.tabBarController).delayIndex = viewController.tabBarController.selectedIndex;
}
}
完成效果如下:
以上代碼均已上傳至本人GitHub审编,如有疑問撼班,歡迎咨詢。