去除导航栏的背景色和底部1像素黑色线条or隐藏导航栏
?一般項目我們都用創(chuàng)建一個公用的導(dǎo)航控制器,然后定義我們所需要的一些按鈕啊 樣式啊 等
- (void)pushViewController:(UIViewController *)viewController animated:(BOOL)animated {if (self.childViewControllers.count) {//這里可以自定義返回按鈕 }[super pushViewController:viewController animated:animated]; }但是呢 ,我們有些控制器的的導(dǎo)航欄樣式需要有所不一樣,比如標(biāo)題所提到的我們需要導(dǎo)航欄背景透明和去掉底部黑線
解決方式為:在當(dāng)前控制器
- (void)viewWillAppear:(BOOL)animated添加兩行代碼
[self.navigationController.navigationBar setBackgroundImage:[UIImage new] forBarMetrics:UIBarMetricsDefault]; [self.navigationController.navigationBar setShadowImage:[UIImage new]];運行之后發(fā)現(xiàn)導(dǎo)航欄的背景和黑線確實沒有了 (內(nèi)容比較簡單,就不上圖了), 正在你準(zhǔn)備歡呼的時候,確發(fā)現(xiàn)一點擊返回或者push到下一個控制器的時候,連其他控制器的導(dǎo)航欄都透明了,所以,我們需要做的事情是,在要退出當(dāng)前控制器的時候,需要重新設(shè)會默認(rèn)的樣式
原先還在納悶,我到底該怎么設(shè)回原來的值呢? 最后嘗試了一下把image都設(shè)置為nil ?就可以了 估計是系統(tǒng)內(nèi)部自己會做判斷,有傳就顯示 ?沒傳就用默認(rèn)值
解決方式為:在當(dāng)前控制器
- (void)viewWillDisappear:(BOOL)animated添加以下代碼
[self.navigationController.navigationBar setBackgroundImage:nil forBarMetrics:UIBarMetricsDefault]; [self.navigationController.navigationBar setShadowImage:nil];,
以上講到到的方法會去掉背景色和黑線 ,如果只是單純的要去掉黑線有種比較暴力的方法就是遍歷導(dǎo)航欄,因為那條黑線其實是UIImageView,所以我們可以這么做:
- (void)viewWillAppear:(BOOL)animated {[super viewWillAppear:animated];if ([self.navigationController.navigationBar respondsToSelector:@selector( setBackgroundImage:forBarMetrics:)]){NSArray *list=self.navigationController.navigationBar.subviews;for (id obj in list){if ([UIDevice currentDevice].systemVersion.floatValue >= 10.0){//10.0的系統(tǒng)字段不一樣UIView *view = (UIView*)obj;for (id obj2 in view.subviews) {if ([obj2 isKindOfClass:[UIImageView class]]){UIImageView *image = (UIImageView*)obj2;if (image.height <= 1) {image.hidden = YES;}}}}}} }遍歷會發(fā)現(xiàn)UIImageView有兩個,所以我這里做判斷,只要隱藏黑線.
如果用的是公用的導(dǎo)航欄,當(dāng)我們push到別的控制器或者進(jìn)行pop的是時候,依然會影響到其他控制器的導(dǎo)航欄,如果不想影響到其他控制器,我們還是在
- (void)viewWillDisappear:(BOOL)animated 方法里面在一次遍歷,然后把hidden改為NO
?
這里做下另一個需求的補(bǔ)充,假設(shè)我們需要隱藏整個導(dǎo)航欄,根究不同情況我們可以這么做:
1, ?設(shè)置隱藏和顯示: 在需要隱藏導(dǎo)航欄的控制器里面添加如下代碼, (該方法會導(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];}2, 設(shè)置透明度: 在該控制器做如下設(shè)置, 這個方法會導(dǎo)致手勢要返回上個控制器的時候會突然顯示出導(dǎo)航欄, ?也許我們需要實時監(jiān)聽手的觸摸點與屏寬的比例來漸進(jìn)的設(shè)置?navigationBar.alpha ?數(shù)值
- (void)viewWillAppear:(BOOL)animated {[super viewWillAppear:animated];self.navigationController.navigationBar.alpha = 0; }- (void)viewWillDisappear:(BOOL)animated {[super viewWillDisappear:animated];self.navigationController.navigationBar.alpha = 1.0;}?
end!
?
轉(zhuǎn)載于:https://www.cnblogs.com/yulongjiayuan/p/6694571.html
總結(jié)
以上是生活随笔為你收集整理的去除导航栏的背景色和底部1像素黑色线条or隐藏导航栏的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: MyEclipse设置文件编码
- 下一篇: 表单验证以及下拉框应用