Как добавить объект UIView в текущее окно приложения в iOS 13 - PullRequest
0 голосов
/ 11 января 2020

Вот что я пытаюсь сделать:

Когда пользователь нажимает кнопку на текущем контроллере представления - я хочу представить 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 Как решить: «keyWindow» устарело в 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!]) 

Представление добавляется, но оно полностью сзади, за root контроллером представления, я добавил строку takeSubviewToFront, но это тоже не помогает. Вот как это выглядит - на самом деле есть 3 вида, которые я добавляю, как описано выше:

Screenshot - Debug View Hierarchy

Как я могу сделать это для> = iOS 13?

Ответы [ 2 ]

0 голосов
/ 11 января 2020

Из вашего снимка экрана выглядит, что представление добавляется в правильное окно; это просто в неправильном порядке z. Без дополнительного контекста о том, где в вашем коде вы добавляете это, невозможно сказать, почему это так (ie вы могли бы создавать V C впоследствии, и новые подпредставления всегда выдвигаются поверх существующих подпредставлений, если вы не укажете порядок az). ). Один из очень простых способов проверить правильность порядка z - просто перетащить вид, добавленный вами в окно, на передний план, как только появится V C, который вы видите впереди (ie в вызове viewWillAppear window.bringSubviewToFront(viewThatsSupposedToBeInFront). .

Если вы ВСЕГДА хотите, чтобы ваш вид находился поверх текущего окна, вы можете создать другое окно с более высоким уровнем окна onTopOfEveryThingWindow.windowLevel = .init(.greatestFiniteMagnitude). Это может блокировать все в приложении, включая предупреждения, пока вы не скроете окно.

0 голосов
/ 11 января 2020

Изменение

let keyWindow = UIApplication.shared.windows.filter {$0.isKeyWindow}.last
...