最近項目有這樣的需求扔傅,項目中有一個控制器顯示一個二維碼耍共,然而把二維碼對準(zhǔn)打卡機(jī)掃描烫饼,經(jīng)常會因為在室外光照強(qiáng)烈、屏幕亮度低等原因?qū)е聮呙枋∈远粒谑怯辛嗽龃笤摱S碼界面亮度的需求杠纵。
思路:我們首先會想到在該界面[[UIScreen mainScreen] setBrightness,然后在App生命周期WillResignActive中講亮度調(diào)回钩骇。但是淡诗,這樣會有一個問題,假設(shè)我們在二維碼界面按下home鍵伊履,然后再點擊App回到二維碼界面韩容,此時屏幕會回到最開始的亮度。由此唐瀑,我想到了以下這個辦法群凶。
解決方案:我想,每個項目應(yīng)該都有一個global的單例類去存放一些全局的數(shù)據(jù)哄辣,我們可以在這個類中存放兩個屬性
@property (nonatomic, assign)CGFloat screenBrightnessForFront;//最后一次顯示App屏幕亮度
@property (nonatomic, assign)CGFloat screenBrightnessForNormal;//正常亮度
來表示在按下home鍵之前最后一次顯示的屏幕亮度请梢,和app正常顯示的亮度。
在進(jìn)入app時力穗,保存app正常顯示的亮度
//存儲初始屏幕亮度
[[HBNGlobal shareGlobal] setScreenBrightnessForNormal:[UIScreen mainScreen].brightness];
然后在二維碼界面的viewWillAppear中將亮度設(shè)置為最亮(或者隨意你想多亮)毅弧,然后將這個值存入screenBrightnessForFront。
[[UIScreen mainScreen] setBrightness:1.0];
[[HBNGlobal shareGlobal] setScreenBrightnessForFront:[UIScreen mainScreen].brightness];
此時我們已經(jīng)完成了第一步当窗,即在顯示二維碼時屏幕為最亮够坐。然后在viewWillDisappear中將setScreenBrightnessForFront設(shè)為0,并設(shè)置屏幕亮度為screenBrightnessForNormal.
[[UIScreen mainScreen] setBrightness:[HBNGlobal shareInstance].screenBrightnessForNormal];
[[HBNGlobal shareGlobal] setScreenBrightnessForFront:0];
這時如果不考慮按home鍵是沒有問題的崖面,進(jìn)入二維碼界面變亮元咙,退出變暗。
現(xiàn)在考慮Home鍵巫员,很明顯我們需要運用life cycle庶香。
這里其實也很坑,如果單純在回到app時使屏幕設(shè)為原亮度简识,按下home鍵恢復(fù)亮度赶掖,如果用戶在此時通過控制中心設(shè)置屏幕亮度,那么這個亮度并不會同步到app七扰。所以我們需要在appdelegate中加入一個監(jiān)聽者奢赂,來監(jiān)聽屏幕亮度的變化,并將屏幕變化后的值賦值給screenBrightnessForNormal戳寸,然后再用此值恢復(fù)屏幕亮度呈驶。我說的有點亂拷泽,直接上代碼吧疫鹊。
- appDidFinishLaunching
//監(jiān)聽屏幕亮度改變 實時改變normalBrightness
NSNotificationCenter *center = [NSNotificationCenter defaultCenter];
[center addObserver:self
selector:@selector(brightnessDidChange:)
name:UIScreenBrightnessDidChangeNotification
object:[UIScreen mainScreen]];
- (void)dealloc
[[NSNotificationCenter defaultCenter] removeObserver:self];
- (void)brightnessDidChange:(NSNotification *)notification
[[HBNGlobal shareInstance] setScreenBrightnessForNormal:[UIScreen mainScreen].brightness];
添加監(jiān)聽 在dealloc中移除監(jiān)聽 這沒問題袖瞻。然后在app inactive狀態(tài)的時候設(shè)置為平常的亮度
- (void)applicationWillResignActive:(UIApplication *)application?
[[UIScreen mainScreen] setBrightness:[HBNGlobal shareInstance].screenBrightnessForNormal];
再在即將進(jìn)入前臺時判斷,如果此時screenBrightnessForFront有值拆吆,那么屏幕亮度設(shè)為screenBrightnessForFront聋迎,否則設(shè)為screenBrightnessForNormal
- (void)applicationWillEnterForeground:(UIApplication *)application?
[[HBNGlobal shareInstance] setScreenBrightnessForNormal:[UIScreen mainScreen].brightness];
if (![HBNGlobal shareInstance].screenBrightnessForFront) {
[[UIScreen mainScreen] setBrightness:[HBNGlobal shareInstance].screenBrightnessForNormal];
}else
[[UIScreen mainScreen] setBrightness:[HBNGlobal shareInstance].screenBrightnessForFront];
這樣就沒問題了,app亮度仍會隨著系統(tǒng)亮度變化枣耀。當(dāng)然霉晕,這里屏幕變化沒有區(qū)間漸變效果,如果有需要捞奕,自行用timer或者其他方法解決就可以了牺堰。