这是我想要做的:
[当用户单击当前视图控制器上的按钮时,我想展示一个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上执行此操作?
更改
从您的屏幕快照看来,该视图已被添加到正确的窗口;它的Z顺序错误。如果没有更多关于代码在何处添加上下文的信息,就不可能说出这是为什么(即,您可以随后创建VC,除非指定z顺序,否则新的子视图总是被推到现有子视图的顶部)。一种非常简单的测试z顺序是否正确的方法是,只要在前面看到的VC出现(即,在viewWillAppear调用window.bringSubviewToFront(viewThatsSupposedToBeInFront
中),就将拉到窗口的视图简单地拉到前面。
如果您始终希望视图位于当前窗口的顶部,则可以使另一个窗口具有更高的窗口级别onTopOfEveryThingWindow.windowLevel = .init(.greatestFiniteMagnitude)
。这可以阻止应用程序中的所有内容,包括警报,直到您隐藏窗口为止。