Swift iOS - Как переключаться между двумя окнами UIWindows и переключаться между ними - PullRequest
0 голосов
/ 29 июня 2018

Я создал дополнительное окно UIWindow, которое будет представлено поверх главного окна. Пользователь нажимает кнопку, и она переходит через главное окно. Пользователь может свернуть дополнительное окно, и оно будет находиться над панелью управления, как на картинке ниже. Они могут увеличить его, чтобы закрыть главное окно или отклонить его, и он будет уничтожен Работает нормально.

Я также создал настраиваемый лист действий, который запускается из нижней части экрана. Если дополнительное окно полностью покрывает главное окно, и лист действий запускается, он прекрасно запускается внутри дополнительного окна. Если дополнительного окна нет на экране, оно прекрасно запускается внутри главного окна.

Проблема в том, что если дополнительное окно свернуто на экране, и я хочу запустить лист действий из главного окна, лист действий вместо этого запускается внутри дополнительного окна, он не может различить два. Я открыл 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)
         }
      }
}

Класс MainView:

@IBAction func mainWindowActionSheetButton(_ sender: UIButton) {

      let customActionSheet = CustomActionSheet()
      customActionSheet.displayActionSheet()
}

Дополнительный класс Windows:

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
    }
 }

AnotherController Class, у которого есть кнопка, которая также запускает лист действий:

@IBAction func additionalWindowActionSheetButton(_ sender: UIButton) {

      let customActionSheet = CustomActionSheet()
      customActionSheet.displayActionSheet()
}

window in window

main window

additional window

Ответы [ 2 ]

0 голосов
/ 30 июня 2018

Вот кодовая разбивка принятого ответа @Sulthan. Прочитайте комментарии в коде для объяснения.

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() // don't call this because it doesn't need to be the keyWindow as of yet. The window?.isHidden property above this makes the window visible
 }

 func maximizeOrMinimizeWindow() {

    if maximized {

        window.first?.makeKey // when the additional window is maximized make it the keyWindow
    } else {

        UIApplication.shared.windows.first?.makeKey() // when the additional window is minimized set the main window back as the key window
    }
 }

Это также должно быть указано тогда, когда дополнительное окно удаляется из суперпредставления или уничтожается, убедитесь, что главное окно снова установлено как keyWindow, используя UIApplication.shared.windows.first?.makeKey()

0 голосов
/ 29 июня 2018

Суммируйте советы в комментариях.

Проблема в том, что лист действий всегда отображается из окна key , но дополнительное окно остается окном key , даже когда оно свернуто.

Очевидное решение - сделать главное окно ключевым, когда дополнительное свернуто. См. UIWindow.makeKey () или UIWindow.makeKeyAndVisible () .

Так как UIApplication.shared.windows упорядочены по уровню окна (сначала задний), вы всегда можете добраться до главного окна, используя UIApplication.shared.windows.first.

Поэтому

UIApplication.shared.windows.first?.makeKey()

сделает главное окно окном key , а свернутое окно перестанет быть окном key .

...