我們可以通過兩個(gè)系統(tǒng)提供的方法很方便的修改導(dǎo)航欄的顏色碰纬,直接設(shè)置一個(gè)顏色:
[self.navigationController.navigationBar setBarTintColor:[UIColor greenColor]];
也可以設(shè)置一張背景圖片:
UIImage *image = [UIImage imageFromColor:[UIColor greenColor] withSize:CGSizeMake(kWidth, kStatus_h + 44.f)];
[self.navigationController.navigationBar setBackgroundImage:image forBarMetrics:UIBarMetricsDefault];
這里用到一個(gè)自己添加的方法和兩個(gè)宏伙判。
+ (UIImage *)imageFromColor:(UIColor *)color withSize:(CGSize)size
{
CGRect rect=CGRectMake(0.0f, 0.0f, size.width, size.height);
UIGraphicsBeginImageContext(rect.size);
CGContextRef context = UIGraphicsGetCurrentContext();
CGContextSetFillColorWithColor(context, [color CGColor]);
CGContextFillRect(context, rect);
UIImage *theImage = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
return theImage;
}
這是干啥的看方法名就能明白了吧猿妈,你可以新建UIImage的Category倔幼,把這個(gè)方法加進(jìn)去监氢,說(shuō)不定以后還能用到~
還有這兩個(gè)宏
//獲取屏幕高度
#define kWidth [UIScreen mainScreen].bounds.size.width
//獲取狀態(tài)欄高度
#define kStatus_h? [[UIApplication sharedApplication] statusBarFrame].size.height
在iPhone X出來(lái)之前绎谦,狀態(tài)欄高度都是固定20,現(xiàn)在要添加一個(gè)宏來(lái)動(dòng)態(tài)獲取了竭钝。
這兩個(gè)方法目前的效果是一樣的梨撞,如下圖雹洗。
這時(shí)候如果有需求想要修改導(dǎo)航欄分割線的顏色呢香罐? 通常我們通過修改UINavigationBar的?shadowImage屬性來(lái)設(shè)置分割線。
下面是頭文件里對(duì)shadowImage屬性的描述
/* Default is nil. When non-nil, a custom shadow image to show instead of the default shadow image. For a custom shadow to be shown, a custom background image must also be set with -setBackgroundImage:forBarMetrics: (if the default background image is used, the default shadow image will be used). */ @property(nullable, nonatomic,strong) UIImage *shadowImage NS_AVAILABLE_IOS(6_0) UI_APPEARANCE_SELECTOR;
@property(nullable, nonatomic,strong) UIImage *shadowImage?
大致意思时肿,你如果要通過設(shè)置這個(gè)屬性來(lái)修改分割線庇茫,那么你要同時(shí)通過setBackgroundImage:forBarMetrics:為UINavigationBar設(shè)置一個(gè)背景圖片,這樣你設(shè)置的分割線樣式才能生效螃成。一開始我是不信的旦签,那我們來(lái)試一下。
//通過設(shè)置BarTintColor為 navigationBar設(shè)置白色背景顏色寸宏,不通過setBackgroundImage:forBarMetrics:為UINavigationBar設(shè)置背景圖片
[self.navigationController.navigationBar setBarTintColor:[UIColor whiteColor]];
//通過設(shè)置shadowImage為 navigationBar設(shè)置紅色分割線
UIImage *lineImage = [UIImage imageFromColor:[UIColor redColor] withSize:CGSizeMake(kWidth, 0.5f)];
[self.navigationController.navigationBar setShadowImage:lineImage];
我們?cè)O(shè)置的紅色分割線并沒有生效宁炫,而是默認(rèn)的黑色。
還是乖乖聽話氮凝,同時(shí)用-setBackgroundImage:forBarMetrics:方法設(shè)置背景顏色羔巢。
//通過設(shè)置-setBackgroundImage:forBarMetrics:方法設(shè)置白色背景顏色
//通過設(shè)置-setBackgroundImage:forBarMetrics:方法設(shè)置白色背景顏色
UIImage *bgimage = [UIImage imageFromColor:[UIColor whiteColor] withSize:CGSizeMake(kWidth, kStatus_h + 44.f)];
[self.navigationController.navigationBar setBackgroundImage:bgimage forBarMetrics:UIBarMetricsDefault];
//通過設(shè)置shadowImage為 navigationBar設(shè)置紅色分割線
UIImage *lineImage = [UIImage imageFromColor:[UIColor redColor] withSize:CGSizeMake(kWidth, 0.5f)];
[self.navigationController.navigationBar setShadowImage:lineImage];
果然分割線變成了紅色。
總結(jié):
你可以這樣設(shè)置微導(dǎo)航欄設(shè)置背景顏色罩阵,或者是各種圖案竿秆。
//通過設(shè)置BarTintColor為 navigationBar設(shè)置背景顏色
[self.navigationController.navigationBar setBarTintColor:[UIColor whiteColor]];
//通過-setBackgroundImage:forBarMetrics:方法設(shè)置白色背景顏色
UIImage *bgimage = [UIImage imageFromColor:[UIColor whiteColor] withSize:CGSizeMake(kWidth, kStatus_h + 44.f)];
[self.navigationController.navigationBar setBackgroundImage:bgimage forBarMetrics:UIBarMetricsDefault];
但是如果你想同時(shí)設(shè)置背景樣式和分割線顏色,你只能通過-setBackgroundImage:forBarMetrics:方法來(lái)設(shè)置你的背景稿壁,否則你通過設(shè)置shadowImage屬性修改分割線樣式就不會(huì)生效幽钢。
單是如果你是一個(gè)剛烈的孩子,一定要通過設(shè)置barTintColor修改背景顏色傅是,還想修改分割線顏色的話匪燕,方法是有的蕾羊。通過遍歷UINavigationBar找到那條分割線,并且直接修改帽驯《遣颍或者隱藏原來(lái)的分割線,自定義一條分割線界拦。
你問我具體怎么實(shí)現(xiàn)吸申??
https://www.baidu.com
以上代碼都是在iOS 10.3.1 上的模擬器運(yùn)行。后來(lái)我發(fā)現(xiàn)享甸,在iOS11和以上的設(shè)備上已經(jīng)不需要使用
-setBackgroundImage:forBarMetrics:方法設(shè)置背景圖片才能通過設(shè)置shadowImage修改分割線樣式了截碴。
不設(shè)置BackgroundImage,直接設(shè)置shadowImage也能修改分割線的樣式蛉威,大家可以自己試一試日丹。不過為了適配iOS11以下的設(shè)備,還是需要同時(shí)設(shè)置背景圖片~