码迷,mamicode.com
首页 > 移动开发 > 详细

iOS - 夜间模式KTJNightVersion

时间:2015-08-10 08:21:27      阅读:153      评论:0      收藏:0      [点我收藏+]

标签:

 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


iOS - 夜间模式KTJNightVersion

标签:

原文地址:http://my.oschina.net/madordie/blog/489847

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!