BDPAppearanceManager.h 4.07 KB
//
//  BDPAppearanceManager.h
//  BDPAppearancer
//
//  Created by hulinling on 2019/7/25.
//  Copyright © 2019 baidu. All rights reserved.
//

#import <UIKit/UIKit.h>

/// 当APP所应用的主题发生变更时,将会发送该通知(若有场景需要进行自定义的操作,可监听该通知,比如:有drawRect的场景;通常不需要监听该通知)
/// @note 不要在接受该通知时,做耗时操作
UIKIT_EXTERN NSString * const BDPAppearanceRefreshUINotification;

/// 当主题切换动画完成时,将会发送该通知
UIKIT_EXTERN NSString * const BDPAppearanceRefreshAnimationFinishNotification;

/// 当发送BDPAppearanceRefreshUINotification、BDPAppearanceRefreshAnimationFinishNotification通知,其中userinfo中存放的是切换前的主题key
UIKIT_EXTERN NSString * const BDPAppearanceRefreshUIUserInfoPreMode;

/// 当发送BDPAppearanceRefreshUINotification、BDPAppearanceRefreshAnimationFinishNotification通知,其中userinfo中存放的切换前的statusBarStyle(值为数字,follow枚举UIStatusBarStyle的定义)
UIKIT_EXTERN NSString * const BDPAppearanceRefreshUIUserInfoPreStatusBarStyle;

/// 深色主题
UIKIT_EXTERN NSString * const BDPAppearanceDarkMode;
/// 默认主题
UIKIT_EXTERN NSString * const BDPAppearanceDefaultMode;


@interface BDPAppearanceManager : NSObject

/// 当前正在使用的主题
@property (nonatomic, readonly) NSString *currentAppearanceMode;
/// 当前主题是否是默认主题
@property (nonatomic, readonly) BOOL isDefaultMode;

/// 当前系统正在使用的主题(iOS13+ 才有值,反之,则为nil)
@property (nonatomic, readonly) NSString *currentSystemAppearanceMode;

/// 是否自动跟随系统主题,设置该属性时,须在主线程中进行;若开启自动跟随,且系统主题跟当前APP的主题不一致时,将自动切换到对应主题
@property (nonatomic, assign) BOOL autoFollowSystemAppearance;

/// 是否根据当前主题模式,控制应用内系统主题模式,默认为YES;(仅 iOS13+的系统才生效)
@property (nonatomic, assign) BOOL controlSystemAppearance;

+ (instancetype)sharedInstance;

/// 配置主题本地存储路径:此方法也可直接初始化主题(若 没有调用 `setupWithAppearanceBundleName`方法配置预置主题资源的话,则用此方法初始化必须保证此路径下有资源色值,该方法的调用只生效一次)
/// 目录的要求: xxx为主路径只需将主路径传进来即可,主路径下的资源路径需要严格按照以下格式
/// - xxx
///  - default
///    -default.plist
///  - dark
///    -dark.plist
///  - xxxMode
///    -xxxMode.plist
/// @param dir 主题本地存储目录(使用方需保证该目录是存在的,否则将不生效)
- (void)setupWithAppearanceDir:(NSString *)dir;

/// 主题 用预置Bundle中的资源进行初始化(预置Bundle里边的目录结构严格按照以下规则,该方法的调用只生效一次)
/// 此方法仅支持预置的资源路径
/// - xxx.bundle
///  - default
///    -default.plist
///  - dark
///    -dark.plist
/// @param bundleName 预置的资源bundleName
- (void)setupWithAppearanceBundleName:(NSString *)bundleName;

/// 切换到指定到主题,需在主线程中执行(切换后,将自动刷新已适配的所有组件的色值、图片为对应主题下的色值、图片)
/// @param appearance 目标主题(若为空,或者找不到对应主题,则忽略当次切换)
- (void)changeToAppearance:(NSString *)appearance;

/// 切换到指定到主题,需在主线程中执行(切换后,将自动刷新已适配的所有组件的色值、图片为对应主题下的色值、图片)
/// @param appearance 目标主题(若为空,或者找不到对应主题,则忽略当次切换)
/// @param impactFeedback 是否需要震动反馈(仅 iOS10+的系统才生效)
- (void)changeToAppearance:(NSString *)appearance needImpactFeedback:(BOOL)impactFeedback;

/// 切换statusBarStyle到匹配当前主题下的正确style
/// @param animated 切换时是否需要动画
- (void)changeStatusBarStyleToCurrentAppearace:(BOOL)animated;

@end