換膚-設(shè)置屏幕亮度 - (Obj-C)

在UIImage分類的基礎(chǔ)上,再封裝一個方法,用來根據(jù)當(dāng)前的皮膚模式,設(shè)置不同亮度

需要注意的是,一旦手動設(shè)置了亮度,那么程序運(yùn)行期間,就不再會自動調(diào)整亮度

+ (void)setLightnessWithNight:(BOOL)night{
    
    if (night) {  // 夜間模式
        // 設(shè)置屏幕亮度 0.0-1.0 一旦手動設(shè)置,就不再回自定調(diào)節(jié)了(需要真機(jī)測試)
        [UIScreen mainScreen].brightness = 0.2;
    } else {
        
        [UIScreen mainScreen].brightness = 0.8;
    }
}

在UIImage分類中,分別在Load方法和saveSkinModeWithNight:方法中調(diào)用設(shè)置亮度方法,這樣程序一起動的時候,會先根據(jù)當(dāng)前皮膚設(shè)置對應(yīng)亮度,切換皮膚保存的同時,同樣會設(shè)置一次亮度

這個方法并不需要外部調(diào)用,所以不需要對外聲明,完整代碼:
.h

#import <UIKit/UIKit.h>

@interface UIImage (JSSkin)

// 根據(jù)皮膚設(shè)置圖片
+ (UIImage *)jsImageNamed:(NSString *)name;

// 記錄皮膚 每次設(shè)置皮膚都會調(diào)用
+ (void)saveSkinModeWithNight:(BOOL)night;

// 獲取皮膚設(shè)置
+ (BOOL)isNight;

// 在當(dāng)前皮膚下,根據(jù)顏色的key取出對應(yīng)的顏色
+ (UIColor *)loadColorWithKey:(NSString *)key;


@end

.m

#import "UIImage+JSSkin.h"
#import <objc/runtime.h>

@implementation UIImage (JSSkin)

// 夜間模式標(biāo)識(靜態(tài)全局變量)
static bool isNight;
// 色表的緩存
static NSDictionary *colorCache;

+ (void)load{

    // 獲取偏好設(shè)置中的皮膚模式
    isNight = [[NSUserDefaults standardUserDefaults] boolForKey:@"isNight"];
    
    // 使用運(yùn)行時機(jī)制交換方法 一旦交換,在App整個生命周期都會交換
    // 1. 獲取對應(yīng)交換的方法
    Method method1 = class_getClassMethod([UIImage class], @selector(imageNamed:));
    Method method2 = class_getClassMethod([UIImage class], @selector(jsImageNamed:));
    // 2. 交換方法
    method_exchangeImplementations(method1, method2);
    
    // 加載色表緩存
    [self loadColorCache];
    // 設(shè)置亮度
    [self setLightnessWithNight:isNight];
}

+ (UIColor *)loadColorWithKey:(NSString *)key{

    // 每個皮膚除了設(shè)置不同圖片外,通常還需要有一套對應(yīng)的配色方案,一般使用plist色表來保存方案,色表的命名規(guī)范: 控制器_視圖_屬性
    
    // 從內(nèi)存中剛?cè)〕鰧?yīng)的顏色
    return colorCache[key];
}

// 加載色表緩存  硬盤數(shù)據(jù)-->內(nèi)存數(shù)據(jù)
+ (void)loadColorCache{
    
    // 從plist中取出色表
    NSString *path = @"";
    if (isNight) {
        path = @"skin/night/color.plist";
    }else {
        path = @"skin/default/color.plist";
    }
    
    NSDictionary *colorDict = [NSDictionary dictionaryWithContentsOfFile:[[NSBundle mainBundle] pathForResource:path ofType:nil]];
    
    // 創(chuàng)建可變字典  將字符串字典轉(zhuǎn)換成UIColor字典
    NSMutableDictionary *tempDict = [NSMutableDictionary dictionary];
    
    // 遍歷字符串字典
    [colorDict enumerateKeysAndObjectsUsingBlock:^(id  _Nonnull key, id  _Nonnull obj, BOOL * _Nonnull stop) {
        
        // 根據(jù)傳入的key取出value
        // 將得到的value(NSString*)分隔轉(zhuǎn)成一個數(shù)組
        NSArray *colorArr = [obj componentsSeparatedByString:@","];
        
        CGFloat red = [colorArr[0] floatValue];
        CGFloat green = [colorArr[1] floatValue];
        CGFloat blue = [colorArr[2] floatValue];
        
        // 設(shè)置色表的內(nèi)存緩存 方便從內(nèi)存中取出對應(yīng)的顏色,避免每一次都從沙盒中取出色表(影響性能)
        // 內(nèi)存緩存 選型  字典(key:plist中的key  value:色值NSString) -> 字典(key:不變  value:UIColor)
        UIColor *color = [UIColor colorWithRed:red / 255.0 green:green / 255.0 blue:blue / 255.0 alpha:1.0];
        
        // 存到臨時可變字典中
        [tempDict setObject:color forKey:key];
        
    }];
    
    // 存到緩存
    colorCache = tempDict.copy;

    
}

// 自定義方法,根據(jù)當(dāng)前皮膚設(shè)置圖片
+ (UIImage *)jsImageNamed:(NSString *)name{
    
    if (isNight) { // 夜間模式
        
        name = [NSString stringWithFormat:@"%@_night",name];
    }
    
    return [UIImage jsImageNamed:name];
}

+ (void)saveSkinModeWithNight:(BOOL)night{
    
    // 賦值,記錄當(dāng)前皮膚狀態(tài)
    isNight = night;
    
    // 本地記錄狀態(tài)(偏好設(shè)置)
    [[NSUserDefaults standardUserDefaults] setBool:isNight forKey:@"isNight"];
    [[NSUserDefaults standardUserDefaults] synchronize];
    
    // 加載色表緩存
    [self loadColorCache];
    // 設(shè)置亮度
    [self setLightnessWithNight:isNight];
}

+ (void)setLightnessWithNight:(BOOL)night{
    
    if (night) {  // 夜間模式
        // 設(shè)置屏幕亮度 0.0-1.0 一旦手動設(shè)置,程序運(yùn)行期間就不再會自定調(diào)節(jié)了(需要真機(jī)測試)
        [UIScreen mainScreen].brightness = 0.2;
    } else {
        
        [UIScreen mainScreen].brightness = 0.8;
    }
}

+ (BOOL)isNight{
    
    // 返回當(dāng)前皮膚狀態(tài)
    return isNight;
}

@end
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末距糖,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 211,290評論 6 491
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件仲智,死亡現(xiàn)場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)漫仆,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,107評論 2 385
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來泪幌,“玉大人盲厌,你說我怎么就攤上這事』隼幔” “怎么了吗浩?”我有些...
    開封第一講書人閱讀 156,872評論 0 347
  • 文/不壞的土叔 我叫張陵,是天一觀的道長没隘。 經(jīng)常有香客問我懂扼,道長,這世上最難降的妖魔是什么右蒲? 我笑而不...
    開封第一講書人閱讀 56,415評論 1 283
  • 正文 為了忘掉前任微王,我火速辦了婚禮,結(jié)果婚禮上品嚣,老公的妹妹穿的比我還像新娘炕倘。我一直安慰自己,他們只是感情好翰撑,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,453評論 6 385
  • 文/花漫 我一把揭開白布罩旋。 她就那樣靜靜地躺著啊央,像睡著了一般。 火紅的嫁衣襯著肌膚如雪涨醋。 梳的紋絲不亂的頭發(fā)上瓜饥,一...
    開封第一講書人閱讀 49,784評論 1 290
  • 那天,我揣著相機(jī)與錄音浴骂,去河邊找鬼乓土。 笑死,一個胖子當(dāng)著我的面吹牛溯警,可吹牛的內(nèi)容都是我干的趣苏。 我是一名探鬼主播,決...
    沈念sama閱讀 38,927評論 3 406
  • 文/蒼蘭香墨 我猛地睜開眼梯轻,長吁一口氣:“原來是場噩夢啊……” “哼食磕!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起喳挑,我...
    開封第一講書人閱讀 37,691評論 0 266
  • 序言:老撾萬榮一對情侶失蹤彬伦,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后伊诵,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體单绑,經(jīng)...
    沈念sama閱讀 44,137評論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,472評論 2 326
  • 正文 我和宋清朗相戀三年曹宴,在試婚紗的時候發(fā)現(xiàn)自己被綠了询张。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,622評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡浙炼,死狀恐怖份氧,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情弯屈,我是刑警寧澤蜗帜,帶...
    沈念sama閱讀 34,289評論 4 329
  • 正文 年R本政府宣布,位于F島的核電站资厉,受9級特大地震影響厅缺,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜宴偿,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,887評論 3 312
  • 文/蒙蒙 一湘捎、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧窄刘,春花似錦伶棒、人聲如沸疯汁。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,741評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽烹骨。三九已至,卻和暖如春材泄,著一層夾襖步出監(jiān)牢的瞬間沮焕,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,977評論 1 265
  • 我被黑心中介騙來泰國打工拉宗, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留峦树,地道東北人。 一個月前我還...
    沈念sama閱讀 46,316評論 2 360
  • 正文 我出身青樓旦事,卻偏偏與公主長得像魁巩,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子族檬,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,490評論 2 348

推薦閱讀更多精彩內(nèi)容

  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理歪赢,服務(wù)發(fā)現(xiàn)化戳,斷路器单料,智...
    卡卡羅2017閱讀 134,629評論 18 139
  • 在iOS中隨處都可以看到絢麗的動畫效果,實(shí)現(xiàn)這些動畫的過程并不復(fù)雜点楼,今天將帶大家一窺iOS動畫全貌扫尖。在這里你可以看...
    F麥子閱讀 5,101評論 5 13
  • WebSocket-Swift Starscream的使用 WebSocket 是 HTML5 一種新的協(xié)議。它實(shí)...
    香橙柚子閱讀 23,796評論 8 183
  • 每個人的生活掠廓,工作换怖,背后都隱藏著巨大的慣性。旁人很難影響蟀瞧,有時本人也很難打破這些慣性的束縛沉颂。 公司,團(tuán)隊(duì)悦污,團(tuán)體等铸屉,...
    寒武紀(jì)2731閱讀 232評論 0 0
  • 我路過一片花園 在那兒 我遇見不可思議的景象 我看見 一半白天一半晝夜 一半鳥語花香一半雜草叢生 一半晴空萬里一半...
    淡淡單閱讀 269評論 3 1