[iOS]状态栏和导航栏设置

心不动则不痛 提交于 2019-12-02 13:59:37
[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

示意图:
未加入导航的控制器,可以改变状态栏样式。
加入导航的控制器,未隐藏导航栏时无法编辑状态栏样式。
加入导航的控制器,隐藏导航栏后编辑状态栏样式。



易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!