iOS实现支付宝后台模糊效果

2019-09-29  本文已影响0人  Invisible_He

废话不多说,先来张图,直接看下效果

上图的效果就是我们这篇文章要达到的效果。

对于没做过类似效果的盆友们来说,可能最开始想到的会是,是否有这么一个方法能监听到手机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的解释吧,看完后您将豁然开朗

case active

The app is running in the foreground and currently receiving events.

//app当前运行在前台,并且会接收事件

case inactive

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正切换到后台或从后台切换回前台

case background

The app is running in the background.

//app正运行在后台

因此,这也是我写此篇文章的目的之一吧,就是想让大家能对一个技术点有自己的想法和看法,意思就是,不要盲目全信网上的文章,对文章提到的技术点,最好能亲自验证一下是否正确,即使是你搜到的大部分文章都是一样的答案,您也应该亲自验证一番。

上一篇下一篇

猜你喜欢

热点阅读