關(guān)于隱藏導(dǎo)航欄后的一些問題

項(xiàng)目中“我的”頁(yè)面要求隱藏導(dǎo)航欄,push到下一個(gè)控制器后再讓他出現(xiàn)。實(shí)現(xiàn)方法有很多,主流的有一種是在viewWillAppear和viewWillDisappear里面做文章,另一種push前截屏,用截屏圖片自己做動(dòng)畫。我選擇了第一種,下面說說遇到的問題和解決辦法。

第一種方法最簡(jiǎn)單的做法就是,在界面將要出現(xiàn)時(shí)隱藏導(dǎo)航欄,在將要消失時(shí)顯示導(dǎo)航欄。代碼如下:

- (void)viewWillAppear:(BOOL)animated {

[super viewWillAppear:animated];

[self.navigationController setNavigationBarHidden:YES animated:YES];

}

- (void)viewWillDisappear:(BOOL)animated{

[super viewWillDisappear:animated];

[self.navigationController setNavigationBarHidden:NO animated:YES];

}

這樣做在設(shè)置導(dǎo)航欄隱藏或者顯示的時(shí)候會(huì)面臨一個(gè)選擇,就是要不要?jiǎng)赢?。如果不要?jiǎng)赢?,?dǎo)航欄的隱藏和顯示會(huì)比較突兀,體驗(yàn)不好;如果要?jiǎng)赢?,從其他tabbar回來(lái)的時(shí)候感覺這個(gè)動(dòng)畫很多余。想了一下,解決辦法很簡(jiǎn)單,讓導(dǎo)航欄隱藏或者顯示的動(dòng)畫跟隨界面出現(xiàn)或者隱藏的動(dòng)畫,代碼如下:

- (void)viewWillAppear:(BOOL)animated {

[super viewWillAppear:animated];

[self.navigationController setNavigationBarHidden:YES animated:animated];

}

- (void)viewWillDisappear:(BOOL)animated{

[super viewWillDisappear:animated];

[self.navigationController setNavigationBarHidden:NO animated:animated];

}

做完這些一試,感覺不錯(cuò),該有動(dòng)畫的時(shí)候有動(dòng)畫,不該有的時(shí)候沒有,而且用的系統(tǒng)自帶的方法,效果和性能都能得到保障,很開心。然而在后來(lái)一次測(cè)試的時(shí)候發(fā)現(xiàn),用右劃手勢(shì)從下一個(gè)界面返回的時(shí)候,劃一半再拉回去,有比較大的幾率會(huì)使下一個(gè)控制器的導(dǎo)航欄消失。本以為是方法調(diào)用順序的問題,就在下一個(gè)控制器的viewWillAppear等方法里寫上[self.navigationController setNavigationBarHidden:NO animated:animated];然而沒什么卵用。后來(lái)想可能是系統(tǒng)在執(zhí)行動(dòng)畫后出了什么問題,導(dǎo)致隱藏了導(dǎo)航欄,然后就試著在當(dāng)前控制器里加了這些代碼:

- (void)viewDidDisappear:(BOOL)animated {

[super viewDidDisappear:animated];

dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(0.25 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{

[self.navigationController setNavigationBarHidden:NO];

});

}

為什么延時(shí)時(shí)間是0.25,我猜的。。。。當(dāng)然不是,我記得有人說界面跳轉(zhuǎn)動(dòng)畫時(shí)間是0.25秒,所以用了這個(gè)時(shí)間。加上這個(gè)代碼之后,測(cè)試很久,發(fā)現(xiàn)還真的好用。只不過有些時(shí)候劃一半回到下一個(gè)控制器后,下一個(gè)控制器會(huì)閃一下,這個(gè)體驗(yàn)也不好,那就繼續(xù)想辦法。我覺得會(huì)閃一下是因?yàn)楸緛?lái)系統(tǒng)將導(dǎo)航欄隱藏了,到這里又重新顯示,界面重繪,所以閃一下。要想讓這個(gè)閃動(dòng)消失,除非讓導(dǎo)航欄在下一個(gè)控制器一直是顯示的,這又回到了之前的問題,我還是想想其他辦法,能不能降低這個(gè)閃動(dòng)對(duì)用戶體驗(yàn)的影響。我把目光放在了0.25這個(gè)數(shù)值上,我嘗試降低這個(gè)時(shí)間,發(fā)現(xiàn)這個(gè)數(shù)值越小,閃動(dòng)帶來(lái)的影響也越小。雖然沒有真正消除這個(gè)閃動(dòng),但是我覺得體驗(yàn)上已經(jīng)可以接受了。最終代碼如下:

- (void)viewWillAppear:(BOOL)animated {

[super viewWillAppear:animated];

[self.navigationController setNavigationBarHidden:YES animated:animated];

}

- (void)viewWillDisappear:(BOOL)animated{

[super viewWillDisappear:animated];

[self.navigationController setNavigationBarHidden:NO animated:animated];

}

- (void)viewDidDisappear:(BOOL)animated {

[super viewDidDisappear:animated];

dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(0.01 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{

[self.navigationController setNavigationBarHidden:NO];

});

}

以上代碼只需要寫到需要隱藏導(dǎo)航欄的控制器里就可以了,不用在其他控制器添加代碼,對(duì)其他的控制器影響較小。最終雖然沒有十分完美的解決問題,但是我覺得在用戶體驗(yàn)上已經(jīng)可以接受。當(dāng)然,有空也會(huì)研究一下上面的第二種方法。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • Android 自定義View的各種姿勢(shì)1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 178,765評(píng)論 25 709
  • 發(fā)現(xiàn) 關(guān)注 消息 iOS 第三方庫(kù)、插件、知名博客總結(jié) 作者大灰狼的小綿羊哥哥關(guān)注 2017.06.26 09:4...
    肇東周閱讀 15,045評(píng)論 4 61
  • 上個(gè)月我收到研究生錄取通知書后,在朋友圈發(fā)了一波照片,然后就不斷的有同事朋友大學(xué)同學(xué)問我考研的相關(guān)問題。 問...
    李博識(shí)閱讀 641評(píng)論 1 48
  • 我們經(jīng)??吹揭恍┳C書上,印制著某些老師或者名人名家的手寫簽名或者印章,很拽有沒有。 今天就來(lái)教下大家,如何制作我們...
    Miracle_King閱讀 50,280評(píng)論 0 7
  • 本文來(lái)自微信公眾號(hào)拆書幫(ID:chaishubang) 周末和朋友聚會(huì),茶余飯后是傳統(tǒng)的吐槽節(jié)目。有兩個(gè)故事,引...
    拆書幫閱讀 477評(píng)論 0 1

友情鏈接更多精彩內(nèi)容