iOS仿支付宝二维码页逐步调整屏幕亮度

iOS仿支付宝二维码页逐步调整屏幕亮度_第1张图片
�支付宝二维码截图

�不知你有没有发现,支付宝和微信进入二维码付款页面屏幕会缓缓变亮,让扫码成功率变的更高。UIScreenbrightness属性可以改变屏幕亮度,但是实际效果并不理想,设置这个属性�只能瞬间改变屏幕亮度,效果非常突兀。

出于好奇,我在微信头文件中找到了下面这个方法,这个方法的意思是逐步设置亮度,这也让我相信了支付宝和微信的效果都是开发人员自己动手实现的。

微信头文件方法

于是就到了动手实践的时候了,整理好需要做的事:

  • 缓慢的设置亮度,调低亮度和调高亮度互斥
  • 保存默认亮度,用于之后还原亮度
  • 监听手动改变亮度的通知,保存为默认亮度

调高亮度的过程中调低亮度,需要停止调高亮度的线程,使用dispatch_async达不到这样的要求,所以我们使用NSOperationQueuecancelAllOperations可以终止之前queue的所有操作,而maxConcurrentOperationCount可以使queue每次只执行一个operation,达到队列效果。
为了不阻塞UI,创建NSOperationQueue不要使用currentQueue类方法,这样延时代码NSThreadsleepForTimeInterval才能在子线程执行。

具体代码如下:

+ (void)graduallySetBrightness:(CGFloat)value{
    if (!_queue) {
        _queue = [[NSOperationQueue alloc] init];
        _queue.maxConcurrentOperationCount = 1;
    }
    [_queue cancelAllOperations];
    
    CGFloat brightness = [UIScreen mainScreen].brightness;
    CGFloat step = 0.005 * ((value > brightness) ? 1 : -1);
    int times = fabs((value - brightness) / 0.005);
    for (CGFloat i = 1; i < times + 1; i++) {
        [_queue addOperationWithBlock:^{
            [NSThread sleepForTimeInterval:1 / 180.0];
            [UIScreen mainScreen].brightness = brightness + i * step;
        }];
    }
}

�在类的初始化方法中监听手动改变亮度的通知,并保存默认亮度供之后恢复亮度:

+ (void)initialize{
    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(saveDefaultBrightness) name:UIScreenBrightnessDidChangeNotification object:nil];
    [self saveDefaultBrightness];
}

+ (void)saveDefaultBrightness{
    _currentBrightness = [UIScreen mainScreen].brightness;
}

恢复亮度:

+ (void)graduallyResumeBrightness{
    [self graduallySetBrightness:_currentBrightness];
}

最后附上工具类的下载地址:
https://github.com/HJaycee/JCBrightness

纠正一下,GCD也可以做队列,用dispatch_semaphore_t可以实现,之前

你可能感兴趣的:(iOS仿支付宝二维码页逐步调整屏幕亮度)