美文网首页
关于app屏幕亮度调节的一些想法

关于app屏幕亮度调节的一些想法

作者: Daeva_Song | 来源:发表于2017-08-11 23:13 被阅读335次

    最近项目有这样的需求,项目中有一个控制器显示一个二维码,然而把二维码对准打卡机扫描,经常会因为在室外光照强烈、屏幕亮度低等原因导致扫描失败,于是有了增大该二维码界面亮度的需求。

    思路:我们首先会想到在该界面[[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或者其他方法解决就可以了。

    相关文章

      网友评论

          本文标题:关于app屏幕亮度调节的一些想法

          本文链接:https://www.haomeiwen.com/subject/uyxdrxtx.html