iOS系統(tǒng)導(dǎo)航欄引起的位置、顏色一系列問題

引言:小編的手上有個(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)航欄擋住了一部分

三:在iphone全面屏上使用導(dǎo)航欄跳轉(zhuǎn)到下個(gè)界面時(shí),底部會(huì)先黑一下然后再顯示自己設(shè)置的界面
12312313.jpeg

四:在iOS12系統(tǒng)以上的iPhone上,使用導(dǎo)航欄返回到上個(gè)界面時(shí),標(biāo)簽欄的圖標(biāo)位置會(huì)偏右上然后再移動(dòng)到原始的位置
123123.jpeg

問題解決:
一:顏色有差別是因?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)返回。

UIViewController+BackButtonHandler代碼分析

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

推薦閱讀更多精彩內(nèi)容