iOS实现支付宝后台模糊效果
废话不多说,先来张图,直接看下效果
上图的效果就是我们这篇文章要达到的效果。
对于没做过类似效果的盆友们来说,可能最开始想到的会是,是否有这么一个方法能监听到手机APP进入任务管理或者是进入任务切换这么一个动作?然鹅,事实并非那么麻烦,其实想要实现这种效果只需要监听AppDelegate里的下面两个方法即可
- (void)applicationDidEnterBackground:(UIApplication*)application
- (void)applicationWillEnterForeground:(UIApplication*)application
在这两个方法里需要做的事情也是很简单,就是在- (void)applicationDidEnterBackground:(UIApplication*)application里给window添加一个玻璃效果的view
在- (void)applicationWillEnterForeground:(UIApplication*)application里让这个玻璃效果的view从window上移除即可
代码如下,首先添加一个属性
@interface AppDelegate ()
/* blurView */
@property (strong, nonatomic) UIVisualEffectView *blurView;
@end
之后在- (void)applicationDidEnterBackground:(UIApplication*)application里在window上添加这个view
- (void)applicationDidEnterBackground:(UIApplication*)application {
if(!_blurView) {
UIBlurEffect *blurEffect = [UIBlurEffect effectWithStyle:UIBlurEffectStyleLight];
_blurView = [[UIVisualEffectView alloc] initWithEffect:blurEffect];
_blurView.frame = self.window.bounds;
}
//进入后台实现模糊效果
[self.window addSubview:_blurView];
}
在即将进入前台的时候,移除这个view
- (void)applicationWillEnterForeground:(UIApplication*)application {
[_blurView removeFromSuperview];
}
至此,就实现了和支付宝一毛一样的模糊效果了。
其实网上已经很多此类文章了,我为何在此还要写一些呢,其实就是,网上大部分的文章说的都是在- (void)applicationWillResignActive:(UIApplication*)application这个方法里添加模糊view,在- (void)applicationDidBecomeActive:(UIApplication*)application这个方法里移除模糊view。然鹅我自己也实际试过这种方式,这种方式达到的效果和支付宝的差距甚大,并且因为是在- (void)applicationWillResignActive:(UIApplication*)application方法里添加模糊view,因此会导致下拉通知栏和通知中心的时候都会直接显示这个模糊view,并且由于是在这个- (void)applicationDidBecomeActive:(UIApplication*)application方法中移除模糊view的,就会出现移除模糊view稍有延迟的效果,最终效果都没支付宝的那种实现来得好。我也不知道写这些文章的作者们有没实际的验证过,这种方式不仅会出现下拉通知中心显示模糊view,而且还会在下拉通知中心显示的模糊view最终不会被移除,因为下拉通知中心,之后通知中心上划消失后并不会调用- (void)applicationWillResignActive:(UIApplication*)application这个方法,也就是说,模糊view将不会被移除。
现在看看官方文档对active和inactive的解释吧,看完后您将豁然开朗
The app is running in the foreground and currently receiving events.
//app当前运行在前台,并且会接收事件
The app is running in the foreground but is not receiving events. This might happen as a result of an interruption or because the app is transitioning to or from the background.
//app当前运行在前台但是不接收事件。这种情况可能会发生在中断之后或者是因为app正切换到后台或从后台切换回前台
The app is running in the background.
//app正运行在后台
因此,这也是我写此篇文章的目的之一吧,就是想让大家能对一个技术点有自己的想法和看法,意思就是,不要盲目全信网上的文章,对文章提到的技术点,最好能亲自验证一下是否正确,即使是你搜到的大部分文章都是一样的答案,您也应该亲自验证一番。