iOS - 夜间模式KTJNightVersion

     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; 方法,方法模式:
如果父类没有不实现协议,则实现方法为:
 
- (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;
    }
} 

 

     如果父类有实现,则使用如下:
 
- (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、自行保存设计夜间模式的属性存储。同时可参考:
 
+ (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

 

 

posted @ 2015-08-09 21:20  沙漠浮萍  阅读(386)  评论(0编辑  收藏  举报