Jak ukryć pasek stanu iOS


219

W mojej aplikacji wideo na iOS pasek stanu jest ukryty w niektórych kontrolerach widoku. Zrobiłem to za pomocą następującego kodu.

[[UIApplication sharedApplication] setStatusBarHidden:YES];
  • Działa na iOS 5 i iOS 6, ale nie na iOS 7.

  • Próbowałem z tym w szczególności kontrolerem widoku,

Na przykład:

-(BOOL)prefersStatusBarHidden { return YES; }

Działa dobrze, ale nie mogę ponownie wyświetlić paska stanu w kontrolerze nadrzędnym.



1
Jeśli styl paska stanu jest ustawiony w serii ujęć, po zmianie „paska stanu opartego na kontrolerze widoku” (poniżej) może być konieczne ustawienie stylu na liście, ponieważ ustawienie kontrolera widoku nie będzie już używane. stackoverflow.com/questions/18924345/…
Matt

1
Odpowiedziałem na inne pytanie. Spróbuj tego. [najprostszy sposób, aby programowo ukryć pasek stanu] [1] [1]: stackoverflow.com/a/27339754/3718498
wataru

1
Użyłem do tego sztuczki - opublikowałem ją jako pod cocoapods.org/pods/UIViewController+ODStatusBar , mam nadzieję, że przyda się każdemu
Alex Nazarsky

Odpowiedzi tutaj są już nieaktualne. Miałem problem ze znalezieniem poprawnej odpowiedzi na iOS 9, kiedy ukrywałem pasek stanu TYLKO EKRAN URUCHOMIENIA , więc linkowanie poniżej, więc mam nadzieję, że innym łatwiej będzie to zrobić: stackoverflow.com/questions/34413848/…
Ben

Odpowiedzi:


277

Należy dodać tę wartość do listy: „ Wyświetl wygląd paska stanu opartego na kontrolerze ” i ustaw ją na „ NIE ”.

enter image description here


40
Dla porównania, kluczem surowym jestUIViewControllerBasedStatusBarAppearance
William Denniss,

1
@ Rajneesh071 Co muszę zrobić, jeśli chcę ustawić preferStatusBarStyle do pracy, której potrzebuję "View controller-based status bar appearance" set it to "YES".?
Bimawa,


z jakim problemem się mierzysz?
Rajneesh071

wydaje się przestarzały, zepsuje twoją aplikację
Ben

194

Dodaj następujące informacje do swojej Info.plist:

<key>UIStatusBarHidden</key>
<true/>
<key>UIViewControllerBasedStatusBarAppearance</key>
<false/>

Wizerunek


Świetnie działa w Xcode 11.3, iOS 13
Wayne Henderson

113

Dodaj następujący wiersz w viewdidload

  [[UIApplication sharedApplication] setStatusBarHidden:YES
                                        withAnimation:UIStatusBarAnimationFade];

i dodaj nową metodę

  - (BOOL)prefersStatusBarHidden {
          return YES;
  }

zmień także plik info.plist Wyświetl wygląd paska stanu na kontrolerze "= NIE

to działa dla mnie


Niż ten działa dla mnie, ale muszę również dodać poniższy wiersz w Plist. „Wyświetl wygląd paska stanu na podstawie kontrolera” = NIE i, e Dodaj następujący wiersz w viewdidload [[UIApplication sharedApplication] setStatusBarHidden: YES withAnimation: UIStatusBarAnimationFade]; i dodaj nową metodę - (BOOL) prefersStatusBarHidden {return YES; } Dodaj „Wyświetl wygląd paska stanu opartego na kontrolerze” = NIE w pliku Plist
piaszczysty

prefersStatusBarHiddenjest to, co zrobiło dla mnie lewę (czy to z tym rozwiązaniem z innymi podobnymi)
Abdo

34

W Plist dodaj następujące właściwości.

Status bar is initially hidden = YES

View controller-based status bar appearance = NO

teraz pasek stanu zostanie ukryty.


8
Surowe klucze to UIStatusBarHidden i UIViewControllerBasedStatusBarAppearance
leolobato

27

Wypróbuj tę prostą metodę:


Cel C:

- (void)viewWillAppear:(BOOL)animated
{
    [super viewWillAppear:animated]
    [[UIApplication sharedApplication] setStatusBarHidden:YES withAnimation:UIStatusBarAnimationNone];
}

- (void)viewWillDisappear:(BOOL)animated
{
    [super viewWillDisappear:animated]
    [[UIApplication sharedApplication] setStatusBarHidden:NO withAnimation:UIStatusBarAnimationNone];
}

Szybki:

override func viewWillAppear(animated: Bool) 
{
    super.viewWillAppear(animated)
    UIApplication.sharedApplication().setStatusBarHidden(true, withAnimation: UIStatusBarAnimation.None)
}

override func viewWillDisappear(animated: Bool) 
{
    super.viewWillDisappear(animated)
    UIApplication.sharedApplication().setStatusBarHidden(false, withAnimation: UIStatusBarAnimation.None)
}

1
To była cudowna odpowiedź! Spróbuj również z różnymi UIStatusBarAnimations, są całkiem świetne.
VedTopkar

Nie zapomnij [super viewWillAppear:animated]i[super viewWillDisappear:animated]
SamB

1
To proste rozwiązanie działało dla mnie iOS 10. Sposób, aby być prostym człowiekiem!
coolcool1994

14

Zrobiłem następujące i wydaje się, że działa (nawet w iOS 8):

- (void)navigationController:(UINavigationController *)navigationController willShowViewController:(UIViewController *)viewController animated:(BOOL)animated
{
    if ([self respondsToSelector:@selector(setNeedsStatusBarAppearanceUpdate)]) {

        [[UIApplication sharedApplication] setStatusBarHidden:YES];
    }
}

- (BOOL)prefersStatusBarHidden {
    return YES;
}

12
  • UIApplication.setStatusBarX są przestarzałe od iOS9
  • To jest przestarzałe, aby UIViewControllerBasedStatusBarAppearance = NIE na twojej info.plist
  • Dlatego powinniśmy używać preferStatusBarX we wszystkich naszych kontrolerach widoku

Ale staje się bardziej interesujący, gdy zaangażowany jest UINavigationController:

  • Jeśli navigationBarHidden = true, wywoływane są preferowane statusy potomne UIViewController, ponieważ dziecko wyświetla zawartość pod paskiem stanu.
  • Jeśli navigationBarHidden = false, wywoływany jest preferowany status UINavigationController, w końcu wyświetla zawartość pod paskiem stanu.
  • Domyślny preferStatusBarStyle UINavigationController używa wartości z UINav.navigationBar.barStyle. .Default = zawartość czarnego paska stanu, .Black = zawartość białego paska stanu.
  • Więc jeśli ustawiasz barTintColor na jakiś niestandardowy kolor (którym prawdopodobnie jesteś), musisz również ustawić barStyle na .Black, aby uzyskać zawartość białego paska stanu. Ustawiłbym barStyle na czarny przed ustawieniem barTintColor, na wypadek gdyby barStyle przesłaniał barTintColor.
  • Alternatywą jest to, że można podklasować UINavigationController, zamiast skakać ze stylem paska.
  • JEDNAK jeśli podklasę UINavigationController nie uzyskasz kontroli nad paskiem stanu, jeżeli navigationBarHidden = true. W jakiś sposób UIKit idzie bezpośrednio do potomnego UIViewController bez pytania UINavigationController w tej sytuacji. Myślałbym, że zadaniem UINavigationController jest spytanie dziecka> wzrusza ramionami <.
  • I wyświetlany modalnie moduł UIViewController może wypowiedzieć się na pasku stanu tylko wtedy, gdy modalPresentationStyle = .FullScreen.
  • Jeśli masz niestandardowy kontroler widoku modalnego w stylu prezentacji i naprawdę chcesz, aby kontrolował pasek stanu, możesz ustawić modalPresentationCapturesStatusBarAppearance = true.

Dlaczego jabłko nie może po prostu zastosować się do jednej porady? Jeśli nie jest zepsuty, nie naprawiaj go!
Jargen89

9

Aby ukryć pasek stanu w iOS7, potrzebujesz 2 linii kodu

  1. w aplikacji: (UIApplication *) aplikacja didFinishLaunchingWithOptions: (NSDictionary *) launchOptions zapis

     [[UIApplication sharedApplication] setStatusBarHidden:YES];
    
  2. w info.plist dodaj to

     View-Controller Based Status Bar Appearance = NO
    

8

Dla lepszego zrozumienia dodaj kilka zdjęć z komentarzami:

Aplikacja przed wszelkimi zmianami

wprowadź opis zdjęcia tutaj

Znaleziono w Project Navigatorfolderze o nazwie Supporting Filesi kliknij plik * .plist

wprowadź opis zdjęcia tutaj

Gdy pojawi się inne ustawienie wyświetlanej aplikacji. Musisz dodać 2 klucze UIStatusBarHiddeni UIViewControllerBasedStatusBarAppearance. Możesz to zrobić po prostu klikając przycisk +

wprowadź opis zdjęcia tutaj

Po naciśnięciu + możesz wybrać jeden z klawiszy - po prostu zacznij pisać.

Prawidłowa wersja:

wprowadź opis zdjęcia tutaj

I wreszcie aplikacja po zastosowaniu tych zmian:

wprowadź opis zdjęcia tutaj

Możesz również znaleźć alternatywne rozwiązanie tutaj


8

W iOS10 wszystko, co musiałem zrobić, to zastąpić prefersStatusBarHiddenvar w moim RootViewController(Swift):

override var prefersStatusBarHidden: Bool {
    return true
}

7

Spróbuj tego;

[[UIApplication sharedApplication] setStatusBarHidden:YES withAnimation:UIStatusBarAnimationNone];

Wspaniały. Udało mi się to wykorzystać, aby ukryć pasek stanu na kontrolerze widoku nie był potrzebny na potem go odkryć, gdy użytkownik zalogowany.
LondonGuy

5

Aby ukryć pasek stanu w iOS7:

Otwórz plik plist, a następnie dodaj wiersz o nazwie „Wyświetl pasek stanu oparty na kontrolerze” i ustaw jego wartość na NO.


5

Oto wersja Swift (wcześniejsza wersja iOS9):

override func viewWillAppear(animated: Bool) {
    super.viewWillAppear(animated)
    UIApplication.sharedApplication().setStatusBarHidden(true, withAnimation: UIStatusBarAnimation.None)
}

override func viewWillDisappear(animated: Bool) {
    super.viewWillDisappear(animated)
    UIApplication.sharedApplication().setStatusBarHidden(false, withAnimation: UIStatusBarAnimation.None)
}

Działa to również (iOS7 +):

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

Musisz także zadzwonić:

setNeedsStatusBarAppearanceUpdate()

powiedzmy viewDidLoad().

Pamiętaj, że jeśli używasz kontrolera SplitView lub innego containerkontrolera widoku, musisz również zwrócić mu klasę po wysłaniu childViewControllerForStatusBarHidden. Jednym ze sposobów, aby to zrobić, jest publicznie słaby var, powiedzmy statusController, i zwrócenie go w tej przesłoniętej metodzie.


1
Górny blok jest przestarzały w iOS8 - użyj drugiego podejścia. I dzięki! Zredagowałem kod, aby dodać kolejne obowiązkowe wywołanie.
David H

5

iOS 9 i nowsze:

Jako statusBarHiddenmetodę Przestarzałe od iOS9 trzeba dodać dwie wartości w plist jak poniżej:

<key>UIStatusBarHidden</key>
<true/>
<key>UIViewControllerBasedStatusBarAppearance</key>
<false/>

lub przez interfejs użytkownika Proszę odnieść się poniżej obraz:

wprowadź opis zdjęcia tutaj

Jak statusBarHiddenjest Przestarzałe od iOS9 :

@property (readwrite, nonatomic, getter = isStatusBarHidden) BOOL statusBarHidden NS_ DEPRECATED _IOS (2_0, 9_0 , „Use - [UIViewController preferujeStatusBarHidden]”) __TVOS_PROHIBITED;


5

NAPRAWIONE ROZWIĄZANIE DLA SWIFT 3+ (iOS 9, 10)

1- W info.plist ustaw poniżej właściwości

wprowadź opis zdjęcia tutaj

2- Wklej poniższy kod do kontrolera root, aby

 private var isStatusBarHidden = true {
        didSet {
            setNeedsStatusBarAppearanceUpdate()
        }
    }

    override var prefersStatusBarHidden: Bool {
        return isStatusBarHidden
    }

Możesz zadzwonić isStatusBarHidden = truei isStatusBarHidden = falsewybrać hide/showpasek stanu


4

Należy dodać tę wartość do listy: „Wyświetl wygląd paska stanu opartego na kontrolerze” i ustaw ją na „NIE”.


4

Kroki dla ukrywania paska stanu w iOS
1. otwórz plik AppDelegate.m , dodaj application.statusBarHidden w metodzie didFinishLaunchingWithOptions

 - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
    // Override point for customization after application launch.
    application.statusBarHidden = YES;
    return YES;
    }
  1. otwórz info.plist i ustaw

View controller-based status bar appearance zestaw NO


4

Szybki 5

Wykonaj następujące kroki, aby ukryć pasek stanu systemu iOS:

  1. Otwórz na Info.plist.
  2. Dodaj nowy klucz Wyświetl wygląd paska stanu na podstawie kontrolera i ustaw wartość NIE .
  3. Dodaj nowy klucz Pasek stanu jest początkowo ukryty, a wartość jest ustawiona na TAK .
  4. Ponownie skompiluj projekt.
  5. Pasek stanu powinien teraz być ukryty na telefonie z iOS.

Zrzut ekranu ustawień końcowych:

Ostateczne ustawienia

Działa to na Xcode 10.2


2

Od UIKit> UIApplication.h:

// Setting statusBarHidden does nothing if your application is using the default UIViewController-based status bar system.
@property(nonatomic,getter=isStatusBarHidden) BOOL statusBarHidden;
- (void)setStatusBarHidden:(BOOL)hidden withAnimation:(UIStatusBarAnimation)animation NS_AVAILABLE_IOS(3_2);

Więc powinno być ustawione View controller-based status bar appearancena NIE


2

Aby odpowiedzieć na pytanie Susitha: użyj setNeedsStatusBarAppearanceUpdate . Spowoduje to wywołanie funkcji prefersStatusBarHidden w celu odświeżenia z żądanym stanem paska stanu. Spróbuj tego:

    @property (nonatomic, getter=isHideStatusBar) BOOL hideStatusBar; // Give this a default value early

    - (BOOL)prefersStatusBarHidden {
        return self.isHideStatusBar;
    }

    - (void)someMethod {
    // triggered by an event or user action
    [self setHideStatusBar:YES];
    [self setNeedsStatusBarAppearanceUpdate];
    }

Jeśli chcesz ponownie zobaczyć pasek stanu, ustaw właściwość hideStatusBar (lub jakkolwiek to nazwiesz) na NIE. Zadzwoń preferStatusBarHidden pośrednio, wykonując kolejne połączenie z

[self setNeedsStatusBarAppearanceUpdate]

1

Aktualizacja dla Swift 3:

Zaktualizuj Info.plist o następujące informacje:

View controller-based status bar appearance: NO

Następnie w ViewController lub w innym miejscu:

UIApplication.shared.isStatusBarHidden = true

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.