KTJNightVersion:快速部署夜间模式。
当使用DKNightVersion进行部署夜间模式时候发现了一些问题,由于项目比较急,于是按照DKNightVersion的思路重新进行了实现,并加强了部分功能。先已完成测试,由于开发与测试较急,所以存在一些隐蔽的BUG也是在所难免,烦请各位指正。(github、博客园)
KTJNightVersion整体设计:
1、模式切换使用通知方式进行广播,监听该广播的为每一个ViewController,该ViewController分别在 viewWillAppear、 viewDidDisappear中进行注册监听和删除监听。
2、对于每一个View、以及其子类提供常用的第二种模式(night)的颜色设置,并通过Runtime保存在对象中。同时如果提供的方法不满足需求,可根据自己需要自行实现(实现Demo)。
3、ViewController通过对模式切换的监听,然后调用对应的协议( KTJNightVersionChangeColorProtocol)来进行颜色的切换设置。同时在 viewWillAppear: 方法中会默认进行一次设置。
4、对View进行设置时候通过对ViewController.view.subViews进行递归遍历来完成对显示View的模式切换。
设计目的:
1、为了减少在模式切换时,监听者众多,并且都需要在主线程中刷新UI(虽然可以通过某种途径不在主线程中刷新UI),所以把刷新的UI通过ViewController划分,如果该View此时并不显示,则在ViewController中移除监听,不刷新UI。但是为了让UI显示正常,所以默认在viewWillAppear:中进行设置一次UI。
2、为了部署方便,设置方便,所以使用Runtime机制进行部署,可以直接进行设置,不需要进行继承操作。
使用说明:
步骤1:为了减少在递归遍历子视图的复杂度以及灵活控制夜间模式,所以提供了注册方法。在模式切换时候只有注册过的才会进行改变。注册方法:
[KTJNightVersion addClassToSet:cell.textLabel.class];
PS.可以尝试initialize进行注册。
步骤2:设置夜间模式、正常模式样式
cell.textLabel.ktj_normalTextColor = [UIColorgrayColor];
cell.textLabel.ktj_nightTextColor = [UIColor whiteColor];
或者:
cell.textLabel.textColor = [UIColorgrayColor];
cell.textLabel.ktj_nightTextColor = [UIColor whiteColor];
步骤3:模式切换
切换至正常模式
[KTJNightVersionchangeToNormal];
切换至夜间模式
[KTJNightVersion changeToNight];
步骤4:运行一下,OK了吧?!
附录:
一、自行实现例子
1、遵守 KTJNightVersionChangeColorProtocol 协议,实现 - (BOOL)ktj_changeColorWithAnimation:(BOOL)animation duration:(CGFloat)duration; 方法,方法模式:
如果父类没有不实现协议,则实现方法为:
| 
     
     1
     
    
     2
     
    
     3
     
    
     4
     
    
     5
     
    
     6
     
    
     7
     
    
     8
     
    
     9
     
    
     10
     
    
     11
     
    
     12
     
    
     13
     
    
     14
     
    
     15
     
    
     16
     
    
     17
     
    
     18
     
    
     19
     
    
     20
     
    
     21
     
    
     22
     
    
     23
     
    
     24
     
    
     25
     
    
     26
     
    
     27
     
    
     28
     
    
     29
     
    
     30
     
    
     31
     
    
     32
      | 
   
    - (
     BOOL
     )ktj_changeColorWithAnimation:(
     BOOL
     )animation duration:(CGFloat)duration {
        
     if 
     ([KTJNightVersion shouldChangeColor:
     self
     ]) {
            
     KTJNightVersionStyle style = [KTJNightVersion currentStyle];
            
     UIColor *backgroundColor;
            
     switch 
     (style) {
                
     case 
     KTJNightVersionStyleNormal:
                    
     backgroundColor = 
     self
     .ktj_normalBackgroudColor;
                    
     break
     ;
                     
                
     case 
     KTJNightVersionStyleNight:
                    
     backgroundColor = 
     self
     .ktj_nightBackgroudColor;
                    
     break
     ;
                     
                
     default
     :
                    
     backgroundColor = 
     self
     .backgroundColor;
                    
     break
     ;
            
     }
            
     JGWeak(
     self
     );
            
     void 
     (^changeColor)(
     void
     ) = ^(
     void
     ) {
                
     [weakself ktjhook_setBackgroundColor:backgroundColor];
            
     };
            
     if 
     (animation) {
                
     [UIView animateWithDuration:duration animations:changeColor];
            
     } 
     else 
     {
                
     changeColor();
            
     }
             
            
     return 
     YES
     ;
        
     } 
     else 
     {
            
     return 
     NO
     ;
        
     }
    } 
     | 
  
如果父类有实现,则使用如下:
| 
     
     1
     
    
     2
     
    
     3
     
    
     4
     
    
     5
     
    
     6
     
    
     7
     
    
     8
     
    
     9
     
    
     10
     
    
     11
     
    
     12
     
    
     13
     
    
     14
     
    
     15
     
    
     16
     
    
     17
     
    
     18
     
    
     19
     
    
     20
     
    
     21
     
    
     22
     
    
     23
     
    
     24
     
    
     25
     
    
     26
     
    
     27
     
    
     28
     
    
     29
     
    
     30
     
    
     31
     
    
     32
     
    
     33
     
    
     34
      | 
   
    - (
     BOOL
     )ktj_changeColorWithAnimation:(
     BOOL
     )animation duration:(CGFloat)duration {
         
        
     if 
     ([
     super 
     respondsToSelector:
     @selector
     (ktj_changeColorWithAnimation:duration:)]) {
            
     if 
     ([
     super 
     ktj_changeColorWithAnimation:animation duration:duration]) {
                
     KTJNightVersionStyle style = [KTJNightVersion currentStyle];
                
     UIColor *separatorColor;
                
     switch 
     (style) {
                    
     case 
     KTJNightVersionStyleNormal:
                        
     separatorColor = 
     self
     .ktj_normalSeparatorColor;
                        
     break
     ;
                         
                    
     case 
     KTJNightVersionStyleNight:
                        
     separatorColor = 
     self
     .ktj_nightSeparatorColor;
                        
     break
     ;
                         
                    
     default
     :
                        
     separatorColor = 
     self
     .separatorColor;
                        
     break
     ;
                
     }
                
     JGWeak(
     self
     );
                
     void 
     (^changeColor)(
     void
     ) = ^(
     void
     ) {
                    
     [weakself ktjhook_setSeparatorColor:separatorColor];
                
     };
                
     if 
     (animation) {
                    
     [UIView animateWithDuration:duration animations:changeColor];
                
     } 
     else 
     {
                    
     changeColor();
                
     }
                 
                
     return 
     YES
     ;
            
     }
        
     }
        
     return 
     NO
     ;
    }
     | 
  
2、自行保存设计夜间模式的属性存储。同时可参考:
| 
     
     1
     
    
     2
     
    
     3
     
    
     4
     
    
     5
     
    
     6
     
    
     7
     
    
     8
     
    
     9
     
    
     10
     
    
     11
     
    
     12
     
    
     13
     
    
     14
     
    
     15
     
    
     16
     
    
     17
     
    
     18
     
    
     19
     
    
     20
     
    
     21
     
    
     22
     
    
     23
     
    
     24
     
    
     25
     
    
     26
     
    
     27
     
    
     28
     
    
     29
     
    
     30
     
    
     31
     
    
     32
     
    
     33
      | 
   
    + (
     void
     )load {
        
     static 
     dispatch_once_t onceToken;
        
     dispatch_once(&onceToken, ^{
            
     KTJChangeIMP(
     @selector
     (setSeparatorColor:), 
     @selector
     (ktjhook_setSeparatorColor:));
        
     });
    }
    - (
     void
     )ktjhook_setSeparatorColor:(UIColor *)separatorColor {
        
     self
     .ktj_normalSeparatorColor = separatorColor;
        
     [
     self 
     ktjhook_setSeparatorColor:separatorColor];
    }
    - (
     void
     )setKtj_nightSeparatorColor:(UIColor *)ktj_nightSeparatorColor {
        
     if 
     ([KTJNightVersion currentStyle] == KTJNightVersionStyleNight) {
            
     [
     self 
     ktjhook_setSeparatorColor:ktj_nightSeparatorColor];
        
     }
         
        
     objc_setAssociatedObject(
     self
     , 
     @selector
     (ktj_nightSeparatorColor), ktj_nightSeparatorColor, OBJC_ASSOCIATION_RETAIN);
    }
    - (UIColor *)ktj_nightSeparatorColor {
        
     return 
     objc_getAssociatedObject(
     self
     , 
     @selector
     (ktj_nightSeparatorColor))?:
     self
     .separatorColor;
    }
    - (
     void
     )setKtj_normalSeparatorColor:(UIColor *)ktj_normalSeparatorColor {
        
     if 
     ([KTJNightVersion currentStyle] == KTJNightVersionStyleNormal) {
            
     [
     self 
     ktjhook_setSeparatorColor:ktj_normalSeparatorColor];
        
     }
        
         
     objc_getAssociatedObject(
     self
     , 
     @selector
     (ktj_normalSeparatorColor))?:
     self
     .separatorColor;
    }
    - (
     void
     )ktj_saveNormalSeparatorColor:(UIColor *)separatorColor {
        
     objc_setAssociatedObject(
     self
     , 
     @selector
     (ktj_normalSeparatorColor), separatorColor, OBJC_ASSOCIATION_RETAIN);
    }
     | 
  
转载请保留此链接:http://www.cnblogs.com/madordie/p/4716396.html
原文:http://my.oschina.net/madordie/blog/489847