引言:小編的手上有個(gè)導(dǎo)航欄是用系統(tǒng)的導(dǎo)航欄做的項(xiàng)目,最近由于系統(tǒng)的導(dǎo)航欄爆出了一系列的問題,在使用系統(tǒng)導(dǎo)航欄的時(shí)候這些問題大家應(yīng)該也會(huì)遇到,所以在這里將問題和解決方案提出,供大家參考。
問題情形:
一:給導(dǎo)航欄設(shè)置顏色發(fā)現(xiàn)與自己設(shè)置的顏色有差別
二:設(shè)置界面被導(dǎo)航欄擋住了一部分
問題解決:
一:顏色有差別是因?yàn)橄到y(tǒng)導(dǎo)航欄默認(rèn)有一層蒙層
解決辦法:
1.添加下面這句就能解決問題
[[UINavigationBar appearance] setTranslucent:NO];
2.有些人說使用下面這句也能解決問題
self.navigationController.navigationBar.translucent = NO;
這句看起來貌似和上句設(shè)置的屬性是同一個(gè),其實(shí)還是有差別的
差別一:兩句生效的時(shí)機(jī)不同,在控制器中添加了[[UINavigationBar appearance] setTranslucent:NO];會(huì)發(fā)現(xiàn)導(dǎo)航欄顏色沒有問題了,但是添加了self.navigationController.navigationBar.translucent = NO;卻發(fā)現(xiàn)顏色跟沒設(shè)置這個(gè)屬性時(shí)一樣,還是有問題,好像這句代碼并沒有生效一樣。
是的,確實(shí)是這句代碼沒生效。具體原因小編也沒搞懂,希望大神們能解惑。小編猜測可能是這句代碼寫在- (void)viewDidLoad 這個(gè)方法時(shí)導(dǎo)航欄還沒初始化,所以導(dǎo)致這句代碼沒生效。
解決方案:
在視圖將要出現(xiàn)是設(shè)置這個(gè)屬性就能生效。使用這個(gè)方法的一定要注意了,是在視圖將要出現(xiàn)的時(shí)候添加這個(gè)方法!
- (void)viewWillAppear:(BOOL)animated
{
self.navigationController.navigationBar.translucent = NO;
}
差別二:
self.navigationController.navigationBar.translucent = NO;能解決導(dǎo)航欄透明問題。
[[UINavigationBar appearance] setTranslucent:NO];不能解決導(dǎo)航欄透明問題
因?yàn)橥该鲿?huì)導(dǎo)致下面的這個(gè)問題
二:界面被導(dǎo)航欄擋住了一部分是因?yàn)閷?dǎo)航欄透明屬性導(dǎo)致的
第一個(gè)問題在解決顏色問題時(shí)用到了self.navigationController.navigationBar.translucent = NO;
這個(gè)屬性除了能解決顏色問題還能解決導(dǎo)航欄遮擋問題。
系統(tǒng)默認(rèn)這個(gè)屬性為YES,導(dǎo)航欄為透明。當(dāng)導(dǎo)航欄為透明時(shí),controller中self.view的原點(diǎn)是從導(dǎo)航欄左上角開始計(jì)算,所以當(dāng)在設(shè)置控件的位置不注意時(shí)就會(huì)造成被導(dǎo)航欄遮擋一部分。
當(dāng)設(shè)為NO時(shí),導(dǎo)航欄為不透明,controller中self.view的原點(diǎn)是從導(dǎo)航欄左下角開始計(jì)算。所以當(dāng)發(fā)現(xiàn)被遮擋時(shí),設(shè)置這個(gè)屬性為NO就能解決被遮擋問題。
三:在iOS11以后出現(xiàn)了全面屏,蘋果增加了安全區(qū)域概念,在iOS11以上的版本中的tabview和webview都需要設(shè)置下面?zhèn)€屬性否則會(huì)出現(xiàn)這個(gè)問題
if (@available(iOS 11.0, *)) {
self.webView.scrollView.contentInsetAdjustmentBehavior = UIScrollViewContentInsetAdjustmentNever;
//self.tabview.scrollView.contentInsetAdjustmentBehavior = UIScrollViewContentInsetAdjustmentNever;
}
四:在iOS12以上出現(xiàn)這個(gè)問題,是因?yàn)槭褂孟到y(tǒng)導(dǎo)航欄默認(rèn)的返回導(dǎo)致的。當(dāng)自己使用[self.navigationController popViewControllerAnimated:NO];返回時(shí)不會(huì)出現(xiàn)這種情況。所以解決方案是,不使用系統(tǒng)導(dǎo)航欄的返回,但需要返回時(shí)自己使用[self.navigationController popViewControllerAnimated:NO];返回。
解決方案:
1.導(dǎo)航欄上的返回按鈕不使用系統(tǒng)的,自己添加按鈕,在返回按鈕的點(diǎn)擊事件里使用[self.navigationController popViewControllerAnimated:NO];返回上個(gè)界面
2.如果使用系統(tǒng)的返回可以先攔截系統(tǒng)的返回事件,然后再重寫返回方法,使用[self.navigationController popViewControllerAnimated:NO];返回。
下載UIViewController+BackButtonHandler將UIViewController+BackButtonHandler.h和.m文件放到項(xiàng)目中,導(dǎo)入#import "UIViewController+BackButtonHandler.h"添加下面這個(gè)方法
// 截取系統(tǒng)返回事件
- (BOOL)navigationShouldPopOnBackButton{
[self.navigationController popViewControllerAnimated:NO];
return NO;
}
這個(gè)方法是攔截系統(tǒng)的返回事件,并使用[self.navigationController popViewControllerAnimated:NO];返回。NO是不允許系統(tǒng)返回,YES是允許系統(tǒng)返回。