Как сохранить UIView всегда показывать поверх нескольких просмотров - PullRequest
2 голосов
/ 03 июля 2019

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

У меня есть пользовательский UIView, который появляется, когда пользователи касаются ячейки табличного представления.В рамках функции didSelectRowAt tableView я попытался:

(UIApplication.shared.delegate as! AppDelegate).window?.addSubview(self.subView!)

и

self.view.addSubview(self.subView!)

Оба функционируют аналогично с представлением, появляющимся поверх текущего контроллера View и позволяющим пользователям по-прежнему взаимодействовать с таблицей.Но когда я представляю новый ViewController, subView исчезает, так как он не был добавлен в новый View.

1 Ответ

1 голос
/ 03 июля 2019

Подкласс UIWindow и переопределение addSubview(), чтобы убедиться, что ваш оверлейный вид всегда сверху:

weak var overlay: MyOverlayView!

override func addSubview(_ view: UIView) {
    if let overlay = view as? MyOverlayView {
        self.overlay = overlay 
        super.addSubview(overlay)
    } else {
        self.insertSubview(view, belowSubview: overlay)
    }
}

Вы должны убедиться, что делегат приложения использует ваш пользовательский класс в качестве главного окна приложения, а не суперкласс UIWindow. Для этого удалите запись «Основное имя файла раскадровки» из своего Info.plist и вместо этого вручную создайте главное окно в AppDelegate:

@UIApplicationMain
class AppDelegate: UIResponder, UIApplicationDelegate {

    var window: MyCustomWindow?


    func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]? = nil) -> Bool {
        self.window = MyCustomWindow(frame: UIScreen.main.bounds)

        // 1. Add your overlay view to the window
        // (...)

        // 2. Load your initial view controller from storyboard, or 
        //  instantiate it programmatically
        // (...)

        window?.makeKeyAndVisible()
        return true
    }

Примечание. Я не проверял этот код. Дайте мне знать в комментариях, если есть проблема.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...