項(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ì)研究一下上面的第二種方法。