iOS实现支付宝双击home键进入后台的毛玻璃效果
2018-07-09 本文已影响0人
安静守护你
今天进入支付宝后,突然发现支付宝新加了信息保护措施(进入后台后显示毛玻璃效果)。苹果手机双击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];
_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;
}];
}
}