我创建了一个额外的 UIWindow,它将显示在主窗口的顶部。用户按下一个按钮,它会在主窗口上转换。用户可以最小化附加窗口,它会像下面的图片一样位于 tabBar 上方。他们可以放大它以覆盖主窗口或关闭它并被破坏。它工作正常。
我还创建了一个从屏幕底部启动的自定义操作表。如果附加窗口完全覆盖主窗口并启动操作表,它将在附加窗口内完美启动。如果附加窗口不在屏幕上,它会在主窗口内完美启动。
问题是如果附加窗口在屏幕上最小化并且我想从主窗口启动 Action 表, Action 表会在附加窗口内启动,它无法区分两者。 我打开了 3D 可视化工具,它显示主窗口是 off
,附加窗口是 on
。
显示自定义操作表时如何区分两个窗口?
顺便说一句,如果两个窗口都存在并且操作表是从主窗口启动的,我会隐藏附加窗口。我还查看了其他答案,他们说要使用我已经在做的 UIApplication.shared.keyWindow.addSubview
。
CustomActionSheet 类:
var collectionView: UICollectionView!
var deltaY: CGFloat!
let height: CGFloat = 200 // 4 cells x 50 pts each
func displayActionSheet(){
if let window = UIApplication.shared.keyWindow {
// collectionView initialized...
window.addSubview(collectionView)
deltaY = window.frame.height - height
collectionView.frame = CGRect(x: 0, y: window.frame.height, width: window.frame.width, height: height)
UIView.animate(withDuration: 0.5, delay: 0, usingSpringWithDamping: 1, initialSpringVelocity: 1, options: [.curveEaseOut], animations: {
self.collectionView.frame = CGRect(x: 0, y: deltaY, width: self.collectionView.frame.width, height: self.collectionView.frame.height)
}
}
}
主 View 类:
@IBAction func mainWindowActionSheetButton(_ sender: UIButton) {
let customActionSheet = CustomActionSheet()
customActionSheet.displayActionSheet()
}
附加窗口类:
let myVC = MyController()
var nav: UINavigationController?
var window: UIWindow!
var maximized = true
override init() {
super.init()
window = UIWindow()
window.backgroundColor = .clear
window.windowLevel = UIWindowLevelStatusBar
nav = UINavigationController(rootViewController: myVC)
window.rootViewController = nav
window?.isHidden = false
window?.makeKeyAndVisible()
}
func maximizeOrMinimizeWindow() {
if maximized {
// show this full screen
} else {
// show this window minimized like in the picture
}
}
具有启动操作表的按钮的另一个 Controller 类:
@IBAction func additionalWindowActionSheetButton(_ sender: UIButton) {
let customActionSheet = CustomActionSheet()
customActionSheet.displayActionSheet()
}
最佳答案
在评论中总结建议。
问题是操作表总是从关键窗口显示,但附加窗口即使在最小化时仍然是关键窗口。
显而易见的解决方案是在最小化附加窗口时使主窗口成为关键窗口。请参阅 UIWindow.makeKey() 或 UIWindow.makeKeyAndVisible() 。
由于 UIApplication.shared.windows
是按窗口级别排序的(后面的在前),因此您始终可以使用 UIApplication.shared.windows.first
到达主窗口。
所以
UIApplication.shared.windows.first?.makeKey()
将使主窗口成为关键窗口,最小化的窗口将不再是关键窗口。
关于ios - Swift iOS - 如何在两个 UIWindows 之间切换/切换并制作 keyWindow,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/51105924/