/ / Benutzerdefinierte Statusleiste über UINavigationBar - ios, object-c, swift

Benutzerdefinierte Statusleiste über UINavigationBar - ios, objective-c, swift

Ich füge eine benutzerdefinierte 20px-Statusleiste über einem hinzuUINavigationBar. In der Statusleiste wird die Bezeichnung "Refreshing ..." angezeigt, wenn der Benutzer zum Aktualisieren zieht. Im Normalbetrieb wird die Standardstatusleiste angezeigt, dann rufe ich an setStatusBarHidden:withAnimation: um die Standardstatusleiste auszublenden und die benutzerdefinierte Statusleiste dahinter anzuzeigen.

Mein Problem ist, dass die Navigationsleiste beim Ausblenden der Standardstatusleiste um 20 Pixel nach oben verschoben wird und die benutzerdefinierte Statusleiste überlappt!

Gibt es eine Möglichkeit, die UINavigationBar dazu zu zwingen, an derselben Stelle zu bleiben?

Antworten:

1 für die Antwort № 1

In Ordung! Die Lösung (wie Ryan vorschlug) war also, ein UIWindow zu erstellen und festzulegen:

self.overlayWindow.windowLevel = UIWindowLevelStatusBar;

Dadurch wird ein Fenster erstellt, das über der Statusleiste angezeigt wird. Ich wusste nicht, dass Sie mehrere UIWindows gleichzeitig anzeigen können. Dies ist eine unglaublich elegante Lösung.

Einige gotchas:

  • einstellen self.overlayWindow.hidden = NO. Neue Fenster werden standardmäßig ausgeblendet.
  • Sie unterlassen Sie Sie müssen einen Root-View-Controller für das neue Fenster festlegen.
  • Sie unterlassen Sie müssen anrufen makeKeyAndVisible... Einstellung self.overlayWindow.hidden = NO ist genug.
  • Du kannst hinzufügen UIView Unteransichten direkt auf die UIWindow.
  • Sie müssen einen starken Bezug auf halten self.overlayWindow. Wenn es freigegeben wird, die UIWindow verschwindet (da es nicht als Unteransicht hinzugefügt oder an anderer Stelle beibehalten wird)

    @property (nonatomic, strong) UIWindow *overlayWindow;
    
  • Die Anpassung an die Rotation kann etwas zusätzliche Arbeit erfordern.

Ich hatte ein bisschen Spaß und schuf eine Klasse, die eine Unterklasse bildet UIWindow und das Setup gekapselt. In Swift:

class StatusBarOverlay: UIWindow {

init(frame: CGRect) {
super.init(frame: frame)

self.windowLevel = UIWindowLevelStatusBar
self.hidden = false
self.userInteractionEnabled = false
}
}