当应用程序被用户推送到后台时,我正在尝试为应用程序添加一个封面屏幕。
我在 AppDelegate 上有这两种方法来添加/删除封面 View 。
func showCover(){
let blackV = UIView(frame: UIApplication.shared.keyWindow?.bounds ?? .zero)
blackV.backgroundColor = .black
blackV.tag = kCoverTag
let imgV = UIImageView(image: UIImage(named: "Logo-White"))
imgV.center = blackV.center
blackV.addSubview(imgV)
UIApplication.shared.keyWindow?.addSubview(blackV)
}
func hideCover(){
if let blackV = UIApplication.shared.keyWindow?.subviews.filter({$0.tag == kCoverTag}).first{
blackV.removeFromSuperview()
}
}
标签值在 AppDelegate 上声明:
let kCoverTag = 987
在 applicationWillResignActive
中,我应用了封面
func applicationWillResignActive(_ application: UIApplication) {
showCover()
}
在 didBecomeActive 中,我移除了封面。
func applicationDidBecomeActive(_ application: UIApplication) {
hideCover()
}
当按主页按钮将应用程序发送到后台时,这工作正常。
在 applicationDidBecomeActive
被调用之后,当我打印 keyWindow 的 subview 时,我得到如下输出:
po UIApplication.shared.keyWindow?.subviews
▿ Optional<Array<UIView>>
▿ some : 2 elements
- 0 : <UITransitionView: 0x7f97bd82ffc0; frame = (0 0; 414 896); autoresize = W+H; layer = <CALayer: 0x6000028ecce0>>
- 1 : <UIView: 0x7f97bae27f20; frame = (0 0; 414 896); tag = 987; layer = <CALayer: 0x600002868400>>
这很好,因为它将封面 View 显示为添加到关键窗口的 subview 之一。
现在,当通过调用 UIApplication.shared.openURL
将应用发送到后台时,applicationWillResignActive 将按预期调用。
当用户按下“返回应用程序按钮”时,应用程序将返回给用户。
现在,当我在调用 hideCover()
方法之前在 didBecomeActive
方法中打印关键窗口的 subview 时,看起来它只有一个 subview 。
po UIApplication.shared.keyWindow?.subviews
▿ Optional<Array<UIView>>
▿ some : 1 element
- 0 : <UITransitionView: 0x7f97bfc05510; frame = (0 0; 414 896); autoresize = W+H; layer = <CALayer: 0x6000029984c0>>
因为这只显示一个 View ,hideCover()
方法找不到 subview ,因此无法删除它。但是在应用程序中我可以看到封面 View 。
我想知道为什么 keyWindow
subview 没有显示添加的封面 View 。
我正在模拟器中对此进行测试。
更新:
我进行了两次单独的打印调用
添加封面 View 之后:
print("resign active",UIApplication.shared.keyWindow?.subviews)
这显示了 keyWindow 的两个 subview
在 didBecomeActive 方法中删除封面 View 之前:
print("did become active",UIApplication.shared.keyWindow?.subviews)
这只显示 keyWindow 的一个 subview
最佳答案
不要在这里使用keyWindow
。那不是正确的工具。系统可以创建其他窗口,并且可以通过 makeKey()
获得输入焦点。从 UIApplicationDelegate
显示 window.rootViewController
的 View 。参见 QA1838: Preventing Sensitive Information From Appearing In The Task Switcher对于 Apple 推荐的实现您正在尝试做的事情的方法。另见 Preparing Your UI to Run in the Background以获得更多指导。
关于ios - 如何在应用程序未激活时隐藏 iOS 应用程序内容 View ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58920301/