当应用程序进入后台时,我想在我的顶级视图控制器上放置一个模糊视图(因此可以自定义),以便用户无法看到我的应用程序的内容使用多任务时。我该怎么办?我尝试了一些使用根视图控制器的东西,但它没有用。我知道我需要使用这些委托方法,但我不确定如何获得顶视图控制器并在其上面放置视图。我正在使用带有一堆导航控制器的标签栏控制器。
func applicationWillResignActive(_ application: UIApplication) {
}
和
func applicationWillEnterForeground(_ application: UIApplication) {
}
当应用程序再次打开时,我显然想摆脱那个模糊视图,但我还想使用Face / Touch ID来提供访问权限。我认为使用LocalAuthentication非常简单。
答案 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标识符