————————————————
謹以此文章獻給NavigationBar下神秘消失的黑線
關(guān)鍵詞:NavigationBar、TabBar、ShadowImage
在一次閑來無聊隨便把玩我們這個已經(jīng)做好許久的項目的時候骂际,忽然發(fā)現(xiàn)了一個有趣的事情。經(jīng)過一系列特定復雜操作的過程之后进倍,NavigationBar下的那條神秘的下劃線福侈,離奇的消失了。通過使用各種“奇技淫巧”谈飒,“反復推敲”岂座,并在“玄學”的超能力加持下,終于恍然大悟的解決了這個小的連測試都沒發(fā)現(xiàn)的小小Bug杭措。在此僅做一下筆記费什,并不討論其中的原理,以此對遇到類似問題的同學們以參考手素。
神秘消失的線
由于項目比較大鸳址,并且各個模塊都有專門的同事加工瘩蚪,所以對NavigationBar的操作避免不了的出現(xiàn)了一些沖突。有的讓導航欄消失稿黍,有的讓導航欄透明疹瘦,有的自定義導航欄按鈕,有的讓導航欄……巡球,這可是苦了導航欄了言沐。
這次的錯誤發(fā)現(xiàn)經(jīng)過了以下幾個步驟:
1.TabA_RootVC 系統(tǒng)導航欄 --> 2.MWPhotoBrowser --> 3.導航欄隱藏 --> 4.Home鍵返回 --> 5.3DTouch進入(進入到TabB,自動跳轉(zhuǎn)到MWPhotoBrowser)--> 6.MWPhotoBrowser返回到TabB_RootVC --> 7.選擇TabA_RootVC
這個時候發(fā)現(xiàn)TabA_RooTVC里導航欄下的那條線消失了酣栈,頓時手足無措险胰。莫名其妙的不知如何是好。
經(jīng)過觀察和研究钉嘹,一次偶然鸯乃,我發(fā)現(xiàn)那條神秘消失的黑線其實并沒有消失,只是顏色變的和背景色及其相似跋涣,以至于沒有發(fā)現(xiàn)的緣故缨睡。
而線條顏色的變化,可能和這一系列過程中使用的如下各種方法可能有內(nèi)在的聯(lián)系陈辱。
[self.navigationController.navigationBar setShadowImage:[UIImage new]];
navBar.shadowImage = nil;
[[UINavigationBar appearance] setShadowImage:[UIImage new]];
[self.navigationController.navigationBar lt_reset];
[self.navigationController.navigationBar lt_setBackgroundColor:[UIColor clearColor]];
調(diào)用了很多方法奖年,不一而足。
說了這么多的廢話沛贪,除了此時此刻的我時間充足外陋守,還有一個原因,那就是我好想找到了解決問題的一個方法了利赋。請參照上面第N行的一句話:“黑線其實并沒有消失水评,只是顏色變的和背景色及其相似,以至于沒有發(fā)現(xiàn)的緣故”媚送。對中燥,這就是解決問題的切入點。
那么塘偎,以下的主題可以描述為修改NavigationBar下劃線的顏色疗涉。
修改NavigationBar下劃線的顏色
首先,寫了一個UIImage的類方法
UIImage+Common.h
/**
* 生成指定圖片尺寸的純色圖片
* @param color 顏色變?yōu)閳D片 size 圖片尺寸
* @return 新的Image
*/
+(UIImage *)imageWithColor:(UIColor *)color size:(CGSize)size;
UIImage+Common.m
+ (UIImage *)imageWithColor:(UIColor *)color size:(CGSize)size {
if (!color || size.width <=0 || size.height <=0)
return nil;
CGRect rect = CGRectMake(0.0f, 0.0f, size.width, size.height);
UIGraphicsBeginImageContextWithOptions(rect.size,NO, 0);
CGContextRef context =UIGraphicsGetCurrentContext();
CGContextSetFillColorWithColor(context, color.CGColor);
CGContextFillRect(context, rect);
UIImage *image =UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
return image;
}
其次吟秩,在TabA_RootVC的viewWillAppear:方法中咱扣,或是等效的其他地方,添加如下代碼:
UIImage *colorImage = [UIImage imageWithColor:[UIColor colorWithRed:0 green:0 blue:0 alpha:0.3] size:CGSizeMake(kScreen_Width, 0.34)];
[self.navigationController.navigationBar setShadowImage:colorImage];
顏色和尺寸是參照黑線沒有消失的時候的狀態(tài)添加的涵防。
同樣的闹伪,UITabBar上的那條線也可以通過這種方法進行修改,按照需求改變。改變成你想要的顏色祭往。在這里伦意,同樣也要說一下將NavigationBar下的線去除的方法。
NavigationBar導航欄底部與self.view的分界線的隱藏
第一種方法:不會影響導航欄translucent 半透明的顯示
#define iOS10 ([[UIDevice currentDevice].systemVersion intValue]>=10?YES:NO)
- (void)viewWillAppear:(BOOL)animated{
[super viewWillAppear:animated];
[self.navigationController.navigationBar.subviews enumerateObjectsUsingBlock:^(UIView *view, NSUInteger idx, BOOL *stop) {
if (iOS10) {
//iOS10,導航欄的私有接口為_UIBarBackground
if ([view isKindOfClass:NSClassFromString(@"_UIBarBackground")]) {
[view.subviews firstObject].hidden = YES;
}
}else{
//iOS10之前導航欄的私有接口為_UINavigationBarBackground
if ([view isKindOfClass:NSClassFromString(@"_UINavigationBarBackground")]) {
[view.subviews firstObject].hidden = YES;
}
}
}];
}
第二種方法:會刪除導航欄 translucent 半透明的顯示
[self.navigationController.navigationBar setBackgroundImage:[UIImage imageNamed:@"你想要的圖片"] forBarPosition:UIBarPositionAny barMetrics:UIBarMetricsDefault];
[self.navigationController.navigationBar setShadowImage:[UIImage new]];
第三種方法:精簡版通用
- (void)viewWillAppear:(BOOL)animated{
[super viewWillAppear:animated];
if (self.navigationController.navigationBar.translucent) {
// translucent = YES
self.navigationController.navigationBar.subviews[0].subviews[1].hidden = YES;
} else {
// translucent = NO
self.navigationController.navigationBar.subviews[0].subviews[0].hidden = YES;
}
}
后記
其實硼补,我遇到的那個問題的根本原因可能是navigationBar的barStyle這個屬性的變化引起的驮肉,在viewWillAppear:方法中,將barStyle重置
self.navigationController.navigationBar.barStyle = UIBarStyleDefault;
同樣可以解決此時遇到的問題已骇,但是我還是想寫一篇文章來修改修改NavigationBar下劃線的顏色离钝。不允許嗎?褪储?哼~