最近项目有这样的需求,项目中有一个控制器显示一个二维码,然而把二维码对准打卡机扫描,经常会因为在室外光照强烈、屏幕亮度低等原因导致扫描失败,于是有了增大该二维码界面亮度的需求。
思路:我们首先会想到在该界面[[UIScreen mainScreen] setBrightness,然后在App生命周期WillResignActive中讲亮度调回。但是,这样会有一个问题,假设我们在二维码界面按下home键,然后再点击App回到二维码界面,此时屏幕会回到最开始的亮度。由此,我想到了以下这个办法。
解决方案:我想,每个项目应该都有一个global的单例类去存放一些全局的数据,我们可以在这个类中存放两个属性
@property (nonatomic, assign)CGFloat screenBrightnessForFront;//最后一次显示App屏幕亮度
@property (nonatomic, assign)CGFloat screenBrightnessForNormal;//正常亮度
来表示在按下home键之前最后一次显示的屏幕亮度,和app正常显示的亮度。
在进入app时,保存app正常显示的亮度
//存储初始屏幕亮度
[[HBNGlobal shareGlobal] setScreenBrightnessForNormal:[UIScreen mainScreen].brightness];
然后在二维码界面的viewWillAppear中将亮度设置为最亮(或者随意你想多亮),然后将这个值存入screenBrightnessForFront。
[[UIScreen mainScreen] setBrightness:1.0];
[[HBNGlobal shareGlobal] setScreenBrightnessForFront:[UIScreen mainScreen].brightness];
此时我们已经完成了第一步,即在显示二维码时屏幕为最亮。然后在viewWillDisappear中将setScreenBrightnessForFront设为0,并设置屏幕亮度为screenBrightnessForNormal.
[[UIScreen mainScreen] setBrightness:[HBNGlobal shareInstance].screenBrightnessForNormal];
[[HBNGlobal shareGlobal] setScreenBrightnessForFront:0];
这时如果不考虑按home键是没有问题的,进入二维码界面变亮,退出变暗。
现在考虑Home键,很明显我们需要运用life cycle。
这里其实也很坑,如果单纯在回到app时使屏幕设为原亮度,按下home键恢复亮度,如果用户在此时通过控制中心设置屏幕亮度,那么这个亮度并不会同步到app。所以我们需要在appdelegate中加入一个监听者,来监听屏幕亮度的变化,并将屏幕变化后的值赋值给screenBrightnessForNormal,然后再用此值恢复屏幕亮度。我说的有点乱,直接上代码吧。
- appDidFinishLaunching
//监听屏幕亮度改变 实时改变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];
添加监听 在dealloc中移除监听 这没问题。然后在app inactive状态的时候设置为平常的亮度
- (void)applicationWillResignActive:(UIApplication *)application
[[UIScreen mainScreen] setBrightness:[HBNGlobal shareInstance].screenBrightnessForNormal];
再在即将进入前台时判断,如果此时screenBrightnessForFront有值,那么屏幕亮度设为screenBrightnessForFront,否则设为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亮度仍会随着系统亮度变化。当然,这里屏幕变化没有区间渐变效果,如果有需要,自行用timer或者其他方法解决就可以了。