iOS实现支付宝双击home键进入后台的毛玻璃效果

今天进入支付宝后,突然发现支付宝新加了信息保护措施(进入后台后显示毛玻璃效果)。苹果手机双击home键,会直接进入系统的switcher页面,在这里列出了当前系统挂起的APP截屏列表,这个截屏是在APP进入后台的时候进行的截屏。
从上面已经可知,系统是在APP将要进入后台的时候对APP进行屏幕截图,那么我们要实现毛玻璃效果,就可以在APP即将要进入后台的时候,改变现实的外观,这样就可以完美实现毛玻璃效果咯。
我实现的思路是:在APP即将进入后台的时候,代码实现屏幕截图,然后将截图进行高斯模糊覆盖在keyWindow上,当APP进入前台的时候,再移除覆盖的截图图片并置空。
下面就直接上代码咯

因为程序将要进入后台的方法是在AppDelegate.m中,所以我们可以在AppDelegate.m中声明一个UIImageView的变量,使用懒加载的形式声明加载(这里随意啦,不使用懒加载也可以直接在- (void)applicationWillResignActive:(UIApplication *)application方法中声明加载)。

声明UIImageView

@interface AppDelegate () 

@property (nonatomic, strong) UIImageView *screenView;

@end

懒加载代码:

- (UIImageView *)screenView {
    if (!_screenView) {
        _screenView = [[UIImageView alloc] initWithFrame:[UIScreen mainScreen].bounds];
        // blurImageWithRadius:方法是直接调用自 UIImage+ImageEffects,模糊图片的  可以搜一下,直接拿来用
        _screenView.image = [[self getNormalImage:[UIApplication sharedApplication].keyWindow] blurImageWithRadius:8];
        _screenView.backgroundColor = [UIColor whiteColor];
        [self.window addSubview:_screenView];
    }
    return _screenView;
}

// 获取屏幕截图
- (UIImage *)getNormalImage:(UIView *)view {
    // kScreenWidth和kScreenHeight均为宏定义,分别表示屏幕的宽和高
    UIGraphicsBeginImageContext(CGSizeMake(kScreenWidth, kScreenHeight));
    
    CGContextRef context = UIGraphicsGetCurrentContext();
    
    [view.layer renderInContext:context];
    
    UIImage *image = UIGraphicsGetImageFromCurrentImageContext();
    
    UIGraphicsEndImageContext();
    
    return image;
}

APP失去焦点(被挂起):

- (void)applicationWillResignActive:(UIApplication *)application {
    // 判断APP当前状态,如果是从活跃状态进入switcher页面,则不进行信息保护
    if (application.applicationState != UIApplicationStateActive) {
        [UIView animateWithDuration:0.4 animations:^{
            self.screenView.alpha = 1;
        }];
    }
}

将要进入后台:

// APP从活跃状态进入后台,直接进行信息保护
- (void)applicationDidEnterBackground:(UIApplication *)application {
    [UIView animateWithDuration:0.4 animations:^{
        self.screenView.alpha = 1;
    }];
}

APP进入前台:

- (void)applicationDidBecomeActive:(UIApplication *)application {
    if (_screenView) {  
        [UIView animateWithDuration:0.4 animations:^{
            self.screenView.alpha = 0;
        } completion:^(BOOL finished) {
            [self.screenView removeFromSuperview];
            self.screenView = nil;
        }];
    }
}

你可能感兴趣的:(iOS实现支付宝双击home键进入后台的毛玻璃效果)