DKNightVersion框架、重写管理类 & 控件的分类!--可重写
{ 使用GCD、runtime、delegate等 & 工具类的创建 }
================
1、管理类的头文件 NightVersionManager.h
定义宏,通过RGB获取颜色!
#define UIColorFromRGB(rgbValue) [UIColor colorWithRed:((float)((rgbValue & 0xFF0000) >> 16))/255.0 green:((float)((rgbValue & 0xFF00) >> 8))/255.0 blue:((float)(rgbValue & 0xFF))/255.0 alpha:1.0]
定义头文件.h
typedef enum : NSUInteger { DKThemeVersionNormal, DKThemeVersionNight, } DKThemeVersion; extern NSString *const DKNightVersionNightFallingNotification; extern NSString *const DKNightVersionDawnComingNotification; extern CGFloat const DKNightVersionAnimationDuration; @interface DKNightVersionManager : NSObject + (DKThemeVersion)currentThemeVersion; + (void)nightFalling; + (void)dawnComing; + (BOOL)useDefaultNightColor; + (void)setUseDefaultNightColor:(BOOL)use;
2、核心代码 NightVersionManager.m
2.1 单例、保证工具类对象,只被分配一次内存
+ (DKNightVersionManager *)sharedNightVersionManager { static dispatch_once_t once; static DKNightVersionManager *instance; dispatch_once(&once, ^{ instance = [self new]; instance.useDefaultNightColor = YES; }); return instance; }
2.2 设置主题的版本
- (void)setThemeVersion:(DKThemeVersion)themeVersion { if (_themeVersion == themeVersion) { // if type does not change, don't execute code below to enhance performance. return; } _themeVersion = themeVersion; [self changeColor:[[UIApplication sharedApplication].delegate.window.subviews firstObject]]; }
2.3 改变颜色--委托
- (void)changeColor:(id <DKNightVersionSwichColorProtocol>)object { if ([object respondsToSelector:@selector(changeColor)]) { [object changeColor]; } if ([object respondsToSelector:@selector(subviews)]) { if (![object subviews]) { // Basic case, do nothing. return; } else { for (id subview in [object subviews]) { // recursice darken all the subviews of current view. [self changeColor:subview]; if ([subview respondsToSelector:@selector(changeColor)]) { [subview changeColor]; } } } } }
2.4 设置模式的颜色
+ (BOOL)useDefaultNightColor { return self.sharedNightVersionManager.useDefaultNightColor; } + (void)setUseDefaultNightColor:(BOOL)use { [self.sharedNightVersionManager setUseDefaultNightColor:use]; }
3、控件分类(UIButton、UILabel、UIScrollView等)
3.1 UIButton+NightVersion.m
- (void)changeColor { [UIView animateWithDuration:DKNightVersionAnimationDuration animations:^{ [self setTitleColor:([DKNightVersionManager currentThemeVersion] == DKThemeVersionNight) ? self.nightTitleColor : self.normalTitleColor forState:UIControlStateNormal]; [self setBackgroundColor:([DKNightVersionManager currentThemeVersion] == DKThemeVersionNight) ? self.nightBackgroundColor : self.normalBackgroundColor]; [self setTintColor:([DKNightVersionManager currentThemeVersion] == DKThemeVersionNight) ? self.nightTintColor : self.normalTintColor]; }]; }
3.2 UIButton+TitleColor.m
> 加载时GCD,保证线程安全。
> runtime运行时,SEL & Method的使用。
+ (void)load { static dispatch_once_t onceToken; dispatch_once(&onceToken, ^{ Class class = [self class]; SEL originalSelector = @selector(setTitleColor:forState:); SEL swizzledSelector = @selector(hook_setTitleColor:forState:); Method originalMethod = class_getInstanceMethod(class, originalSelector); Method swizzledMethod = class_getInstanceMethod(class, swizzledSelector); BOOL didAddMethod = class_addMethod(class, originalSelector, method_getImplementation(swizzledMethod), method_getTypeEncoding(swizzledMethod)); if (didAddMethod){ class_replaceMethod(class, swizzledSelector, method_getImplementation(originalMethod), method_getTypeEncoding(originalMethod)); } else { method_exchangeImplementations(originalMethod, swizzledMethod); } }); }
设置默认的标题颜色
- (UIColor *)defaultNightTitleColor { if ([self isMemberOfClass:[UIButton class]]) { return UIColorFromRGB(0x5F80AC); } else { UIColor *resultColor = self.normalTitleColor ?: [UIColor clearColor]; return resultColor; } }
4、Test测试
4.1 AppDelegate.m
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]]; // Override point for customization after application launch. self.window.backgroundColor = [UIColor whiteColor]; [self.window makeKeyAndVisible]; UINavigationController *navigation = [[UINavigationController alloc] initWithRootViewController:[[RootViewController alloc] init]]; self.window.rootViewController = navigation; return YES; }
4.2 RootViewController.m
- (void)nightFalls { [DKNightVersionManager nightFalling]; } - (void)dawnComes { [DKNightVersionManager dawnComing]; } - (void)push { [self.navigationController pushViewController:[[SuccViewController alloc] init] animated:YES]; }
4.3 SuccViewController.m
- (void)viewDidLoad { [super viewDidLoad]; self.view.backgroundColor = [UIColor whiteColor]; self.view.nightBackgroundColor = [UIColor colorWithRed:0.141 green:0.145 blue:0.153 alpha:1.0]; }
================
PS:
[ 每日一句 ]
" Smiling is the best reaction in all situations. "
[开源框架]
http://www.umeng.com/
================
|--> Copyright (c) 2015 Bing Ma.
|--> GitHub RUL: https://github.com/SpongeBob-GitHub