2017-07-12 7 views
0

Es gibt die Hauptnummer UIWindow, die MainViewController enthält, die lightContent als preferredStatusBarStyle verwendet. Ich habe eine zweite UIWindow Instanz erstellt, um PopupViewController anzuzeigen, die default als preferredStatusBarStyle verwendet.Zustand der Statusleiste nach dem Schließen der zweiten UIWindow wiederherstellen

Wenn ich zeigen zweite UIWindow mit PopupViewController Statusleiste Stil Änderungen default, aber wenn ich es verstecken Stil keine Änderungen an lightContent zurück.

Das gleiche Problem gilt für Situation, wenn ich VC mit ausgeblendeter Statusleiste im Popup-Fenster habe - Statusleiste zeigt nicht, wenn Popup-Fenster geschlossen ist.

New UIWindow Schöpfung:

// Prepare window to show dialog box in 
newWindow = UIWindow(frame: UIScreen.main.bounds) 
newWindow?.windowLevel = 3 

// Overlay new window 
newWindow?.makeKeyAndVisible() 
self.mainWindow.windowLevel = 1 
self.mainWindow.endEditing(true) 
newWindow?.isHidden = false 

// Display dialog 
newWindow?.rootViewController = PopupViewController() 

New UIWindow Entlassung:

UIView.animate(
    withDuration: 1.0, 
    delay: 0, 
    usingSpringWithDamping: 1, 
    initialSpringVelocity: 0, 
    options: .curveEaseOut, 
    animations: { [weak self] in 
     self?.newWindow?.alpha = 0 
    }, 
    completion: { [weak self] _ in 
     self?.newWindow?.windowLevel = 0 
     self?.newWindow?.rootViewController = nil 
     self?.newWindow?.alpha = 1 
     self?.mainWindow.makeKeyAndVisible() 
    } 
) 

Thank you!

EDIT: Popup jederzeit auftreten kann, weiß ich nicht, die VC zu diesem Zeitpunkt aktiv war

Antwort

0

Das, was ich wurde UIViewController.setNeedsStatusBarAppearanceUpdate() suchte.Es ist eine bequeme Methode, VC mitzuteilen, dass die Statusleiste geändert wurde und wiederhergestellt werden muss.

// make main window key but transparent 
self.mainWindow.alpha = 0 
self.newWindow?.windowLevel = 0 
self.newWindow?.alpha = 1 
self.mainWindow.makeKey() 

// restore status bar appearance 
self.mainWindow.rootViewController!.setNeedsStatusBarAppearanceUpdate() 

// Fade in main window with (status bar is in proper state at this moment) 
UIView.animate(
     withDuration: 0.9, 
     delay: 0, 
     usingSpringWithDamping: 1, 
     initialSpringVelocity: 0, 
     options: .curveEaseIn, 
     animations: { [weak self] in 
      self?.mainWindow.alpha = 1 
     }, 
     completion: { [weak self] _ in 
      // destroy popup VC 
      self?.newWindow?.rootViewController = nil 
     } 
) 

Here is useful article on this subject

Danke an alle!

0

Änderung der Statusbar Stil auf ViewWillAppear

override func viewWillAppear(_ animated: Bool) { 
    UIApplication.shared.statusBarStyle = .lightContent 
} 
+0

Popup kann auf einem zufälligen VC erscheinen. Es fühlt sich irgendwie hacky an, den Stil manuell zurückzusetzen. Ich dachte, es gibt eine Möglichkeit zu sagen "OK, jetzt ist dieses Fenster wieder Master, hier ist es rootVC, erben Statusleiste Einstellungen von ihm". –

+0

hast du "View controller-based status bar appearance" auf NO auf info.plist gesetzt – Ragul

+0

Nein, ich brauche es leider VC-basiert –

0
  1. Bitte fügen Sie das folgenden Code auf Ihrem ersten Controller, in dem Sie Statusleiste Farbe Licht ändern.

    Überschreibung func viewDidAppear (_ animiert: Bool) {UIApplication.shared.setStatusBarStyle (UIStatusBarStyle.lightContent, animiert: false)}

  2. nun in zweiter Controller, in dem Sie Standardstatusleiste Stil wollen, setzen Sie den Code :

    Überschreibung func viewDidAppear (_ animiert: Bool) {UIApplication.shared.setStatusBarStyle (UIStatusBarStyle.default, animiert: false)}

Sie werden auf jeden Fall die richtige Lösung von oben c erhalten

Ode
+0

Problem ist, dass popup kann erscheint zu jeder Zeit und ich weiß jetzt nicht, welches VC in diesem Moment aktiv war. –

0

Einfache Lösung für Ihren Fall

  1. Schaufenster

Einfache Lösung für Ihren Fall

  1. New UIWindow Schöpfung:

    // Prepare window to show dialog box in 
    newWindow = UIWindow(frame: UIScreen.main.bounds) 
    newWindow?.windowLevel = 3 
    
    // Overlay new window 
    newWindow?.makeKeyAndVisible() 
    self.mainWindow.windowLevel = 1 
    self.mainWindow.endEditing(true) 
    newWindow?.isHidden = false 
    
    // Display dialog 
    newWindow?.rootViewController = PopupViewController() 
    // Now you can change status bar style default or other style 
    UIApplication.shared.statusBarStyle = .default 
    
  2. New UIWindow Entlassung:

    UIView.animate(
        withDuration: 1.0, 
        delay: 0, 
        usingSpringWithDamping: 1, 
        initialSpringVelocity: 0, 
        options: .curveEaseOut, 
        animations: { [weak self] in 
         self?.newWindow?.alpha = 0 
         // Revert back to default 
         UIApplication.shared.statusBarStyle = .lightContent 
        }, 
        completion: { [weak self] _ in 
         self?.newWindow?.windowLevel = 0 
         self?.newWindow?.rootViewController = nil 
         self?.newWindow?.alpha = 1 
         self?.mainWindow.makeKeyAndVisible() 
        } 
    ) 
    
+0

Es ist schön, weil es im Gegensatz zu anderen vorgeschlagenen Lösungen alles in Popup-VC behandelt, aber wie UIApplication.shared.setStatusBarStyle() 'seit 9.0 veraltet ist –

+0

@Andrejs Mironovs 'UIApplication.shared.statusBarStyle = .lightContent' Ich habe bereits in iOS 10 funktioniert dieser Code funktioniert gut, bitte überprüfen Sie es. – Vivek

Verwandte Themen