iOS 隱藏導(dǎo)航欄最佳實踐

最近項目里折騰了下隱藏導(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;

    }
}

完成效果如下:

效果.gif

以上代碼均已上傳至本人GitHub审编,如有疑問撼班,歡迎咨詢。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末垒酬,一起剝皮案震驚了整個濱河市砰嘁,隨后出現(xiàn)的幾起案子件炉,更是在濱河造成了極大的恐慌,老刑警劉巖矮湘,帶你破解...
    沈念sama閱讀 206,968評論 6 482
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件斟冕,死亡現(xiàn)場離奇詭異,居然都是意外死亡缅阳,警方通過查閱死者的電腦和手機磕蛇,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,601評論 2 382
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來十办,“玉大人秀撇,你說我怎么就攤上這事∠蜃澹” “怎么了呵燕?”我有些...
    開封第一講書人閱讀 153,220評論 0 344
  • 文/不壞的土叔 我叫張陵,是天一觀的道長件相。 經(jīng)常有香客問我再扭,道長,這世上最難降的妖魔是什么夜矗? 我笑而不...
    開封第一講書人閱讀 55,416評論 1 279
  • 正文 為了忘掉前任泛范,我火速辦了婚禮,結(jié)果婚禮上紊撕,老公的妹妹穿的比我還像新娘敦跌。我一直安慰自己,他們只是感情好逛揩,可當(dāng)我...
    茶點故事閱讀 64,425評論 5 374
  • 文/花漫 我一把揭開白布柠傍。 她就那樣靜靜地躺著,像睡著了一般辩稽。 火紅的嫁衣襯著肌膚如雪惧笛。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,144評論 1 285
  • 那天逞泄,我揣著相機與錄音患整,去河邊找鬼。 笑死喷众,一個胖子當(dāng)著我的面吹牛各谚,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播到千,決...
    沈念sama閱讀 38,432評論 3 401
  • 文/蒼蘭香墨 我猛地睜開眼昌渤,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了憔四?” 一聲冷哼從身側(cè)響起膀息,我...
    開封第一講書人閱讀 37,088評論 0 261
  • 序言:老撾萬榮一對情侶失蹤般眉,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后潜支,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體甸赃,經(jīng)...
    沈念sama閱讀 43,586評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,028評論 2 325
  • 正文 我和宋清朗相戀三年冗酿,在試婚紗的時候發(fā)現(xiàn)自己被綠了埠对。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,137評論 1 334
  • 序言:一個原本活蹦亂跳的男人離奇死亡裁替,死狀恐怖鸠窗,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情胯究,我是刑警寧澤稍计,帶...
    沈念sama閱讀 33,783評論 4 324
  • 正文 年R本政府宣布,位于F島的核電站裕循,受9級特大地震影響臣嚣,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜剥哑,卻給世界環(huán)境...
    茶點故事閱讀 39,343評論 3 307
  • 文/蒙蒙 一硅则、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧株婴,春花似錦怎虫、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,333評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至座哩,卻和暖如春徒扶,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背根穷。 一陣腳步聲響...
    開封第一講書人閱讀 31,559評論 1 262
  • 我被黑心中介騙來泰國打工姜骡, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人屿良。 一個月前我還...
    沈念sama閱讀 45,595評論 2 355
  • 正文 我出身青樓圈澈,卻偏偏與公主長得像,于是被迫代替她去往敵國和親尘惧。 傳聞我的和親對象是個殘疾皇子康栈,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 42,901評論 2 345