Wie verstecke ich die Statusleiste in einer Swift iOS-App?

201

Ich möchte die Statusleiste oben auf dem Bildschirm entfernen.

Das funktioniert nicht:

func application
(application: UIApplication,
didFinishLaunchingWithOptions launchOptions: NSDictionary?)
-> Bool
{
        application.statusBarHidden = true
        return true
}

Ich habe auch versucht:

func application
(application: UIApplication,
didFinishLaunchingWithOptions launchOptions: NSDictionary?)
-> Bool
{
    self.window = UIWindow(frame: UIScreen.mainScreen().bounds)

    var controller = UIViewController()
    application.statusBarHidden = true
    controller.setNeedsStatusBarAppearanceUpdate()

    var view = UIView(frame: CGRectMake(0, 0, 320, 568))
    view.backgroundColor = UIColor.redColor()
    controller.view = view

    var label = UILabel(frame: CGRectMake(0, 0, 200, 21))
    label.center = CGPointMake(160, 284)
    label.textAlignment = NSTextAlignment.Center
    label.text = "Hello World"
    controller.view.addSubview(label)

    self.window!.rootViewController = controller
    self.window!.makeKeyAndVisible()
    return true
}
Jay
quelle
Mögliches Duplikat von Wie verstecke ich eine Statusleiste in iOS?
Jake Chasan

Antworten:

449

Sie sollten prefersStatusBarHidden wirklich auf Ihren View Controllern implementieren:

Swift 3 und höher

override var prefersStatusBarHidden: Bool {
    return true
}
Drawag
quelle
4
Ich denke, Jays Absicht ist es, die Statusleiste für die vollständige App auszublenden. Aus diesem Grund hätte er die Versteckfunktion in didFinishLaunchingWithOptions der Anwendung geschrieben. Wie verstecke ich die Statusleiste für die komplette App?
Satyam
@ Satyam hat einen guten Punkt, es wäre schön, dies während der gesamten Anwendung zu entfernen. Gibt es einen Ansatz, um dies durch Vererbung umzusetzen? Oder über Protokollerweiterung?
Dan Beaulieu
3
@ DanBeaulieu Ich denke, durch Vererbung wäre eine großartige Lösung. Erstellen Sie eine UIViewController-Unterklasse, in der der ausgeblendete Balken auf true gesetzt ist, und lassen Sie dann alle Ihre Unterklassen von dieser erben. Ein anderer Ansatz könnte Swizzling
CrisisGriega
1
Swift 3 Code hat nicht funktioniert, siehe: stackoverflow.com/a/38902285/129202
Jonny
1
Bei dieser Methode gibt es einen Fehler: Wenn Sie eine Segue durchführen möchten, fällt Ihre übergeordnete Ansicht des aktuellen Viewcontrollers um etwa 20 px ab
iman kazemayni
99
  1. Gehen Sie zur Datei Info.plist
  2. Bewegen Sie den Mauszeiger über eine dieser Zeilen, und die Tasten (+) und (-) werden angezeigt.
  3. Klicken Sie auf das Pluszeichen, um einen neuen Schlüssel hinzuzufügen. Geben Sie am Anfang mit Großbuchstaben V ein. Die erste Wahl ist automatisch die Anzeige der Statusleiste auf Controller-Basis.
  4. Fügen Sie das als SCHLÜSSEL hinzu.
  5. Stellen Sie den Wert auf "NEIN".
  6. Gehen Sie zu Ihnen AppDelegate.swift
  7. Fügen Sie den Code innerhalb der Methode hinzu

    func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject:AnyObject]?) -> Bool {
        application.statusBarHidden = true
        return true
    }

GETAN! Führen Sie Ihre App und keine Statusleiste mehr aus!

Nycdanie
quelle
1
Zuerst dachte ich, dass diese Lösung gut funktioniert, aber dann bemerkte ich, dass sie einen Fehler verursacht, den ich mit CG_CONTEXT_SHOW_BACKTRACE debuggen musste. Zurückverfolgt auf das Hinzufügen von "View Controller-basierte Statusleiste Aussehen"
Sean
Funktionierte gut für mich in IOS 9 2.2
uplearnedu.com
1
Arbeitete für iOS 10.1 Simulator. Danke, @nycdanie.
Jerome
7
Zusätzlich zum Setzen von "Ansicht der Controller-basierten Statusleiste anzeigen" auf NEIN, fügen Sie auch "Statusleiste ist anfangs ausgeblendet" auf "JA" hinzu. Dann müssen Sie dem View Controller keinen Code hinzufügen, und die Statusleiste wird in der gesamten Anwendung ausgeblendet. Xcode 8.1, Swift 3.0.1, iOS 10
tylerSF
1
@tylerSF Funktioniert super! Sie sollten dies als Antwort hinzufügen :)
Pétur Ingi Egilsson
72

Swift 3

Im Info.plistSet View controller-based status bar appearanceaufNO

Und Ruf an UIApplication.shared.isStatusBarHidden = true

Joseph Mark
quelle
1
Wenn ja eingestellt ist, funktioniert dies nur so.
Farzadshbfn
@farzadshbfn das stimmt nicht. Wie von mir erwähnt und getestet, funktioniert es mit booleschem NO.
Codetard
43

Wenn Sie die Statusleiste beim Tippen auf eine Schaltfläche ausblenden und wieder aufrufen möchten , während Sie zum Ein- und Ausschalten des Einblendmenüs , von Popups usw. die folgende Methode verwenden: -

So blenden Sie die Statusleiste aus: -

UIApplication.shared.keyWindow?.windowLevel = UIWindowLevelStatusBar

So rufen Sie die Statusleiste wieder auf:

UIApplication.shared.keyWindow?.windowLevel = UIWindowLevelNormal 
Vincent Joy
quelle
Dies ist eher ein Hack. Ich würde mich nicht so in das Fenster einmischen wollen ... besonders wenn es bereits eine Lösung gibt. Ich würde Entwickler ermutigen, die prefersStatusBarHiddenEigenschaft wie bereits erwähnt zu überschreiben .
Stephen Paul
2
Dies kann verwendet werden, wenn wir die Statusleiste für einen Moment ausblenden und wieder aufrufen möchten. Wenn in meiner App das Schiebereglermenü von links kommt, muss ich die Statusleiste ausblenden. und wenn das Menü verschwindet, müssen wir die Statusleiste zurückbringen, wie in der iOS-App von Google Mail. In solchen Szenarien können wir diese verwenden.
Vincent Joy
3
Es ist ein Hack, und ich würde mich nicht einmischen, aber es funktioniert im Moment. Ein bisschen wie ihr alle sagt. Das Problem dabei prefersStatusBarHiddenist, dass Ansichten, die mithilfe von Einschränkungen an die Statusleiste gebunden sind, sowie Navigationsleisten sich schlecht bewegen, wenn Sie die Statusleiste mit ein- oder ausschalten prefersStatusBarHidden . Im Moment scheint nur diese Antwort das zu umgehen.
Jonny
Ich stimme @Jonny voll und ganz zu, ich mag diese Lösung auch nicht, aber wie er sagte, wird das Überschreiben prefersStatusBarHiddenIhre Einschränkung durcheinander bringen. Soweit macht das die Arbeit. Ich benutze jedoch einen kleinen Wrapper, um die Verwendung von Singletons zu vermeiden. Sie finden ihn hier
rgkobashi
34

Wenn Sie einen visuellen Ansatz bevorzugen, anstatt ihn zu codieren, verwenden Sie diese Methode: in Ihrem info.plist

Geben Sie hier die Bildbeschreibung ein fügen Sie einfach View controller-based status bar appearanceaufNO

und Status bar is initially hiddenalsYES

MiladiuM
quelle
Dies ist die kanonische Antwort im Jahr 2018
ChrisH
28
 override func viewWillAppear(animated: Bool) {
    super.viewWillAppear(true);
    navigationController?.navigationBar.hidden = true // for navigation bar hide
    UIApplication.sharedApplication().statusBarHidden=true; // for status bar hide
}
Mohit Tomar
quelle
28

Update für iOS 10 / Swift 3.0

Keine Funktion mehr, jetzt eine Eigenschaft ...

override var prefersStatusBarHidden: Bool {
    return true
}
atlwx
quelle
Wissen Sie, wie man dies in der gesamten App einstellt, muss ich dies derzeit in jeden viewController eingeben
William T.
Versuchen Sie das Menü Suchen und dann Suchen und Ersetzen im Projekt? Vielleicht? Aber diese verdammte zusätzliche Klammer mit dem verschachtelten Get ... hmmm ... keine Ahnung. gute Frage!
atlwx
prefersStatusBarHidden wurde nie aufgerufen
Bagusflyer
6
Sie brauchen das nicht, get { }wenn Sie kein haben set, schreiben Sie einfachreturn true
Daniel
16

in Swift 3.x:

override func viewWillAppear(_ animated: Bool) {
    UIApplication.shared.isStatusBarHidden = true
}
Samira Ekrami
quelle
Dies ist in iOS 9.0
Georgios
16

Gehen Sie zu Ihrer Info.plist und fügen Sie zwei Schlüssel hinzu:

Gehen Sie zu Ihrer Info.plist und fügen Sie zwei Schlüssel hinzu:

janaz
quelle
12

Das Problem hier hat also eigentlich nichts mit Swift zu tun, sondern nur damit, wie das Erscheinungsbild der Statusleiste ab iOS 7 behandelt wird.

Standardmäßig steuern Ansichtssteuerungen das Erscheinungsbild der Statusleiste individuell, wenn sie auf dem Bildschirm angezeigt werden. Wenn Sie diese Methode zur Steuerung der Statusleiste verwenden möchten, können Sie die folgenden Methoden für alle Ansichtssteuerungen überschreiben, für die Sie das Erscheinungsbild ändern möchten:

prefersStatusBarHidden, preferredStatusBarStyle, preferredStatusBarAnimation,

In Ihrem Fall würden Sie nur implementieren prefersStatusBarHiddenund zurückkehren true.

Die andere Möglichkeit besteht darin, das Erscheinungsbild der Statusleiste auf Anwendungsebene zu steuern. Dies scheint das zu sein, was Sie tatsächlich versuchen (durch Einstellen application.statusBarHidden).

Damit dies funktioniert, müssen Sie die Info.plistDatei Ihrer App öffnen , den Schlüssel hinzufügen UIViewControllerBasedStatusBarAppearanceund einen Wert von angeben NO.

Dima
quelle
1
Ich denke du meinst return true für prefersStatusBarHidden. NO gehört zu ObjC und ist sowieso der falsche Bool-Wert.
HenryRootTwo
@HenryRootTwo nicht in .plist-Dateien. Dort verwenden wir noch JA / NEIN
Alex Salom
8

Ich habe das tatsächlich selbst herausgefunden. Ich werde meine Lösung als weitere Option hinzufügen.

extension UIViewController {
    func prefersStatusBarHidden() -> Bool {
        return true
    }
}
Jay
quelle
Netter Ansatz, um die Dinge sauber und modular zu halten
Roger Fernandez Guri
2
Ich kann das nicht umsetzen. Vielleicht liegt es daran, dass ich jetzt Swift 1.2 benutze. Ich erhalte die Fehlermeldung: "Methode 'prefersStatusBarHidden ()' mit Objective-C-Selektor 'prefersStatusBarHidden' widerspricht der vorherigen Deklaration mit demselben Objective-C-Selektor". Ich habe zu Beginn auch das Schlüsselwort override hinzugefügt, erhalte aber immer noch den gleichen Fehler.
Andrej
Müssen Sie dies zu jeder Ansicht hinzufügen?
Sean
Funktioniert nicht in Swift 2, zeigt Fehler an, wie oben von @Andrej erläutert.
Nagendra Rao
4

Okay, dies wird zu einem Problem für mich, da iOS 9 keine der oben genannten Methoden wie UIApplication.sharedApplication().statusBarHidden = true oder unterstützt

UIApplication.sharedApplication().setStatusBarHidden(true, withAnimation: UIStatusBarAnimation.None)

und

override func prefersStatusBarHidden() -> Bool {
     return true
}

funktioniert, bietet aber keine programmierbare Lösung, bei der ich unter bestimmten Bedingungen Änderungen vornehmen kann. ( statusBarHidden = trueund statusBarHidden = falsewie wir es vorher getan haben).

Lösung für diesen Wahnsinn:

Durch Hinzufügen zu " GefälltprefersStatusBarHidden() mir" unten können UIViewControllerBasedStatusBarAppearanceSie das Ausblenden und Anzeigen der Statusleiste programmgesteuert steuern, ohne Ihrer info.plist Einstellungen hinzuzufügen :

var showStatusBar = true

override func prefersStatusBarHidden() -> Bool {
     if showStatusBar {
         return false
     }
     return true
}

private func showStatusBar(enabled: Bool) {
    showStatusBar = enabled
    prefersStatusBarHidden()
}

Verwenden Sie es dann im gesamten Code folgendermaßen:

//Hide Status Bar
showStatusBar(false)

ODER

//Show Status Bar
showStatusBar(true)
CodeOverRide
quelle
1
Ist ein prefersStatusBarHiddenAnruf sinnvoll? Ich denke du meinst self.setNeedsStatusBarAppearanceUpdate()nach showStatusBarZuweisung
Leo
Es ist wirklich Wahnsinn, nicht wahr? Was für eine erbärmliche API das ist und schon so lange ist. Diese Art von Dingen macht die iOS-Entwicklung manchmal unglaublich frustrierend.
Womble
@ Womble, ja und es kann auch ziemlich kompliziert werden. Hoffentlich hat Swift 3.0 eine bessere Bibliothek und unterstützt, da sich auf den ersten Blick eine ganze Menge von Swift 2.3 ändern wird.
CodeOverRide
Anstatt prefersStatusBarHidden von Ihrer Methode aus aufzurufen, können Sie setNeedsStatusBarAppearanceUpdate
Oscar
4

Nur um hinzuzufügen, wenn die prefersStatusBarHiddenMethode oder Variable View controller-based status bar appearanceüberschrieben wird, muss die in Info.plist YES sein, sonst hat die Überschreibung keine Auswirkung

Huanyan
quelle
4

in Swift 4.2 ist es jetzt eine Eigenschaft.

override var prefersStatusBarHidden: Bool {
    return true
}
Rawand Saeed
quelle
3

In meinem Fall suchte ich nach der Statusleiste, um sie bei Bedarf auszublenden / anzuzeigen. anstatt nur, wenn die Ansicht geladen wird oder verschwindet.

schnell 3.x.

//show status bar initially
var showStatusBar = true

//set the parameters
override var prefersStatusBarHidden: Bool {

    if showStatusBar == true {

        //does not prefer status bar hidden
        print("does not prefer status bar hidden")
        return false

    } else {

        //does prefer status bar hidden
        print("does prefer status bar hidden")
    return true

    }
}

//ex: hide status bar and call parameter function again whenever you want
        showStatusBar = false
        setNeedsStatusBarAppearanceUpdate()
Felecia Genet
quelle
3

Swift 5: Im Hauptansichts-Controller oder im Hauptnavigations-Controller, falls vorhanden,

    override var preferredStatusBarStyle: UIStatusBarStyle {
        return .lightContent
    }

    override var prefersStatusBarHidden: Bool {
        return false
    }

Und "Controller-basiertes Statusleisten-Erscheinungsbild anzeigen" in plist muss JA sein, sonst wird der obige Code nicht aufgerufen.

Wenn Sie die Statusleiste beim Starten der App ausblenden möchten, muss "Statusleiste ist anfangs ausgeblendet" in plist JA sein. Dies kann verhindern, dass das Startbild verzerrt wird, wenn ein zusätzlicher blauer Balken oben auf dem Bildschirm angezeigt wird.

Sam Xu
quelle
2

Eine Lösung, die für mich funktioniert; Wenn Sie die Statusleiste während des Ladens auf einem bestimmten Ansichts-Controller ausblenden möchten:

import UIKit

class ViewController: UIViewController {

private var hideStatusBar: Bool = false

override var prefersStatusBarHidden: Bool {
    return hideStatusBar
}

override var preferredStatusBarUpdateAnimation: UIStatusBarAnimation {
    return UIStatusBarAnimation.slide
}

override func viewDidLoad() {
    super.viewDidLoad()

    view.backgroundcolor = .white
    hideStatusBar = true

    UIView.animate(withDuration: 0.3) {
        self.setNeedsStatusBarAppearanceUpdate()
    }
}

Achtung: Wenn Sie in Ihrer info.plist den Schlüssel "Erscheinungsbild der Controller-basierten Statusleiste anzeigen " auf " NEIN " setzen, funktioniert der obige Code nicht. Sie sollten den Schlüssel auf " JA " setzen oder ihn aus info.plist entfernen

andre_hold
quelle
Sie können die hideStatusBar-Eigenschaft nicht überschreiben, da es sich um eine gespeicherte Eigenschaft handelt! Sie können jedoch einfach einen anderen Namen wählen und Ihre Animation funktioniert.
XcodeNOOB
2

Aktivieren Sie in Ihrem Projekt Allgemein-> Bereitstellungsinfo-> Statusleistenstil das Häkchen der Statusleiste ausblenden. Hinweis: - Die Statusleiste wird in der gesamten Anwendung ausgeblendet

Sweta Vani
quelle
1
Dies funktioniert bei mir (ios 12), bei plist-Antworten nicht.
Drei
2

Versuchen Sie für Swift 4+ den folgenden Code (getestet unter Swift 4.0, 4.1 - IOS 10, 11):

override var prefersStatusBarHidden: Bool { return true }

override func viewDidAppear(_ animated: Bool) {
    super.viewDidAppear(animated)
    // call this func to force preferredStatusBarStyle to be read again.
    setNeedsStatusBarAppearanceUpdate()
}
Codierer ACJHP
quelle
2

Swift 5+

In meinem Fall muss ich die ausgeblendete Statusleiste unter bestimmten Bedingungen aktualisieren.

Aus diesem Grund erstelle ich einen Basis-Controller, BaseViewControllerder neue Eigenschaften enthält hideStatusBar.

Andere Ansichtssteuerungen sind Unterklassen dieser Basissteuerung. Wenn ich das Verhalten der Statusleiste aktualisieren möchte, muss ich nur diesen hideStatusBarWert ändern .

class BaseViewController: UIViewController {

    var hideStatusBar: Bool = false {
        didSet {
            setNeedsStatusBarAppearanceUpdate()
        }
    }

    override var prefersStatusBarHidden: Bool {
           return hideStatusBar
    }
}

Wie benutzt man

final class ViewController: BaseViewController, UIScrollViewDelegate {
    let scrollView = UIScrollView()

    ...

    func scrollViewDidScroll(_ scrollView: UIScrollView) {
        UIView.animate(withDuration: 0.3) {
            if scrollView.contentOffset.y > 100 {
                self.hideStatusBar = true
            } else {
                self.hideStatusBar = false
            }
        }
    }
}

Demo

Hier ist eine Demo, mit UIView.animate(...)der ich den Übergang reibungsloser gestalten kann.

Geben Sie hier die Bildbeschreibung ein

nahung89
quelle
1

Ich verwende Xcode 8.1 (8B62) mit einem Bereitstellungsziel von 10.1 und hatte mit den oben genannten Überschreibungsoptionen nicht viel Glück. Das Aktivieren der Option "Statusleiste ausblenden" in den Bereitstellungsinformationen hat mir jedoch geholfen.

Projekt> Allgemein

Ich hoffe das hilft.

danmerfeld
quelle
1

Wenn Sie den View Controller modal präsentieren, versuchen Sie es

viewController.hidesBottomBarWhenPushed = true
viewController.modalPresentationCapturesStatusBarAppearance = true
YannSteph
quelle
0
func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {
        application.isStatusBarHidden = true
        return true
    }
Prasad Bulbule
quelle
4
Wenn Sie eine Frage beantworten, erläutern Sie bitte Ihre Antwort. Das Code-Snippet ist keine richtige Antwort.
LazerBanana
0

Sie können diesen Code in Ihrem verwenden ViewController Class scope

open override var prefersStatusBarHidden: Bool { return true }
Sajjad
quelle
Vielen Dank für die Antwort. Möchten Sie noch etwas näher darauf eingehen? Wo genau muss er die Codezeile hinzufügen und warum würde das funktionieren? Siehe den Abschnitt Wie schreibe ich eine gute Antwort ?
9953-div-37
0

In Ihrem Projekt-> Allgemein-> Bereitstellungsinformationen

Statusleistenstil: -

gerade markiert Statusleiste ausblenden (iOS 10)

VD Purohit
quelle
0

Swift 4

//MARK:- Show Status Bar
UIApplication.shared.isStatusBarHidden = false

//MARK:- Hide Status Bar
UIApplication.shared.isStatusBarHidden = true
Shakeel Ahmed
quelle
ok für jetzt habe ich keine ios 12 ich habe 11.4 wenn sein update ich werde es auch reparieren, auch wenn du teamviewer hast werde ich kommen und es auf deinem system reparieren
Shakeel Ahmed
es ist veraltet
Vyachaslav Gerchicov
0

Aktualisiert für iOS 13 und Swift 5

Wenn keine der oben genannten Antworten für Sie funktioniert. Überprüfen Sie Ihre Liste, um festzustellen, ob Sie Folgendes haben:

"Controller-basiertes Erscheinungsbild der Statusleiste anzeigen"

Wenn ja, stellen Sie es auf JA !!!!!

Dann funktioniert der folgende Code.

override var prefersStatusBarHidden: Bool {
    return true
}
Legolas Wang
quelle