0

这是我正在尝试做的事情:

当用户单击当前视图控制器上的按钮时 - 我想呈现一个 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 post 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 执行此操作?

4

2 回答 2

0

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

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

于 2020-01-11T02:06:21.147 回答
0

改变

let keyWindow = UIApplication.shared.windows.filter {$0.isKeyWindow}.last
于 2020-01-11T01:11:22.923 回答