Jak ukryć pasek stanu w aplikacji Swift na iOS?

201

Chciałbym usunąć pasek stanu u góry ekranu.

To nie działa:

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

Próbowałem też:

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
}
Sójka
źródło
Możliwy duplikat Jak ukryć pasek stanu w iOS?
Jake Chasan,

Odpowiedzi:

449

Naprawdę powinieneś zaimplementować prefersStatusBarHidden na swoich kontrolerach widoku:

Swift 3 i nowszy

override var prefersStatusBarHidden: Bool {
    return true
}
Drawag
źródło
4
Myślę, że intencją Jaya jest ukrycie paska stanu pełnej aplikacji. Dlatego napisałby funkcję ukrywania w aplikacji didFinishLaunchingWithOptions. Jak ukryć pasek stanu dla kompletnej aplikacji?
Satyam
@Satyam ma rację, dobrze byłoby usunąć to w całej aplikacji. Czy istnieje podejście do realizacji tego poprzez dziedziczenie? Lub poprzez rozszerzenie protokołu?
Dan Beaulieu
3
@ DanBeaulieu Myślę, że dziedziczenie byłoby świetnym rozwiązaniem. Utwórz podklasę UIViewController, w której pasek ukryty jest ustawiony na wartość true, a następnie spraw, aby wszystkie Twoje podklasy dziedziczyły po nim. Innym podejściem może być użycie Swizzling
crisisGriega 21.04.16
1
Kod Swift 3 nie działał, patrz: stackoverflow.com/a/38902285/129202
Jonny
1
W tej metodzie występuje błąd: gdy chcesz wykonać segue, widok twojego rodzica bieżącego
kontrolera
99
  1. Przejdź do pliku Info.plist
  2. Najedź kursorem na jedną z tych linii, a pojawi się przycisk (+) i (-).
  3. Kliknij przycisk plus, aby dodać nowy klucz. Zacznij od dużej litery V, a automatycznie pierwszym wyborem będzie Wyświetl pasek stanu oparty na kontrolerze.
  4. Dodaj to jako KLUCZ.
  5. Ustaw wartość VALUE na „NIE”
  6. Idź do ciebie AppDelegate.swift
  7. Dodaj kod w metodzie

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

GOTOWE! Uruchom aplikację i nie więcej paska stanu!

nycdanie
źródło
1
Na początku myślałem, że to rozwiązanie działa dobrze, ale zauważyłem, że powoduje błąd, który musiałem debugować za pomocą CG_CONTEXT_SHOW_BACKTRACE. Śledzono go wstecz dodając „Wyświetlanie paska stanu opartego na kontrolerze”
Sean,
Działa dobrze dla mnie w IOS 9 2.2
uplearnedu.com
1
Pracował dla symulatora iOS 10.1. Dzięki, @nycdanie.
Jerome
7
Oprócz ustawienia „Wyświetl wygląd paska stanu opartego na kontrolerze” na NIE, dodaj również „Pasek stanu jest początkowo ukryty” ustawiony na „TAK”. Następnie nie musisz dodawać kodu do kontrolera widoku, a pasek stanu zostanie ukryty w całej aplikacji. Xcode 8.1, Swift 3.0.1, iOS 10
tylerSF
1
@tylerSF Działa świetnie! Powinieneś dodać to jako odpowiedź :)
Pétur Ingi Egilsson
72

Szybki 3

W Info.plistzestawie View controller-based status bar appearancedoNO

I zadzwoń UIApplication.shared.isStatusBarHidden = true

Joseph Mark
źródło
1
Jeśli jest ustawiony na tak, jest to jedyny sposób, aby działał.
farzadshbfn
@farzadshbfn to nie w porządku. Jak wspomniano i przetestowałem, działa on z logicznym NO.
Codetard
43

Jeśli chcesz ukryć i przywrócić pasek stanu po dotknięciu przycisku , a podczas prezentacji i zamykania menu wysuwanego , wyskakujących okienek itp. Możesz użyć tej metody: -

Aby ukryć pasek stanu: -

UIApplication.shared.keyWindow?.windowLevel = UIWindowLevelStatusBar

Aby przywrócić pasek stanu: -

UIApplication.shared.keyWindow?.windowLevel = UIWindowLevelNormal 
Vincent Joy
źródło
To bardziej hack. Nie chciałbym mieszać się z takim oknem ... szczególnie, jeśli rozwiązanie już istnieje. Zachęcam programistów do zastąpienia prefersStatusBarHiddenwłaściwości tak, jak już wspomniano.
Stephen Paul,
2
można tego użyć, jeśli chcemy na chwilę ukryć i przywrócić pasek stanu .. w mojej aplikacji, gdy menu suwaka pochodzi z lewej strony, muszę ukryć pasek stanu. a kiedy menu zniknie, musimy przywrócić pasek stanu, jak w aplikacji Gmail Gmaila na iOS .. więc w tego rodzaju scenariuszach możemy tego użyć.
Vincent Joy,
3
Jest to hack, i nie będę się wtrącać, ale to nie praca na chwilę. Jak wszyscy mówili. Problem prefersStatusBarHiddenpolega na tym, że widoki powiązane z paskiem stanu za pomocą ograniczeń, a także paski nawigacji, będą się poruszać w złym stylu, jeśli włączasz / wyłączasz pasek stanu prefersStatusBarHidden . W tej chwili tylko ta odpowiedź wydaje się działać.
Jonny
Całkowicie zgadzam się z @Jonny, też nie podoba mi się to rozwiązanie, ale tak jak powiedział, zastąpienie zepsuje prefersStatusBarHiddentwoje ograniczenie. Jak na razie to działa. Jednak używam małego opakowania, aby uniknąć używania singletonów, możesz je znaleźć tutaj
rgkobashi
34

jeśli wolisz podejście wizualne niż kodowanie, użyj tej metody: w swoim info.plist

wprowadź opis zdjęcia tutaj po prostu dodaj View controller-based status bar appearancedoNO

i Status bar is initially hiddenjakYES

MiladiuM
źródło
To jest odpowiedź kanoniczna w 2018 r.
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
źródło
28

Aktualizacja dla iOS 10 / Swift 3.0

Nie jest już funkcją, teraz jest właściwością ...

override var prefersStatusBarHidden: Bool {
    return true
}
atlwx
źródło
Czy wiesz, jak ustawić to w całej aplikacji, obecnie muszę wprowadzić to w każdym widoku Sterownik
William T.
Wypróbuj menu Znajdź, a następnie Znajdź i zamień w projekcie? Być może? Ale ten cholerny dodatkowy aparat ortodontyczny z zagnieżdżonym dostaje ... hmmm ... nie wiem. dobre pytanie!
atlwx
prefersStatusBarHidden nigdy nie został nazwany
Bagusflyer
6
Nie potrzebujesz, get { }jeśli nie masz set, po prostu napiszreturn true
Daniel
16

w Swift 3.x:

override func viewWillAppear(_ animated: Bool) {
    UIApplication.shared.isStatusBarHidden = true
}
Samira Ekrami
źródło
To jest przestarzałe w iOS 9.0
Georgios
16

Przejdź do swojej Info.plist i dodaj dwa klucze:

Przejdź do swojej Info.plist i dodaj dwa klucze:

janaz
źródło
12

Tak więc ten problem nie ma nic wspólnego z Swift, ale z tym, jak obsługiwany jest wygląd paska stanu w iOS 7.

Domyślnie kontrolery widoków indywidualnie kontrolują wygląd paska stanu, gdy są na ekranie. Jeśli chcesz użyć tej metody kontrolowania paska stanu, możesz zastąpić następujące metody dla wszystkich kontrolerów widoku, dla których chcesz zmodyfikować wygląd:

prefersStatusBarHidden, preferredStatusBarStyle, preferredStatusBarAnimation,

W twoim przypadku wystarczy wdrożyć prefersStatusBarHiddeni zwrócić true.

Innym sposobem byłoby kontrolowanie wyglądu paska stanu na poziomie aplikacji. To wydaje się być tym, co faktycznie próbujesz zrobić (przez ustawienie application.statusBarHidden).

Aby to zadziałało, musisz otworzyć Info.plistplik aplikacji, dodać klucz UIViewControllerBasedStatusBarAppearancei nadać mu wartość NO.

Dima
źródło
1
Myślę, że masz na myśli return true dla prefersStatusBarHidden. NO należy do ObjC i i tak jest złą wartością bool.
HenryRootTwo
@HenryRootTwo nie ma w plikach .plist. Tam nadal używamy TAK / NIE
Alex Salom,
8

Sam to rozgryzłem. Dodam moje rozwiązanie jako inną opcję.

extension UIViewController {
    func prefersStatusBarHidden() -> Bool {
        return true
    }
}
Sójka
źródło
Ładne podejście do utrzymania czystości i modułowości
Roger Fernandez Guri
2
Nie mogę tego zaimplementować. Może dlatego, że teraz używam Swift 1.2. Pojawia się błąd: „Metoda” preferujeStatusBarHidden () ”z selektorem Objective-C„ prefersStatusBarHidden ”jest w konflikcie z poprzednią deklaracją z tym samym selektorem Objective-C”. Dodałem również słowo kluczowe zastępujące na początku, ale nadal pojawia się ten sam błąd.
Andrej
Czy musisz to dodać do każdego widoku?
Sean,
Nie działa w Swift 2, pokazuje błąd, jak wyjaśniono powyżej przez @Andrej.
Nagendra Rao
4

Okej, więc stało się to dla mnie problemem, ponieważ iOS 9 nie obsługuje żadnej z metod wymienionych powyżej, takich jak UIApplication.sharedApplication().statusBarHidden = true lub

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

i

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

działa, ale nie zapewnia programowalnego rozwiązania, w którym mogę zmienić pod warunkiem. ( statusBarHidden = truei statusBarHidden = falsejak już to zrobiliśmy wcześniej).

Rozwiązanie tego szaleństwa:

Dodając polubienieprefersStatusBarHidden() poniżej, możesz programowo kontrolować ukrywanie i wyświetlanie paska stanu bez dodawania UIViewControllerBasedStatusBarAppearanceustawień do swojej info.plist :

var showStatusBar = true

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

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

następnie użyj go w ten sposób w całym kodzie:

//Hide Status Bar
showStatusBar(false)

LUB

//Show Status Bar
showStatusBar(true)
CodeOverRide
źródło
1
Czy prefersStatusBarHiddendzwonienie ma jakiś sens? Myślę, że masz na myśli self.setNeedsStatusBarAppearanceUpdate()po showStatusBarprzydzieleniu
Leo
To naprawdę szaleństwo, prawda? Cóż to za żałosne API i tak było od tak dawna. Takie rzeczy sprawiają, że rozwój systemu iOS jest czasami bardzo frustrujący.
Womble,
@Womble, tak i może się również skomplikować. Mam nadzieję, że Swift 3.0 ma lepszą bibliotekę i obsługuje, ponieważ na pierwszy rzut oka zmieni się znacznie od swift 2.3 ... przełamując rzeczy.
CodeOverRide
Zamiast wywoływać metodę preferencjiStatusBarUkrytą w swojej metodzie, możesz wywołać setNeedsStatusBarAppearanceUpdate
Oscar
4

Wystarczy dodać, że podczas przesłonięcia prefersStatusBarHiddenmetody lub zmiennej, View controller-based status bar appearanceInfo.plist musi mieć wartość TAK, w przeciwnym razie zastąpienie nie będzie miało wpływu

Huanyan
źródło
4

w Swift 4.2 jest teraz własnością.

override var prefersStatusBarHidden: Bool {
    return true
}
Rawand Saeed
źródło
3

W moim przypadku szukałem paska stanu, aby ukryć / pokazać na żądanie; zamiast po prostu, gdy widok ładuje się lub znika.

szybki 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
źródło
3

Swift 5: W głównym kontrolerze widoku lub głównym kontrolerze nawigacji, jeśli masz,

    override var preferredStatusBarStyle: UIStatusBarStyle {
        return .lightContent
    }

    override var prefersStatusBarHidden: Bool {
        return false
    }

I „Wyświetl wygląd paska stanu na kontrolerze” w liście musi być TAK, w przeciwnym razie powyższy kod nie zostanie wywołany.

Jeśli chcesz ukryć pasek stanu podczas uruchamiania aplikacji, „Pasek stanu jest początkowo ukryty” w liście musi być TAK. Może to zapobiec zniekształceniu obrazu uruchamiania, gdy na górze ekranu pojawi się dodatkowy niebieski pasek.

Sam Xu
źródło
2

Rozwiązanie, które działa dla mnie; jeśli chcesz ukryć pasek stanu na określonym kontrolerze widoku podczas ładowania:

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()
    }
}

Uwaga: jeśli ustawisz klucz „ Wyświetl pasek stanu na kontrolerze ” na „ NIE ” w swoim info.plist, powyższy kod nie będzie działał. Powinieneś ustawić klucz na „ TAK ” lub usunąć go z info.plist

andre_hold
źródło
Nie można przesłonić właściwości hideStatusBar, ponieważ jest to właściwość przechowywana! możesz jednak wybrać inną nazwę, a animacja zadziała.
XcodeNOOB,
2

W projekcie Ogólne-> Informacje o wdrożeniu -> Styl paska stanu wybierz znacznik wyboru Ukryj pasek stanu Uwaga: - ukrywa pasek stanu w całej aplikacji

Sweta Vani
źródło
1
Działa to dla mnie (iOS 12), gdzie odpowiedzi Plist nie.
threeve
2

W przypadku Swift 4+ wypróbuj następujący kod (testowany w 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()
}
Coder ACJHP
źródło
2

Swift 5+

W moim przypadku muszę zaktualizować pasek stanu ukryty na podstawie niektórych warunków.

Z tego powodu tworzę podstawowy kontroler, BaseViewControllerktóry zawiera nową właściwość hideStatusBar.

Inne kontrolery widoku są podklasą tego kontrolera podstawowego. Wreszcie, gdy chcę zaktualizować zachowanie paska stanu, muszę tylko zmienić tę hideStatusBarwartość.

class BaseViewController: UIViewController {

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

    override var prefersStatusBarHidden: Bool {
           return hideStatusBar
    }
}

Jak używać

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
            }
        }
    }
}

Próbny

Oto wersja demonstracyjna, której używam, UIView.animate(...)aby przejście było płynniejsze.

wprowadź opis zdjęcia tutaj

nahung89
źródło
1

Używam Xcode 8.1 (8B62) z celem wdrożenia ustawionym na 10.1 i nie miałem szczęścia z wymienionymi powyżej opcjami przesłonięcia. Jednak sprawdzenie opcji „Ukryj pasek stanu” w informacjach o wdrożeniu pomogło mi.

Projekt> Ogólne

Mam nadzieję, że to pomoże.

Danmerfeld
źródło
1

Jeśli prezentujesz kontroler widoku modalnie, spróbuj

viewController.hidesBottomBarWhenPushed = true
viewController.modalPresentationCapturesStatusBarAppearance = true
YannSteph
źródło
0
func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {
        application.isStatusBarHidden = true
        return true
    }
Prasad Bulbule
źródło
4
Odpowiadając na pytanie, proszę wyjaśnić swoją odpowiedź, fragment kodu nie jest poprawną odpowiedzią.
LazerBanana,
0

Możesz użyć tego kodu w swoim ViewController Class scope

open override var prefersStatusBarHidden: Bool { return true }
Sajjad
źródło
Dziękuję za odpowiedź, czy chcesz bardziej szczegółowo opracować. Gdzie dokładnie musi dodać wiersz kodu i dlaczego to miałoby działać? Zobacz sekcję Jak napisać dobrą odpowiedź .
9953-div-37
0

W swoim projekcie-> Ogólne-> Informacje o wdrożeniu

Styl paska stanu: -

właśnie zaznaczony Ukryj pasek stanu (iOS 10)

VD Purohit
źródło
0

Szybki 4

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

//MARK:- Hide Status Bar
UIApplication.shared.isStatusBarHidden = true
Shakeel Ahmed
źródło
ok, na razie nie mam żadnego iOS 12, mam 11.4, kiedy to zaktualizuję, naprawię to również, również jeśli masz Teamviewer, przyjdę i naprawię to w twoim systemie
Shakeel Ahmed
jest przestarzałe
Wiaczasław Gerchicow
0

Zaktualizowano dla iOS 13 i Swift 5

Jeśli żadna z powyższych odpowiedzi nie działa dla Ciebie. Sprawdź swoją listę, aby zobaczyć, czy masz to:

„Wyświetlanie wyglądu paska stanu opartego na kontrolerze”

Jeśli tak, koniecznie ustaw wartość TAK !!!!!

Następnie zadziała następujący kod.

override var prefersStatusBarHidden: Bool {
    return true
}
Legolas Wang
źródło