iOS - Как сохранить вид спереди, когда контроллер представления представлен модально? - PullRequest
0 голосов
/ 23 декабря 2019

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

Я хочу, чтобы представление оставалось впереди, даже когда VC представлен модально иЯ хочу иметь возможность добавить некоторый код в мой файл AppDelegate для всех модальных ViewControllers или что-то в этом роде. Как я могу сделать это в Swift 5? Я думал, что если бы была функция, которая запускалась каждый раз, когда был представлен модальный VC, я мог бы добавить туда свой код. Вот как выглядит мой AppDelegate:


class AppDelegate: UIResponder, UIApplicationDelegate, ReachabilityObserverDelegate   {
    var reachability: Reachability?
    var window: UIWindow?
    var internetView: TestView?

    //This is called when the internet connects or disconnects
    func reachabilityChanged(_ isReachable: Bool) { 
        window = getKEYWindow()
        if !isReachable {
            window?.addSubview(internetView!)
        }
        else {
            internetView?.removeFromSuperview()
        }
    }

    func getKEYWindow() -> UIWindow? {
        return UIApplication.shared.connectedScenes.filter({$0.activationState == .foregroundActive}).map({$0 as? UIWindowScene}).compactMap({$0}).first?.windows.filter({$0.isKeyWindow}).first
    }

    func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {

        try? addReachabilityObserver()
        internetView = TestView(frame: CGRect(x:0, y: 50, width: UIScreen.main.bounds.size.width, height: 14))
        return true
    }

}

Основной ViewController:

Интернет выключен:

Push ViewController:

Текущий ViewController Модально:


Обновление: Я нашел другой способ держать мой взгляд спереди,Я добавил следующую строку internetView.layer.zPosition = .greatestFiniteMagnitude в didFinishLaunchingWithOptions, и она работала как шарм. Спасибо всем за помощь.

1 Ответ

0 голосов
/ 23 декабря 2019

Я мог бы предложить один из способов сделать это:

Чтобы открыть новое окно UIW более высокого уровня и нарисовать его поверх всего вашего приложения.

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

 _myWindow = [[UIWindow alloc]initWithFrame:[UIScreen mainScreen].bounds]; 
 [_myWindow makeKeyAndVisible];

 UIViewController* dummyVC = [[UIViewController alloc] init];
 dummyVC.view = [[UIView alloc]initWithFrame:_myWindow.bounds];
 [dummyVC.view setOpaque:NO]; 
 [dummyVC.view setAlpha:0.1f];

 [_myWindow setRootViewController:dummyVC];
 _myWindow.windowLevel = UIWindowLevelAlert + 1;

 [_myWindow.rootViewController.view.layer setBackgroundColor:[UIColor greenColor].CGColor]; 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...