Zmiana koloru paska stanu dla określonych ViewControllerów korzystających z Swift w iOS8

192
override func preferredStatusBarStyle() -> UIStatusBarStyle {
 return UIStatusBarStyle.LightContent;
}

Użycie powyższego kodu w dowolnym narzędziu ViewController do ustawienia koloru paska statusu na Biały dla określonego kontrolera widoku nie działa dla mnie w iOS8 . Jakieś sugestie? Przy użyciu metody UIApplication.sharedApplication kolor zmienia się po wymaganych zmianach w Info.plist dla całej aplikacji.

// Change the colour of status bar from black to white
UIApplication.sharedApplication().statusBarStyle = .LightContent

Jak mogę po prostu zmienić kolor paska stanu dla niektórych wymaganych i określonych ViewControllerów ?

Anuj
źródło

Odpowiedzi:

350

Po przeczytaniu wszystkich sugestii i wypróbowaniu kilku rzeczy, mogę sprawić, by działało to dla określonych kontrolerów widoku, wykonując następujące kroki:

Pierwszy krok:

Otwórz info.plist i wstaw nowy klucz o nazwie „ Wyświetl wygląd paska stanu kontrolera ” na NIE

Drugi krok (tylko wyjaśnienie, nie trzeba tego wdrażać):

Zwykle wstawiamy następujący kod do aplikacji (_: didFinishLaunchingWithOptions :) metody AppDelegate,

Swift 2

UIApplication.sharedApplication().statusBarStyle = .LightContent

Szybki 3

UIApplication.shared.statusBarStyle = .lightContent

ale wpływa to statusBarStylena wszystkie ViewControllers.

Jak więc uruchomić to dla określonych ViewControllerów - ostatni krok:

Otwórz plik viewcontroller, w którym chcesz zmienić, statusBarStylei wstaw następujący kod viewWillAppear(),

Swift 2

UIApplication.sharedApplication().statusBarStyle = .LightContent

Szybki 3

UIApplication.shared.statusBarStyle = .lightContent

Ponadto zaimplementuj viewWillDisappear()metodę dla tego konkretnego viewController i wstaw następujące wiersze kodu,

Swift 2

override func viewWillDisappear(animated: Bool) {
    super.viewWillDisappear(animated)
    UIApplication.sharedApplication().statusBarStyle = UIStatusBarStyle.Default

}

Szybki 3

override func viewWillDisappear(_ animated: Bool) {
    super.viewWillDisappear(animated)
    UIApplication.shared.statusBarStyle = UIStatusBarStyle.default
}

Ten krok najpierw zmieni statusBarStyledla określonego kontrolera widoku, a następnie zmieni go z powrotem na defaultzniknięcie określonego kontrolera widoku. Niewdrożenie viewWillDisappear()spowoduje zmianę na statusBarStylestałe na nową zdefiniowaną wartośćUIStatusBarStyle.LightContent

Anuj
źródło
4
Pamiętaj, że jeśli ustawisz Status bar is initially hidden = YESw pliku info.plist, „Wyświetl wygląd paska stanu na kontrolerze = NIE” spowoduje ukrycie paska stanu.
xi.lin,
13
Jeśli wracasz do UIStatusBarStyle.Defaultużywania viewWillDisappear(), powinieneś użyć go viewWillAppear()do zainicjowania go, zamiast viewDidLoad().... w przeciwnym razie, jeśli wrócisz do tego widoku bez konieczności ponownego ładowania, nie zobaczysz tego, StatusBarStyleczego oczekujesz.
William GP
7
Dla Swift 3: UIApplication.shared.statusBarStyle = .lightContent
ibrahimyilmaz,
4
Nadal nie jest jasne, jak zmieniasz kolor paska stanu
DoruChidean
4
Chłopaki, jego przestarzała
wersja na
109

(Od 20 września 2019 r.)

Swift 5 , Swift 4.2 , Swift 4

override func viewWillAppear(_ animated: Bool) {
    super.viewWillAppear(animated)
    setNeedsStatusBarAppearanceUpdate()
}
override var preferredStatusBarStyle: UIStatusBarStyle {
    .lightContent
}
BennyTheNerd
źródło
7
Zadzwoń, super.viewWillAppearjeśli skopiujesz i wkleisz ten kod
Stephen Silber,
Edytowano, aby uwzględnić super.viewWillAppear (). Dzięki @StephenSilber za wskazówkę!
BennyTheNerd
musisz zastąpić preferStatusStyle, inaczej nie zadziała. dzięki za zwrócenie na to uwagi. +1
Alix,
3
Korzystanie z UIApplication.shared.statusBarStyle = .lightContentwyników w tym ostrzeżeniu kompilatora: Setter dla 'statusBarStyle' był przestarzały w iOS 9.0: Użyj - [UIViewController preferStatusBarStyle]
airowe
3
W Info.plist aplikacji ustaw „Wyświetl wygląd paska stanu kontrolera” na TAK
IvanPavliuk
29

Wykonałem ten samouczek i zadziałało to dla mnie. Nie jestem jednak pewien, czy są jakieś zastrzeżenia.

https://coderwall.com/p/dyqrfa/customize-navigation-bar-appearance-with-swift

  • Otwórz swoją info.plist i ustaw UIViewControllerBasedStatusBarAppearancena false.
  • W pierwszej funkcji w AppDelegate.swift, która zawiera didFinishLaunchingWithOptions, ustaw żądany kolor.

UIApplication.sharedApplication().statusBarStyle = UIStatusBarStyle.LightContent

  • Aktualizacja Swift 3 *

    UIApplication.shared.statusBarStyle = .lightContent

chris_s
źródło
11
jak to jest specyficzne dla każdego kontrolera widoku
Yarneo
4
Dokładnie, to jest dla kompletnej aplikacji, i to nie jest pytanie.
Anuj
3
Używam iOS 8 Swift i xCode 6.1.1 i po prostu wykonanie tych dwóch kroków nie działa. Musisz także dodać UIApplication.sharedApplication().statusBarHidden = falsedo AppDelegate.swift didFinishLauchingWithOptions
Ahmad Amin
Ustawia to dla całej aplikacji. W przypadku określonych kontrolerów widoku zobacz pierwszą odpowiedź. To zadziałało dla mnie.
Akshar Patel
Setter dla „statusBarStyle” był przestarzały w iOS 9.0: Użyj - [UIViewController preferStatusBarStyle]
Oleksandr
29

Rozwiązanie Swift 4.2 z NavigationController

Pierwszy krok:

Otwórz info.plist i wstawić nowy klucz o nazwie „ Widok kontroler oparty na wygląd paska stanu ” lub UIViewControllerBasedStatusBarAppearancena TAK pozwolić każdy VC używać swojej własności stanu.

Drugi krok

W każdej VC, nadpisać preferredStatusBarStyle własności takiego:

override var preferredStatusBarStyle : UIStatusBarStyle {
    return .lightContent //.default for black style
}

Ostatni krok

Przesłonić preferredStatusBarStyle nieruchomość w niestandardowej klasy NavigationController:

class NavigationController : UINavigationController {

override var preferredStatusBarStyle : UIStatusBarStyle {

    if let topVC = viewControllers.last {
        //return the status property of each VC, look at step 2
        return topVC.preferredStatusBarStyle  
    }

    return .default
}
gilama
źródło
To tylko sposób na osiągnięcie oczekiwanego rezultatu za pomocą Nawigatora i własnych kontrolerów. Możesz także zrobić to w ten sposób dla preferencjiStatusBarUkryte tak jak ja dla mojego projektu :)
atereshkov
22

Jest tu miliard odpowiedzi, więc pomyślałem, dlaczego nie dodać kolejnej w formie rozszerzenia (z pomocą @ Cœur)

Szybki 3

Rozbudowa:

extension UIApplication {
    class var statusBarBackgroundColor: UIColor? {
        get {
            return (shared.value(forKey: "statusBar") as? UIView)?.backgroundColor
        } set {
            (shared.value(forKey: "statusBar") as? UIView)?.backgroundColor = newValue
        }
    }
}

Realizacja:

UIApplication.statusBarBackgroundColor = .blue
John R Perry
źródło
2
Pamiętaj, że takie podejście można uznać za dostęp do prywatnego interfejsu API i może to oznaczać, że Twoja aplikacja zostanie odrzucona przez Apple.
JWhitey,
A przynajmniej zależy to od szczegółów implementacyjnych Apple i może ulec awarii bez ostrzeżenia ze zmianami w iOS.
Chris Prince,
19

W swojej Info.plist musisz zdefiniować Wyświetl wygląd paska stanu oparty na kontrolerze na dowolną wartość.

Jeśli zdefiniujesz TAK, powinieneś zastąpić funkcję preferStatusBarStyle w każdym kontrolerze widoku.

Jeśli zdefiniujesz NIE, możesz ustawić styl w AppDelegate za pomocą

UIApplication.sharedApplication().setStatusBarStyle(UIStatusBarStyle.LightContent, animated: true)
Nikita Khandelwal
źródło
7
setStatusBarStylezostał wycofany z iOS 9.0
Jeffrey Neo
@Jeffrey_Neo Chociaż to prawda, nie mogę sprawić, by zamiennik zadziałał. Przydałoby się zobaczyć twój komentarz jako odpowiedź z działającym kodem.
dumbledad
15
override func viewWillAppear(animated: Bool) {
    self.navigationController?.navigationBarHidden =  true

    UIApplication.sharedApplication().statusBarHidden = false
    UIApplication.sharedApplication().statusBarStyle = .LightContent

    let statusBar: UIView = UIApplication.sharedApplication().valueForKey("statusBar") as! UIView
    if statusBar.respondsToSelector("setBackgroundColor:") {
        statusBar.backgroundColor = UIColor.redColor()
    }

}
AG
źródło
używanie valueForKey("statusBar")może być niezgodne z wytycznymi Apple
Cœur
15

Szybki 3

let statusBar: UIView = UIApplication.shared.value(forKey: "statusBar") as! UIView
if statusBar.responds(to: #selector(setter: UIView.backgroundColor)) {
  statusBar.backgroundColor = UIColor.black
} 

To jest rozwiązanie do ustawiania koloru tła paska stanu dla określonego kontrolera widoku.

Chris Tsitsaris
źródło
3
UIView zawsze reaguje na kolor tła w Swift.
Cœur
13

SWIFT 2

Udało mi się z powodzeniem zmienić wygląd tła paska stanu, dodając następujące elementy w moim widokuWillAppear:

let statusBar: UIView = UIApplication.sharedApplication().valueForKey("statusBar") as! UIView

    if statusBar.respondsToSelector(Selector("setBackgroundColor:")) {
        statusBar.backgroundColor = .redColor()
    }
AJ Hernandez
źródło
10

Wdrożenie preferredStatusBarStylejak wspomniano i wywołanie self.setNeedsStatusBarAppearanceUpdate()w ViewDidLoad, a także w Info.plist zestaw UIViewControllerBasedStatusBarAppearancedo YES(Jest to YESustawienie domyślne)

Nie jest jasne, dlaczego to nie działa. Muszę sprawdzić kod. Inną sugestią jest pójść z działającym kodem viewDidLoad UIApplication.sharedApplication().statusBarStyle = .LightContenti zmienić go na domyślny, gdy widok zniknie viewWillDisappear.

koderz
źródło
Właśnie wdrożenie pierwszej części odpowiedzi zadziałało dla mnie. Nie dodałem jednak UIViewcontrollerBasedStatusBarAppearance w Info.plist. Nadal działało.
Akshar Patel
10

dla szybkiego 3

.plist

View controller-based status bar appearance = NO

AppDelegate.swift

  func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {
        // Custom statubar
        UIApplication.shared.isStatusBarHidden = false
        UIApplication.shared.statusBarStyle = .lightContent
        let statusBar: UIView = UIApplication.shared.value(forKey: "statusBar") as! UIView
        statusBar.backgroundColor = UIColor.gray

        return true
    }
Giang
źródło
1
Wypróbowałem wszystkie rozwiązania ... działało to tylko dla mnie !! Nie wiem dlaczego: D
Khaled Hayek
losowanie
Giang
Setter dla „isStatusBarHidden” został uznany za przestarzały w iOS 9.0: Użyj - [UIViewController woliStatusBarHidden] ...
zwrócił ..
9

W mojej sytuacji używam scenorysów do organizowania kontrolerów widoku. Chcę zmienić styl wszystkich pasków stanu.

Możesz zobaczyć na zdjęciu poniżej.

wprowadź opis zdjęcia tutaj

StarsZobacz Kontroler jest CPBaseNavigationController, a CPBaseNavigationControllerjest podklasą UINavigationController.

Próbuję wykonać kolejne ustawienia:

  1. W AppDelegate.swiftfunc didFinishLaunchingWithOptionsdodaj

    //change status bar color
    UIApplication.sharedApplication().statusBarHidden = false
    UIApplication.sharedApplication().statusBarStyle = .LightContent

    ale bez efektu.

  2. W StoryBoard znajdź Base Tab BarController(obrazek powyżej) .select Attributes Inspector, zmień Sattus Baratrybut na Light Content.so źle, bez efektu.

wprowadź opis zdjęcia tutaj

  1. Ostatni raz dostaję. W moim niestandardowym kontrolerze nawigacyjnym CPBaseNavigationControllerdodaj funcpreferredStatusBarStyle

    override func preferredStatusBarStyle() -> UIStatusBarStyle {
       return .LightContent
    }

    To dobrze działa!

Poza tym, statusBarStyleprzestarzałe w wersji 9.0, możesz użyć -[UIViewController preferredStatusBarStyle].

wenghengcong
źródło
9

Działa z aplikacją opartą na nawigacji

    var addStatusBar = UIView()
    addStatusBar.frame = CGRectMake(0, 0, UIScreen.mainScreen().bounds.width, 20);
    addStatusBar.backgroundColor = global().UIColorFromRGB(0x65b4d9)
    self.window?.rootViewController?.view .addSubview(addStatusBar)
Jio
źródło
Gdzie dodać ten konkretny kod, po prostu nie mogłem go uruchomić.
Anuj
Możesz dodać go do pliku delegowanego aplikacji w didFinishLaunchingWithOptions
Jio
1
Czy nie lepiej byłoby użyć addStatusBar.frame = CGRectMake (0, 0, UIScreen.mainScreen (). Bounds.width, 20) zamiast zakodowanej na stałe szerokości 320?
Torsten Ojaperv
Zmieniano @TorstenOjaperv
Jio
Jak to zrobić w swift 3.0?
YETI
8

W Swift 3.0 Xcode 8 wszystko jest znacznie łatwiejsze

Za pomocą poniższego kodu w pliku delegowania aplikacji po

func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {

wstaw to:

UINavigationBar.appearance().barStyle = .black

UINavigationBar.appearance().barTintColor = UIColor(red: 230, green: 32, blue: 31, alpha: 1.0)
Anton Rosja
źródło
1
Wartości czerwony, zielony i niebieski mieszczą się w zakresie od 0 do 1. Musisz je podzielić przez 255, inaczej to nie zadziała.
Makalele,
8

Szybki 3

//
//  LoginController.swift
//  Swift 3
//
//  Created by The Crab on 17/01/2017.
//  Copyright © 2017 Paxi Labs. All rights reserved.
//

import UIKit

class LoginController: UIViewController {

    override func viewDidLoad() {
        super.viewDidLoad()

        setNeedsStatusBarAppearanceUpdate()

        view.backgroundColor = UIColor(red: 61/255, green: 91/255, blue: 151/255, alpha: 1)

    }

    override var preferredStatusBarStyle: UIStatusBarStyle {
        return .lightContent
    }
}
theCrab
źródło
7

Swift 4 W przypadku konkretnego ViewController bez nawigacji ViewController osadzony wystarczy dodać to do pliku ViewController.

override var preferredStatusBarStyle : UIStatusBarStyle {
    return .lightContent
}
Surjit Singh
źródło
Jeśli mamy wbudowany kontroler nawigacji, co robisz?
icekomo
7

Innym naprawdę łatwym sposobem na wykonanie tej pracy jest po prostu rozszerzenie klasy UINavigationController.

Ponieważ przesłonięcie preferredStatusBarStyle:metody nie będzie działać, chyba że zrobimy to wewnątrz klasy UINavigationController.

    extension UINavigationController {
        open override var preferredStatusBarStyle: UIStatusBarStyle {
            return .lightContent
        }
    }
azemi
źródło
4

Ustawiłem określony kolor (w formacie RGB), używając poniższego kodu w App Delegatepliku:

func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool {
. . .

 UIApplication.sharedApplication().statusBarHidden = false
        UIApplication.sharedApplication().statusBarStyle = .LightContent

        let statusBar: UIView = UIApplication.sharedApplication().valueForKey("statusBar") as! UIView
        if statusBar.respondsToSelector(Selector("setBackgroundColor:")) {
            statusBar.backgroundColor = UIColor.init(red: 0.1, green: 0.27, blue: 0.60, alpha: 1.0)
        }

. . .
}

Musisz również dodać poniższy klucz w Info.plistpliku:

Wyświetlanie wyglądu paska stanu opartego na kontrolerze z wartością logiczną ustawioną na NIE

Zrzut ekranu 1

Zrzut ekranu 2

Jayprakash Dubey
źródło
Jak to zrobić w Siwft 3.0?
YETI
4

Mogę zaproponować ci prostszy sposób,

  1. Wystarczy wywołać setNeedsStatusBarAppearanceUpdate w widokuDidLoad, jak głosi dokument Apple:

Wywołaj tę metodę, jeśli zmienią się atrybuty paska stanu kontrolera widoku, takie jak status / styl ukryty / ukryty lub styl. Jeśli wywołasz tę metodę w bloku animacji, zmiany będą animowane wraz z resztą bloku animacji.

  1. Zaimplementuj preferStatusBarStyle zwracając preferowany typ.

To działało dla mnie w iOS 10.1.

Cel C

[self setNeedsStatusBarAppearanceUpdate];

-(UIStatusBarStyle)preferredStatusBarStyle {
     return UIStatusBarStyleLightContent;
}

Szybki

setNeedsStatusBarAppearanceUpdate()

var preferredStatusBarStyle: UIStatusBarStyle { 
    return .lightContent
}

Dziwi mnie, że nikt tego nie zauważył. W każdym razie ciesz się :)

Bhaumik Desai
źródło
4

Miałem z tym trochę problemów. Naprawdę nie czułem się dobrze z globalną zmianą koloru paska stanu, który pojawił się w widoku, a następnie zmiana go z powrotem w widoku zniknęła jak zaakceptowana odpowiedź. Wierzcie lub nie, można to zrobić, zastępując preferredStatusBarStyleżądany kontroler widoku. Po długim czasie zrobiłem to, aby to działało:

  1. Zmień wygląd paska stanu opartego na kontrolerze w swoim info.plistna TAK.
  2. Teraz dowolny kontroler widoku pełnoekranowego może zmienić styl paska stanu, zastępując preferredStatusBarStyle.
  3. Określam tryb pełnoekranowy, ponieważ nie będzie to działać w przypadku kontrolerów widoku modalnego (nie na pełnym ekranie), nie bez ustawienia opcji modal​Presentation​Captures​Status​Bar​AppearanceTak.
  4. Również jeśli masz osadzone kontrolery widoku, na przykład w kontrolerze nawigacyjnym, zapyta najwyższy kontroler widoku o styl paska stanu. Przesłanianie child​View​Controller​For​Status​Bar​Stylei przekazywanie osadzonego kontrolera widoku powinno działać, ale dla mnie nie. Właśnie zwróciłem wbudowany kontroler widoku preferowany pasek stanu jako preferowany styl paska stanu. Coś takiego:

    override var preferredStatusBarStyle: UIStatusBarStyle {
         if let topViewController = viewControllers.last {
             return topViewController.preferredStatusBarStyle
         }
    
         return .default
    }
John C.
źródło
Ta odpowiedź pomogła mi! Odkryłem, że z jakiegoś powodu mój kontroler nawigacji (prezentowany modalnie) nie pytał domyślnie najwyższego kontrolera widoku o styl paska stanu. Musiałem więc podklasować UINavigationControlleri zastąpić child​View​Controller​For​Status​Bar​Stylezmienną tam, wracając self.topViewController.
taber
3

W Swift 4 lub 4.2

Możesz dodać na swoim vc

preferStatusBarStyle

i ustaw wartość zwracaną na

.lightContent lub .default

dawny:

override var preferredStatusBarStyle: UIStatusBarStyle {
        return .lightContent
}
Ridho Octanio
źródło
3

(Od 10 czerwca 2020 r.)

Swift 5 ( bez edycji .Plistpliku )

Jeśli używasz Storyboard, przejdź do NavigationController, wybierz navigationBar, kliknij Attributes Inspector, a następnie zmień style. jeśli potrzebujesz light content( biały pasek stanu ) ustaw cokolwiek oprócz defaultpowiedzmy, ustaw styl blackA jeśli chcesz dark content ( czarny pasek stanu ) ustaw go default.

Ustawienie domyślne ( UIBarStyleDefault) powoduje wyświetlenie ciemnego UIStatusBarStyleDefaultpaska stanu pierwszego planu . I UIBarStyleBlackda UIStatusBarStyleLightContentpasek stanu.

Programowo

let nav = UINavigationController(rootViewController: rootViewController)

    nav.navigationBar.barStyle = .default //gives you dark Content status bar

    nav.navigationBar.barStyle = .black  //gives you light content status bar

Bez paska nawigacyjnego ( edycja.Plist )

dodaj UIViewControllerBasedStatusBarAppearance/ View controller-based status bar appearancedo info.plist, a ustawioną wartością jest true.

OverridepreferredStatusBarStylenieruchomość w kontrolerze

class ViewController: UIViewController {
    override var preferredStatusBarStyle : UIStatusBarStyle {
        return .lightContent
    }
}
jawadAli
źródło
2

Aktualizacja Swift 3.0

func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {

        UIApplication.shared.statusBarStyle = .lightContent

        return true
    }
Jaseibert
źródło
2

Co ze mną działało, w Storyboard, przejdź do kontrolera nawigacji, wybierz pasek nawigacyjny, kliknij Inspektora atrybutów, a następnie zmień styl z domyślnego na czarny. Otóż ​​to!

Amr
źródło
2

SWIFT 4.2 Hej, chciałem podzielić się rozwiązaniem, które dla mnie zadziałało, które otrzymałem ze świetnego artykułu na ten ekskluzywny temat autorstwa Graiga Grummitta.

Krok 1 Jak inni wspominali DODAJ poniżej do twojego PLIST

View controller-based status bar appearance YES

Krok 2 w RootViewcontroller dodaj poniżej

var statusBarHidden: Bool = false {
        didSet(newValue) {
            UIView.animate(withDuration: 0.1) {
                self.setNeedsStatusBarAppearanceUpdate()
            }
        }
    }

    override var prefersStatusBarHidden: Bool {
        return statusBarHidden
    }

    var vcStatusBarStyle: UIStatusBarStyle = .default {
        didSet(newValue) {
            UIView.animate(withDuration: 0.1) {
                self.setNeedsStatusBarAppearanceUpdate()
            }
        }
    }

    override var preferredStatusBarStyle: UIStatusBarStyle {
        return vcStatusbarStyle
    }

Podczas aktualizowania albo właściwości statusBarHiddenalbo vcStatusBarStylezadzwoni setNeedsStatusBarAppearanceUpdate()i zaktualizuje pasek stanu o nowe wartości dla jednego prefersStatusBarHiddenlub preferredStatusBarStyle. W mojej sytuacji musiałem zaktualizować te właściwości kontrolera widoku kontenera, który był rodzicem widocznego kontrolera podglądu dziecka. Zrobiłem to przy użyciu prostej metody delegowania.

protocol MainViewControllerDelegate {
    func updateStatusBarStyle(statBarStayle: UIStatusBarStyle)
    func toggleStatusBar(visable: Bool)
}

Oczywiście podczas tworzenia instancji childViewController (Visible VC) nie zapomnij ustawić MainViewcontroller (Container VC) jako jego delegata. Czasami tak robię. :)

childViewController.delegate = self

Następnie w childViewController właśnie wywołałem metodę delegowania, gdy jest to konieczne, aby zaktualizować pasek stanu.

self.delegate?.updateStatusBarStyle(statBarStayle: .default)

Jak wspomniano powyżej, Graig Grummitt szczegółowo omawia to rozwiązanie, a także współpracuje z UINavigationControllers. Link tutaj: Tajemniczy przypadek paska stanu

Erik Uecke
źródło
1

Kliknij grupę plików pomocniczych (u góry po lewej stronie - nazwa twojego projektu). Przejdź do informacji. Kliknij + gdzieś między listami, np. Poniżej nazwy pakietu. I dodaj „Wyświetl wygląd paska stanu na kontrolerze” i ustaw na NIE. Następnie otwórz AppDelegate.swift i zmodyfikuj w następujący sposób:

func application(application: UIApplication!, didFinishLaunchingWithOptions launchOptions: NSDictionary!) -> Bool {

UIApplication.sharedApplication().setStatusBarStyle(UIStatusBarStyle.LightContent, animated: true)

return true
}

Otóż ​​to.

Goran Jakovljevic
źródło
Źle przeczytałeś pytanie. Zapytałem o to, jak zmienić StatusBarStyle dla określonych kontrolerów widoku, a nie dla kompletnej aplikacji.
Anuj
Sprawdź moją odpowiedź poniżej @Anuj
theCrab
1

W przypadku Xcode 10 możesz utworzyć klasę i umieścić ją przed klasą viewController, możesz wywołać tę klasę we wszystkich kontrolerach widoku potrzebny jest pasek stanu zawartości świetlnej ...

class UIViewControllerWithLightStatusBar: UIViewController {
override var preferredStatusBarStyle: UIStatusBarStyle {
return UIStatusBarStyle.lightContent
}
}

Teraz zmień klasę viewController w:

class YourViewController: UIViewControllerWithLightStatusBar {
...
}

I to wszystko...

Fabio
źródło
1

Działa w oparciu o nawigację dla określonego kontrolera widoku w swift4

   let app = UIApplication.shared
   let statusBarHeight: CGFloat = app.statusBarFrame.size.height

   let statusbarView = UIView(frame: CGRect(x: 0, y: 0, width: UIScreen.main.bounds.size.width, height: statusBarHeight))
   statusbarView.backgroundColor = UIColor.red
   view.addSubview(statusbarView)
Gangireddy Rami Reddy
źródło
1

OSTRZEŻENIE


Setter dla „statusBarStyle” był przestarzały w iOS 9.0: Użyj - [UIViewController preferStatusBarStyle]

UIApplication.shared.statusBarStyle = .default

więc moje rozwiązanie było następujące: utworzenie rozszerzenia z kontrolera nawigacyjnego:

extension UINavigationController {
    open override var preferredStatusBarStyle: UIStatusBarStyle {
        if let topViewController = presentedViewController{
            return topViewController.preferredStatusBarStyle
        }
        if let topViewController = viewControllers.last {
            return topViewController.preferredStatusBarStyle
        }

        return .default
    }
}

a jeśli masz viewController, który będzie miał inny styl niż styl aplikacji, możesz to zrobić

var barStyle = UIStatusBarStyle.lightContent
override var preferredStatusBarStyle: UIStatusBarStyle{
    return barStyle
}

powiedzmy, że masz styl statusu aplikacji .defaulti chcesz, aby ten ekran był .lightContent tak, aby barStyle przyjmował .lightContentjako wartość domyślną, to zmieni styl paska stanu na lightContent, a następnie upewnij się, że po viewWillDisappearzmianie barStyle ponownie na styl paska stanu aplikacji co w naszym przypadku jest .default.

to działa dla mnie

hesham ghalaab
źródło
1

Niestandardowy kolor paska stanu (iOS11 +, Swift4 +)

Jeśli szukasz rozwiązania, jak zmienić pasek stanu na niestandardowy kolor, jest to działające rozwiązanie.

let statusBarView = UIView()
view.addSubview(statusBarView)
statusBarView.translatesAutoresizingMaskIntoConstraints = false
NSLayoutConstraint.activate([
    statusBarView.topAnchor.constraint(equalTo: view.topAnchor),
    statusBarView.leftAnchor.constraint(equalTo: view.leftAnchor),
    statusBarView.rightAnchor.constraint(equalTo: view.rightAnchor),
    statusBarView.bottomAnchor.constraint(equalTo: view.safeAreaLayoutGuide.topAnchor)
])
statusBarView.backgroundColor = .blue
Tung Fam
źródło