我创建了一个额外的 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()
}

ios - Swift iOS - 如何在两个 UIWindows 之间切换/切换并制作 keyWindow-LMLPHP

ios - Swift iOS - 如何在两个 UIWindows 之间切换/切换并制作 keyWindow-LMLPHP

ios - Swift iOS - 如何在两个 UIWindows 之间切换/切换并制作 keyWindow-LMLPHP

最佳答案

在评论中总结建议。

问题是操作表总是从关键窗口显示,但附加窗口即使在最小化时仍然是关键窗口。

显而易见的解决方案是在最小化附加窗口时使主窗口成为关键窗口。请参阅 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/

10-13 06:35