引言:小編的手上有個(gè)導(dǎo)航欄是用系統(tǒng)的導(dǎo)航欄做的項(xiàng)目遮斥,最近由于系統(tǒng)的導(dǎo)航欄爆出了一系列的問題竣况,在使用系統(tǒng)導(dǎo)航欄的時(shí)候這些問題大家應(yīng)該也會遇到克婶,所以在這里將問題和解決方案提出筒严,供大家參考。
問題情形:
一:給導(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];會發(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)橥该鲿?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í)就會造成被導(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)€屬性否則會出現(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í)不會出現(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)返回虏杰。