【问题标题】:How to add a UIView object to the current application window in iOS 13如何在 iOS 13 中将 UIView 对象添加到当前应用程序窗口
【发布时间】:2020-01-11 01:04:37
【问题描述】:

这是我想要做的:

当用户单击当前视图控制器上的按钮时 - 我想呈现一个 UIView 占据整个屏幕 - 状态栏和所有内容 - 并位于当前视图控制器堆栈的顶部。直到 iOS 13,我都是这样做的:

var mainWindow = UIApplication.shared.keyWindow

mainWindow!.addSubview(self.temp_view2!

leadingConstraint = NSLayoutConstraint(item: temp_view2, attribute: NSLayoutConstraint.Attribute.leading, relatedBy: NSLayoutConstraint.Relation.equal, toItem: mainWindow, attribute: NSLayoutConstraint.Attribute.leading, multiplier: 1, constant: 0)
trailingConstraint = NSLayoutConstraint(item: temp_view2, attribute: NSLayoutConstraint.Attribute.trailing, relatedBy: NSLayoutConstraint.Relation.equal, toItem: mainWindow, attribute: NSLayoutConstraint.Attribute.trailing, multiplier: 1, constant: 0)
topConstraint = NSLayoutConstraint(item: temp_view2, attribute: NSLayoutConstraint.Attribute.top, relatedBy: NSLayoutConstraint.Relation.equal, toItem: mainWindow, attribute: NSLayoutConstraint.Attribute.top, multiplier: 1, constant: 0)
bottomConstraint = NSLayoutConstraint(item: temp_view2, attribute: NSLayoutConstraint.Attribute.bottom, relatedBy: NSLayoutConstraint.Relation.equal, toItem: mainWindow, attribute: NSLayoutConstraint.Attribute.bottom, multiplier: 1, constant: 0)
mainWindow?.addConstraints([topConstraint!, bottomConstraint!, leadingConstraint!, trailingConstraint!])

这种方法似乎不适用于 iOS 13,我猜是因为 UIWindow 和 UIScenes 的工作方式 - 我还没有完全理解。我只在我的应用程序中使用一个窗口。使用此 SO 帖子 How to resolve: 'keyWindow' was deprecated in iOS 13.0 我尝试查看以下内容是否可行:

let keyWindow = UIApplication.shared.windows.filter {$0.isKeyWindow}.first

keyWindow?.addSubview(self.temp_view2!)

leadingConstraint = NSLayoutConstraint(item: temp_view2, attribute: NSLayoutConstraint.Attribute.leading, relatedBy: NSLayoutConstraint.Relation.equal, toItem: keyWindow, attribute: NSLayoutConstraint.Attribute.leading, multiplier: 1, constant: 0)
trailingConstraint = NSLayoutConstraint(item: temp_view2, attribute: NSLayoutConstraint.Attribute.trailing, relatedBy: NSLayoutConstraint.Relation.equal, toItem: keyWindow, attribute: NSLayoutConstraint.Attribute.trailing, multiplier: 1, constant: 0)
topConstraint = NSLayoutConstraint(item: temp_view2, attribute: NSLayoutConstraint.Attribute.top, relatedBy: NSLayoutConstraint.Relation.equal, toItem: keyWindow, attribute: NSLayoutConstraint.Attribute.top, multiplier: 1, constant: 0)
bottomConstraint = NSLayoutConstraint(item: temp_view2, attribute: NSLayoutConstraint.Attribute.bottom, relatedBy: NSLayoutConstraint.Relation.equal, toItem: keyWindow, attribute: NSLayoutConstraint.Attribute.bottom, multiplier: 1, constant: 0)
keyWindow?.addConstraints([topConstraint!, bottomConstraint!, leadingConstraint!, trailingConstraint!]) 

视图确实被添加了,但它一直在后面,在根视图控制器后面,我添加了一条 BringSubviewToFront 线,但这也无济于事。这是它的外观 - 实际上我添加了 3 个视图,如上所述:

对于 >= iOS 13,我如何做到这一点?

【问题讨论】:

    标签: swift ios13 uiwindow uiwindowscene


    【解决方案1】:

    从您的屏幕截图看来,视图被添加到了正确的窗口;它只是在错误的 z 顺序。如果没有更多关于代码中添加位置的上下文,就不可能说出为什么会这样(即,您可以在之后创建 VC,并且新的子视图总是被推送到现有子视图之上,除非您指定 z 顺序)。测试 z 顺序是否正确的一种非常简单的方法是,只要您在前面看到的 VC 出现(即在 viewWillAppear 中调用 window.bringSubviewToFront(viewThatsSupposedToBeInFront),就将添加到窗口的视图拉到前面。

    如果您总是希望您的视图位于当前窗口的顶部,您可以创建另一个窗口级别更高的窗口onTopOfEveryThingWindow.windowLevel = .init(.greatestFiniteMagnitude)。这可以阻止应用程序中的所有内容,包括警报,直到您隐藏窗口。

    【讨论】:

    • 所以它的添加顺序是这样的 - 你在最前面看到的 VC 是 UITabBarController 的选项卡之一。我想放在最前面的三个视图是 NSObject 的一部分,它的一个实例是在 UITabBarController 的 viewDidLoad 中创建和启动的。我在 NSObject 的“init”调用中将三个视图添加到窗口中 - 使用该序列 - 它不应该在 tabBarController 前面 - 因此 - 也在选项卡 VC 前面吗?让我试试你建议的最伟大的FiniteMagnitude 方法,看看是否可行……
    • 好吧,你对订单的事情很了解 - 这完成了工作 - '一旦你在前面看到的 VC 出现(即在 viewWillAppear 调用中),就把你添加到窗口的视图拉到前面window.bringSubviewToFront(viewThatsSupposedToBeInFront)'。非常感谢!
    【解决方案2】:

    改变

    let keyWindow = UIApplication.shared.windows.filter {$0.isKeyWindow}.last
    

    【讨论】:

      猜你喜欢
      • 2011-03-09
      • 2021-05-20
      • 1970-01-01
      • 2011-04-09
      • 2023-03-30
      • 1970-01-01
      • 2021-08-26
      • 1970-01-01
      • 2012-07-19
      相关资源
      最近更新 更多