[iOS]状态栏和导航栏设置
以前每次新建项目,往往需要在不同控制器中管理不同样式的状态栏和导航栏,若完全重写还是觉得比较麻烦,后面使用创建父类这种方式简便了一些事情。
[XZBaseNavigationController]
#import "XZBaseNavigationController.h"
@implementation XZBaseNavigationController
- (void)viewDidLoad {
[super viewDidLoad];
// 设置透明,默认为NO控制器中y=0实际效果上=64,设置为YES时控制器中y=0实际效果上y=0
[self.navigationBar setTranslucent:NO];
// 字体颜色
[self.navigationBar setTitleTextAttributes:@{NSFontAttributeName:[UIFont systemFontOfSize:15],NSForegroundColorAttributeName:SE_NavTxtColor}];
// 背景颜色
// [self.navigationBar setBackgroundColor:SE_NavBackgroundColor];
// 背景图片
[self.navigationBar setBackgroundImage:[self createImageWithColor:SE_NavBackgroundColor] forBarMetrics:UIBarMetricsDefault];
// 底部分割线
[self.navigationBar setShadowImage:[UIImage new]];
}
/**
将UIColor转换成图片
*/
- (UIImage*)createImageWithColor:(UIColor*)color {
CGRect rect = CGRectMake(0.0f, 0.0f, 1.0f, 1.0f);
UIGraphicsBeginImageContext(rect.size);
CGContextRef context = UIGraphicsGetCurrentContext();
CGContextSetFillColorWithColor(context, [color CGColor]);
CGContextFillRect(context, rect);
UIImage *newImage = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
return newImage;
}
@end
[XZBaseViewController]
#import <UIKit/UIKit.h>
@interface XZBaseViewController : UIViewController
/// 设置状态栏背景颜色
- (void)setStatusBarBackgroundColor:(UIColor *)color;
@end
#import "XZBaseViewController.h"
@implementation XZBaseViewController
- (void)viewDidLoad {
[super viewDidLoad];
// 先设置测滑代理
self.navigationController.interactivePopGestureRecognizer.delegate = (id)self;
// 将系统自带的滑动手势打开
self.navigationController.interactivePopGestureRecognizer.enabled = YES;
// 控制器默认背景颜色
self.view.backgroundColor = SE_VCBackgroundColor;
// 状态栏背景色
[self setStatusBarBackgroundColor:SE_NavBackgroundColor];
// 禁止自动适配 否则从导航栏返回可能会下移动
// self.automaticallyAdjustsScrollViewInsets = NO;
// 设置返回按钮
UIButton *btn = [UIButton buttonWithType:UIButtonTypeCustom];
[btn addTarget:self action:@selector(returnAction:) forControlEvents:UIControlEventTouchUpInside];
[btn setImage:[UIImage imageNamed:@"返回.png"] forState:UIControlStateNormal];
btn.contentHorizontalAlignment = UIControlContentHorizontalAlignmentLeft;
btn.contentVerticalAlignment = UIControlContentVerticalAlignmentCenter;
self.navigationItem.leftBarButtonItem = [[UIBarButtonItem alloc] initWithCustomView:btn];
}
/**
返回按钮响应
*/
- (void)returnAction:(id)sender {
[self.navigationController popViewControllerAnimated:YES];
}
#pragma mark 状态栏
/**
设置状态栏背景颜色
*/
- (void)setStatusBarBackgroundColor:(UIColor *)color {
UIView *statusBar = [[[UIApplication sharedApplication] valueForKey:@"statusBarWindow"] valueForKey:@"statusBar"];
if ([statusBar respondsToSelector:@selector(setBackgroundColor:)]) {
statusBar.backgroundColor = color;
}
}
/**
设置状态栏样式
需要改变状态栏颜色的控制器只需要重写此方法return 0||1
若控制器被添加到导航,那么导航栏未隐藏时无法在控制器中编辑状态栏样式。
*/
- (UIStatusBarStyle)preferredStatusBarStyle {
return UIStatusBarStyleDefault;
}
/**
设置状态栏是否隐藏
需要隐藏状态栏的控制器只需要重写此方法return YES || NO
若控制器被添加到导航,那么导航栏未隐藏时无法在控制器中编辑状态栏样式。
*/
- (BOOL)prefersStatusBarHidden {
return NO;
}
/**
设置状态栏隐藏动画
*/
- (UIStatusBarAnimation)preferredStatusBarUpdateAnimation {
return UIStatusBarAnimationNone;
}
@end
示意图:
未加入导航的控制器,可以改变状态栏样式。
加入导航的控制器,未隐藏导航栏时无法编辑状态栏样式。
加入导航的控制器,隐藏导航栏后编辑状态栏样式。
来源:CSDN
作者:枫志应明
链接:https://blog.csdn.net/u012881779/article/details/79131795