当应用进入后台时覆盖顶视图控制器

时间:2018-04-03 16:38:08

标签: ios swift

当应用程序进入后台时,我想在我的顶级视图控制器上放置一个模糊视图(因此可以自定义),以便用户无法看到我的应用程序的内容使用多任务时。我该怎么办?我尝试了一些使用根视图控制器的东西,但它没有用。我知道我需要使用这些委托方法,但我不确定如何获得顶视图控制器并在其上面放置视图。我正在使用带有一堆导航控制器的标签栏控制器。

func applicationWillResignActive(_ application: UIApplication) {
}

func applicationWillEnterForeground(_ application: UIApplication) {
}

当应用程序再次打开时,我显然想摆脱那个模糊视图,但我还想使用Face / Touch ID来提供访问权限。我认为使用LocalAuthentication非常简单。

3 个答案:

答案 0 :(得分:3)

AppDelegate.swift课程中,请尝试使用此代码段,

let visualEffectView = UIVisualEffectView()

func applicationWillEnterForeground(_ application: UIApplication) {
    self.visualEffectView.removeFromSuperview()
}

func applicationWillResignActive(_ application: UIApplication) {
if !self.visualEffectView.isDescendant(of: self.window!) {
    let blurEffect = UIBlurEffect(style: .light)
    self.visualEffectView = UIVisualEffectView(effect: blurEffect)
    self.visualEffectView.frame = (self.window?.bounds)!
    self.window?.addSubview(self.visualEffectView)
   }
}
func applicationDidBecomeActive(_ application: UIApplication) {
    self.visualEffectView.removeFromSuperview()
}

对于使用Face ID/Touch ID的{​​{1}}您是正确的,您可能希望使用LocalAuthentication来检测应用是否到达前台并相应地显示身份验证警报。我认为您需要将此行为添加到UIApplicationWillEnterForegroundNotification

答案 1 :(得分:1)

不是每次都从超级视图中添加和删除它,而是可以保留它并根据需要更改效果。将以下内容添加到您的AppDelegate

let visualEffectView = UIVisualEffectView(effect: nil)

func applicationWillResignActive(_ application: UIApplication) {
    if !self.visualEffectView.isDescendant(of: self.window!) {
         self.window?.addSubview(self.visualEffectView)
    }
    self.visualEffectView.frame = (self.window?.bounds)!

    UIView.animate(withDuration: 0.5) {
        self.visualEffectView.effect = UIBlurEffect(style: .light)
    }

}

func applicationWillEnterForeground(_ application: UIApplication) {
    UIView.animate(withDuration: 0.5) {
        self.visualEffectView.effect = nil
    }
}

func applicationDidBecomeActive(_ application: UIApplication) {
    UIView.animate(withDuration: 0.5) {
        self.visualEffectView.effect = nil
    }    
}

这样可以让你能够淡入淡出效果。

答案 2 :(得分:0)

要从appDelegate调用视图控制器,您可以使用此方法

func applicationWillResignActive(_ application: UIApplication) {
    self.window = UIWindow(frame: UIScreen.main.bounds)
    let mainStoryboard: UIStoryboard = UIStoryboard(name: "Main", bundle: nil)
    let vcMainView: YourVC = mainStoryboard.instantiateViewController(withIdentifier: "YourVC") as! YourVC
    self.window?.rootViewController?.present(vcMainView, animated: true, completion: nil)
}

不要忘记在Identity Inspector - Identity部分

中设置VC标识符