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 № 1In 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
... Einstellungself.overlayWindow.hidden = NO
ist genug. - Du kannst hinzufügen
UIView
Unteransichten direkt auf dieUIWindow
. Sie müssen einen starken Bezug auf halten
self.overlayWindow
. Wenn es freigegeben wird, dieUIWindow
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
}
}