BaseNaviController.m 4.3 KB
//
//  BaseNaviController.m
//  DreamSleep
//
//  Created by peter on 2022/4/9.
//

#import "BaseNaviController.h"

@interface BaseNaviController ()
@end

@implementation BaseNaviController

- (void)viewDidLoad {
    [super viewDidLoad];
    
    // 设置导航栏返回按钮颜色
    self.navigationBar.tintColor = DSWhite;
}

- (void)pushViewController:(UIViewController *)viewController animated:(BOOL)animated {
    if (self.viewControllers.count > 0) {
        viewController.hidesBottomBarWhenPushed = YES;
    }
    [super pushViewController:viewController animated:animated];
}

+ (void)setNavigationBarStyle:(NaviStyle)style vc:(UIViewController *)vc {
    UINavigationBar *naviBar = vc.navigationController.navigationBar;
    // NaviStyleDefault
    UIColor *titleColor = DSWhite;
    UIColor *bgColor = BrandColor;
    // 二级导航栏需要适配白天和黑夜模式(最后才告诉我有这个需求)
    if (vc.navigationController.viewControllers.count > 1) {
        titleColor = [vc.dk_manager.themeVersion isEqualToString:DKThemeVersionNormal] ? DSWhite : DkTitleColor;
        bgColor = [vc.dk_manager.themeVersion isEqualToString:DKThemeVersionNormal] ? BrandColor : SubNaviDarkColor;
    }
    UIColor *barTintColor = BrandColor;
    if (style == NaviStyleLight) {
        titleColor = MainTextColor;
        bgColor = DSWhite;
        barTintColor = DSWhite;
    } else if (style == NaviStyleDark) {
        titleColor = DSWhite;
        bgColor = DarkColor;
        barTintColor = DarkColor;
    }
    
    // 设置导航栏title颜色、导航栏背景色、隐藏分割线
    NSDictionary *titleTextAttributes = @{NSForegroundColorAttributeName:titleColor};
    if (@available(iOS 13.0, *)) {
        UINavigationBarAppearance *appearance = [UINavigationBarAppearance new];
        // 导航栏title颜色
        appearance.titleTextAttributes = titleTextAttributes;
        // 导航栏背景色
        appearance.backgroundColor = bgColor;
        // 隐藏分割线
        appearance.shadowColor = DSClearColor;
        // 生效
        naviBar.scrollEdgeAppearance = appearance;
        // 滚动视图滚动后导航栏背景色不会被影响
        naviBar.standardAppearance = appearance;
        // view的原点坐标在导航栏下面
        naviBar.translucent = NO;
    } else {
        // 导航栏title颜色
        [naviBar setTitleTextAttributes:titleTextAttributes];
        // 导航栏背景色 && view的原点坐标在导航栏下面
        naviBar.barTintColor = barTintColor;
        naviBar.translucent = NO;
        // 隐藏分割线
        naviBar.shadowImage = [UIImage new];
    }
}

/*
 状态栏风格设置:
 1、如果UIViewController由导航控制器管理,则状态栏风格由导航栏preferredStatusBarStyle决定;
 2、如果UIViewController没有由导航控制器管理,则需要单独在控制器种进行设置
 
 //#pragma mark - 设置状态栏文字颜色
 //- (UIStatusBarStyle)preferredStatusBarStyle {
 //    return UIStatusBarStyleLightContent;
 //}
 
 //#pragma mark - 隐藏状态栏
 //- (BOOL)prefersStatusBarHidden {
 //    return YES;
 //}
 */
- (UIStatusBarStyle)preferredStatusBarStyle {
    // 白天和黑夜2种模式
    UIStatusBarStyle barStyle = [self.dk_manager.themeVersion isEqualToString:DKThemeVersionNormal] ? UIStatusBarStyleDefault : UIStatusBarStyleLightContent;
    // 处理我的页面状态栏
    if (kGetUserDefaultsBOOL(ThemeAutoSwitch)) {
        barStyle = ([NSDate judgeTimeWithStartTime:StartTime1 expireTime:ExpireTime1] || [NSDate judgeTimeWithStartTime:StartTime2 expireTime:ExpireTime2]) ? UIStatusBarStyleLightContent : UIStatusBarStyleDefault;
    }
    
    // 默认风格模式(控制器重写navigationBarStyle方法)
    UIViewController* topVC = self.topViewController;
    if ([topVC respondsToSelector:@selector(navigationBarStyle)]) {
        NaviStyle sty = (NaviStyle)[topVC performSelector:@selector(navigationBarStyle)];
        if (sty == NaviStyleDefault) {
            barStyle = UIStatusBarStyleLightContent;
        } else if (sty == NaviStyleDark) {
            barStyle = UIStatusBarStyleLightContent;
        }
    }
    return barStyle;
}

#pragma mark - 刘海屏出现无法隐藏状态栏bug
- (BOOL)prefersStatusBarHidden {
    return self.topViewController.prefersStatusBarHidden;
}

@end