ios - 如何在应用程序未激活时隐藏 iOS 应用程序内容 View ?

标签 ios swift

当应用程序被用户推送到后台时,我正在尝试为应用程序添加一个封面屏幕。

我在 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/

相关文章:

ios - LightBlue 找到设备,但未找到 iOS CoreBluetooth

ios - 为什么这个 UIImageView 动画会泄漏?

iphone - 如何启动 "Google Translate"应用程序?

swift - 使用 NSSet 按顺序保存多对一的最佳实践?

iphone - 带有 UICollectionCells 的 iPhone SDK 中的特殊弹出 View

swift - CAShapelayer 未显示

swift - 我会遇到具有共享需求的协议(protocol)的任何问题吗?

ios - 从另一个 TableView 内的 TableView 访问按钮索引

ios - 根据 json 中的值进行搜索

ios - Swift UIToolBar 追加 UIBarButtonItem 项目