UINavigationBar和UIBarButtonItem相关设置

UINavigationBar设置纯色背景

1
2
[nav.navigationBar setBarTintColor:MAIN_COLOR];
[nav.navigationBar setTintColor:MAIN_COLOR];

问题:导航条颜色透明度不是1,颜色略淡。

####UINavigationBar设置为图片

1
2
UIImage *bgImage = [[UIImage createImageWithColor:MAIN_COLOR] resizableImageWithCapInsets:UIEdgeInsetsZero resizingMode:UIImageResizingModeStretch];
[[UINavigationBar appearance] setBackgroundImage:bgImage forBarMetrics:UIBarMetricsDefault];

注意设置为图片后controller视图的位置变化:

当navigationbar显示时,y=0在navigationbar底部,但controller.view的高度不变,所以在controller.view上增加的视图height最大值为controller.view.height - navigationBar.height

当navigationbar隐藏时,y=0在statusBar底部,在controller.view上增加的视图的最大高度为controller.view.height

单独设置某个页面的statusBar样式

假设全局设置statusBar为UIStatusBarStyleLightContent样式,在某个页面需要设置为UIStatusBarStyleDefault样式。可以在这个单独的页面实现:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
-(void)viewWillAppear:(BOOL)animated
{
[super viewWillAppear:animated];
[UIApplication sharedApplication].statusBarStyle = UIStatusBarStyleDefault;
[self setStatusBarBackgroundColor:WHITE_COLOR];
}
-(void)viewWillDisappear:(BOOL)animated
{
[super viewWillDisappear:animated];
[UIApplication sharedApplication].statusBarStyle = UIStatusBarStyleLightContent;
[self setStatusBarBackgroundColor:MAIN_COLOR];
}
//这个方法也可以放在基类controller中,方便多个controller修改statusBar颜色
- (void)setStatusBarBackgroundColor:(UIColor *)color {
UIView *statusBar = [[[UIApplication sharedApplication] valueForKey:@"statusBarWindow"] valueForKey:@"statusBar"];
if ([statusBar respondsToSelector:@selector(setBackgroundColor:)]) {
statusBar.backgroundColor = color;
}
}

UINavigationBar去掉底部阴影

1
2
3
nav.navigationBar.shadowImage = [UIImage new];
//或者
nav.navigationBar.clipToBounds = YES;//不设置statusBar颜色,会导致状态栏颜色和导航条颜色不一致

UINavigationBar title设置

1
[nav.navigationBar setTitleTextAttributes:@{NSFontAttributeName:MAX_FONT,NSForegroundColorAttributeName:WHITE_COLOR}];

UIBarButttonItem设置

一般写法:

1
2
self.navigationItem.leftBarButtonItem = [[UIBarButtonItem alloc] initWithImage:[UIImage imageNamed:@"nav_back"] style:UIBarButtonItemStyleDone target:self action:@selector(navigationBack)];

但是当navigationbar设置为image时,图片颜色的底色会变成蓝色,这时需要写成:

1
2
UIImage *backImg = [[UIImage imageNamed:@"nav_back"] imageWithRenderingMode:UIImageRenderingModeAlwaysOriginal];
self.navigationItem.leftBarButtonItem = [[UIBarButtonItem alloc] initWithImage:backImg style:UIBarButtonItemStyleDone target:self action:@selector(navigationBack)];