如何将UIView对象添加到iOS 13中的当前应用程序窗口中

问题描述 投票:0回答:2

这是我想要做的:

[当用户单击当前视图控制器上的按钮时,我想展示一个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个视图:

Screenshot - Debug View Hierarchy

如何在> = iOS 13上执行此操作?

swift ios13 uiwindow uiwindowscene
2个回答
0
投票

更改


0
投票

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

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

© www.soinside.com 2019 - 2024. All rights reserved.