Como alterar a cor de fundo da barra de status e a cor do texto no iOS 7?

89

Meu aplicativo atual é executado no iOS 5 e 6.

A barra de navegação tem uma cor laranja e a barra de status tem uma cor de fundo preta com texto em branco. No entanto, quando executo o mesmo aplicativo no iOS 7, observo que a barra de status parece transparente com a mesma cor de fundo laranja da barra de navegação e a cor do texto da barra de status é preta.

Devido a isso, não consigo diferenciar entre a barra de status e a barra de navegação.

Como faço para que a barra de status tenha a mesma aparência que era no iOS 5 e 6, ou seja, com fundo preto e texto branco? Como posso fazer isso programaticamente?

Rejeesh Rajan
fonte

Respostas:

174

Aviso: Não funciona mais com iOS 13 e Xcode 11.

======================================================== ========================

Tive que tentar procurar outras maneiras. Que não envolve addSubviewjanela. Porque estou subindo a janela quando o teclado é apresentado.

Objective-C

- (void)setStatusBarBackgroundColor:(UIColor *)color {

    UIView *statusBar = [[[UIApplication sharedApplication] valueForKey:@"statusBarWindow"] valueForKey:@"statusBar"];

    if ([statusBar respondsToSelector:@selector(setBackgroundColor:)]) {
        statusBar.backgroundColor = color;
    }
}

Rápido

func setStatusBarBackgroundColor(color: UIColor) {

    guard  let statusBar = UIApplication.sharedApplication().valueForKey("statusBarWindow")?.valueForKey("statusBar") as? UIView else {
        return
    }

    statusBar.backgroundColor = color
}

Swift 3

func setStatusBarBackgroundColor(color: UIColor) {

    guard let statusBar = UIApplication.shared.value(forKeyPath: "statusBarWindow.statusBar") as? UIView else { return }

    statusBar.backgroundColor = color
}

Ligar para este formulário application:didFinishLaunchingWithOptionsfuncionou para mim.

NB Temos um app na app store com essa lógica. Então, acho que está tudo bem com a política da app store.


Editar:

Use por sua conta e risco. Forme o comentador @Sebyddd

Eu tive um aplicativo rejeitado por causa disso, enquanto outro foi bem aceito. Eles consideram o uso privado da API, então você está sujeito à sorte durante o processo de revisão :) - Sebyddd

Warif Akhand Rishi
fonte
5
Ao contrário da solução aceita, isso também funciona quando você muda a orientação. Obrigado!
Michael
5
Não é um uso privado da API?
Foriger de
2
Eu tive um aplicativo rejeitado por causa disso, enquanto outro foi bem aceito. Eles consideram o uso privado da API, então você está sujeito à sorte durante o processo de revisão :)
Sebyddd
3
Há um problema com esta solução, quando você pressiona duas vezes o botão home, a cor da barra de status desaparece.
Timeless
3
Não funciona no iOS 13. App chamado -statusBar ou -statusBarWindow no UIApplication: este código deve ser alterado porque não há mais uma barra de status ou janela da barra de status. Use o objeto statusBarManager na cena da janela.
NSDeveloper
109

Vá para seu aplicativo info.plist

1) Defina View controller-based status bar appearancecomo NO
2) Defina Status bar stylecomo UIStatusBarStyleLightContent

Então Vá para seu delegado de aplicativo e cole o código a seguir onde você definiu o RootViewController do Windows.

#define SYSTEM_VERSION_GREATER_THAN_OR_EQUAL_TO(v)  ([[[UIDevice currentDevice] systemVersion] compare:v options:NSNumericSearch] != NSOrderedAscending)

if (SYSTEM_VERSION_GREATER_THAN_OR_EQUAL_TO(@"7.0"))
{
    UIView *view=[[UIView alloc] initWithFrame:CGRectMake(0, 0,[UIScreen mainScreen].bounds.size.width, 20)];
    view.backgroundColor=[UIColor blackColor];
    [self.window.rootViewController.view addSubview:view];
}

Espero que ajude.

Shahid Iqbal
fonte
Apenas mencionando, os documentos da Apple recomendam este if check: if (NSFoundationVersionNumber <= NSFoundationVersionNumber_iOS_6_1) {} else {} aplausos!
Joel Balmer
2
@learner Vá para info.plist e selecione qualquer linha. Você verá um sinal +. Clique no sinal de mais e no menu suspenso, você verá a Status bar styleopção. Selecione-o. E cole UIStatusBarStyleLightContentconforme seu valor.
Shahid Iqbal
5
Isso não leva em conta a rotação
perdeu a tradução em
4
É melhor usar a largura do UIScreen:UIView *view = [[UIView alloc] initWithFrame:CGRectMake(0, 0, [UIScreen mainScreen].bounds.size.width, 20)];
KlimczakM
2
Uma maneira mais sucinta de definir o quadro é usandoUIApplication.sharedApplication().statusBarFrame
Doug
28

Ao lidar com a cor de fundo da barra de status no iOS 7, existem 2 casos

Caso 1: visualizar com barra de navegação

Neste caso, use o seguinte código em seu método viewDidLoad

 UIApplication *app = [UIApplication sharedApplication];
 CGFloat statusBarHeight = app.statusBarFrame.size.height;

 UIView *statusBarView = [[UIView alloc] initWithFrame:CGRectMake(0, -statusBarHeight, [UIScreen mainScreen].bounds.size.width, statusBarHeight)];
 statusBarView.backgroundColor = [UIColor yellowColor];
 [self.navigationController.navigationBar addSubview:statusBarView];

Caso 2: visualizar sem barra de navegação

Neste caso, use o seguinte código em seu método viewDidLoad

 UIApplication *app = [UIApplication sharedApplication];
 CGFloat statusBarHeight = app.statusBarFrame.size.height;

 UIView *statusBarView =  [[UIView alloc] initWithFrame:CGRectMake(0, 0, [UIScreen mainScreen].bounds.size.width, statusBarHeight)];
 statusBarView.backgroundColor  =  [UIColor yellowColor];
 [self.view addSubview:statusBarView];

Link da fonte http://code-ios.blogspot.in/2014/08/how-to-change-background-color-of.html

Teja Kumar Bethina
fonte
Isso funcionou bem para mim, mas a barra de status deve ter 20pt de altura: [[UIView alloc] initWithFrame: CGRectMake (0, -20, 320, 20)];
LordParsley
27

1) defina UIViewControllerBasedStatusBarAppearance como YES no plist

2) em viewDidLoad faça um [self setNeedsStatusBarAppearanceUpdate];

3) adicione o seguinte método:

 -(UIStatusBarStyle)preferredStatusBarStyle{ 
    return UIStatusBarStyleLightContent; 
 } 

ATUALIZAÇÃO:
verifique também a barra de status do developers-guide-to-the-ios-7-status

Muruganandham K
fonte
você pode alterá-lo para preto ou branco
Muruganandham K
1
Isso não tem efeito (ios7, simulador). O "preferredStatusBarStyle" nunca é chamado.
Adam
1
você está usando o xib ?. se SIM, altere o valor da barra de status na propriedade de métricas simulada
Muruganandham K
3
Ah, encontrei o problema. O UINavigationController da Apple captura a notificação - ou seja, sua resposta é apenas para quando o controlador de visualização é o controlador superior, não há contêineres (nenhuma barra de guias, nenhuma barra de navegação, etc).
Adam
3
Caso especial ao usar Storyboard + NavigationController. Faça o nº 1 acima. Em seguida, crie uma subclasse para UINavigationController (chame-a de myNavController). No Storyboard, defina a classe do NavigationController como "myNavController". Em myNavController.m, faça os itens 2 e 3 acima. O método em # 3 agora será chamado em sua subclasse (defina um log ou ponto de interrupção para observar).
ObjectiveTC de
16

Você pode definir a cor de fundo para a barra de status durante a inicialização do aplicativo ou durante viewDidLoad de seu controlador de visualização.

extension UIApplication {

    var statusBarView: UIView? {
        return value(forKey: "statusBar") as? UIView
    }

}

// Set upon application launch, if you've application based status bar
class AppDelegate: UIResponder, UIApplicationDelegate {

    var window: UIWindow?

    func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {
        UIApplication.shared.statusBarView?.backgroundColor = UIColor.red
        return true
    }
}


or 
// Set it from your view controller if you've view controller based statusbar
class ViewController: UIViewController {

    override func viewDidLoad() {
        super.viewDidLoad()

        UIApplication.shared.statusBarView?.backgroundColor = UIColor.red
    }

}



Aqui está o resultado:

insira a descrição da imagem aqui


Aqui estão as orientações / instruções da Apple sobre a alteração da barra de status. Apenas escuro e claro (enquanto e preto) são permitidos na barra de status.

Aqui está - Como alterar o estilo da barra de status:

Se você deseja definir o estilo da barra de status e o nível do aplicativo, defina UIViewControllerBasedStatusBarAppearancecomo NOem seu arquivo `.plist '.

se você quiser definir o estilo da barra de status, no nível do controlador de visualização, siga estas etapas:

  1. Defina UIViewControllerBasedStatusBarAppearancecomo YESno .plistarquivo, se precisar definir o estilo da barra de status apenas no nível UIViewController.
  2. Na função de adição viewDidLoad - setNeedsStatusBarAppearanceUpdate

  3. substituir preferredStatusBarStyle em seu controlador de visualização.

-

override func viewDidLoad() {
    super.viewDidLoad()
    self.setNeedsStatusBarAppearanceUpdate()
}

override var preferredStatusBarStyle: UIStatusBarStyle {
    return .lightContent
}
Krunal
fonte
O aplicativo será rejeitado se os usarmos? É permitido alterar a cor do statusBarView assim?
abhimuralidharan
@ abhi1992 Não posso dizer se a apple aceitará ou não porque implementei essa solução em meu aplicativo corporativo, que não precisa ser enviado na App Store. :)
Krunal
Se eu colocar isso em um viewdidload de um viewcontroller em um aplicativo baseado em guias, ele define a cor de cada viewController, não apenas daquele onde coloquei o código (isso é normal?)
14

No iOS 7, a barra de status não tem um fundo, portanto, se você colocar uma visão preta de 20 pixels de altura atrás dela, você obterá o mesmo resultado do iOS 6.

Além disso, você pode querer ler o Guia de transição da IU do iOS 7 para obter mais informações sobre o assunto.

Gabriele Petronella
fonte
2
Gabriele, você poderia fornecer o código de como colocar uma visão de 20 pixels de altura por trás disso?
Dejell,
Dejel, essa é a resposta de Shahid.
Fattie 01 de
Não use apenas "20"! Você pode obter o valor corretamente, veja minha longa resposta abaixo.
Fattie
8

Escreva isso em seu método ViewDidLoad:

if ([self respondsToSelector:@selector(setEdgesForExtendedLayout:)]) {
    self.edgesForExtendedLayout=UIRectEdgeNone;
    self.extendedLayoutIncludesOpaqueBars=NO;
    self.automaticallyAdjustsScrollViewInsets=NO;
}

Ele corrigiu a cor da barra de status para mim e outros erros de interface do usuário também até certo ponto.

sanjana
fonte
7

Aqui está uma solução total de copiar e colar, com um

explicação absolutamente correta

de cada questão envolvida.

Com agradecimentos a Warif Akhand Rishi !

para o incrível achado sobre keyPath statusBarWindow.statusBar. Um bom.

func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {
    
    // handle the iOS bar!
    
    // >>>>>NOTE<<<<<
    // >>>>>NOTE<<<<<
    // >>>>>NOTE<<<<<
    // "Status Bar Style" refers to the >>>>>color of the TEXT<<<<<< of the Apple status bar,
    // it does NOT refer to the background color of the bar. This causes a lot of confusion.
    // >>>>>NOTE<<<<<
    // >>>>>NOTE<<<<<
    // >>>>>NOTE<<<<<
    
    // our app is white, so we want the Apple bar to be white (with, obviously, black writing)
    
    // make the ultimate window of OUR app actually start only BELOW Apple's bar....
    // so, in storyboard, never think about the issue. design to the full height in storyboard.
    let h = UIApplication.shared.statusBarFrame.size.height
    let f = self.window?.frame
    self.window?.frame = CGRect(x: 0, y: h, width: f!.size.width, height: f!.size.height - h)
    
    // next, in your plist be sure to have this: you almost always want this anyway:
    // <key>UIViewControllerBasedStatusBarAppearance</key>
    // <false/>
    
    // next - very simply in the app Target, select "Status Bar Style" to Default.
    // Do nothing in the plist regarding "Status Bar Style" - in modern Xcode, setting
    // the "Status Bar Style" toggle simply sets the plist for you.
    
    // finally, method A:
    // set the bg of the Apple bar to white.  Technique courtesy Warif Akhand Rishi.
    // note: self.window?.clipsToBounds = true-or-false, makes no difference in method A.
    if let sb = UIApplication.shared.value(forKeyPath: "statusBarWindow.statusBar") as? UIView {
        sb.backgroundColor = UIColor.white
        // if you prefer a light gray under there...
        //sb.backgroundColor = UIColor(hue: 0, saturation: 0, brightness: 0.9, alpha: 1)
    }
    
    /*
    // if you prefer or if necessary, method B:
    // explicitly actually add a background, in our app, to sit behind the apple bar....
    self.window?.clipsToBounds = false // MUST be false if you use this approach
    let whiteness = UIView()
    whiteness.frame = CGRect(x: 0, y: -h, width: f!.size.width, height: h)
    whiteness.backgroundColor = UIColor.green
    self.window!.addSubview(whiteness)
    */
    
    return true
}
Fattie
fonte
6

Apenas para acrescentar à resposta de Shahid - você pode levar em conta as mudanças de orientação ou dispositivos diferentes usando isto (iOS7 +):

- (BOOL) application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
  ...

  //Create the background
  UIView* statusBg = [[UIView alloc] initWithFrame:CGRectMake(0, 0, self.window.frame.size.width, 20)];
  statusBg.backgroundColor = [UIColor colorWithWhite:1 alpha:.7];

  //Add the view behind the status bar
  [self.window.rootViewController.view addSubview:statusBg];

  //set the constraints to auto-resize
  statusBg.translatesAutoresizingMaskIntoConstraints = NO;
  [statusBg.superview addConstraint:[NSLayoutConstraint constraintWithItem:statusBg attribute:NSLayoutAttributeTop relatedBy:NSLayoutRelationEqual toItem:statusBg.superview attribute:NSLayoutAttributeTop multiplier:1.0 constant:0.0]];
  [statusBg.superview addConstraint:[NSLayoutConstraint constraintWithItem:statusBg attribute:NSLayoutAttributeLeft relatedBy:NSLayoutRelationEqual toItem:statusBg.superview attribute:NSLayoutAttributeLeft multiplier:1.0 constant:0.0]];
  [statusBg.superview addConstraint:[NSLayoutConstraint constraintWithItem:statusBg attribute:NSLayoutAttributeRight relatedBy:NSLayoutRelationEqual toItem:statusBg.superview attribute:NSLayoutAttributeRight multiplier:1.0 constant:0.0]];
  [statusBg.superview addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"V:[statusBg(==20)]" options:0 metrics:nil views:NSDictionaryOfVariableBindings(statusBg)]];
  [statusBg.superview setNeedsUpdateConstraints];
  ...
}
bendytree
fonte
Sim, é ainda melhor lidar com tamanhos e orientações de tela. Adicione também algo assim em torno deste código: if (NSFoundationVersionNumber> NSFoundationVersionNumber_iOS_6_1)
Benjamin Piette
6

para o fundo, você pode adicionar facilmente uma visualização, como no exemplo:

UIView *view = [[UIView alloc] initWithFrame:CGRectMake(0, 0,320, 20)];
view.backgroundColor = [UIColor colorWithRed:0/255.0 green:0/255.0 blue:0/255.0 alpha:0.1];
[navbar addSubview:view];

onde "navbar" é um UINavigationBar.

user3107409
fonte
4
Suas duas primeiras linhas estão corretas. Mas a última linha deve ser [navigationController.view addSubview: view]; Deve ser adicionado dentro da visualização do UINavigationController, não da visualização da UINavigationBar, pois adicionará a visualização após 20 px da barra de status, sem sobrepor a barra de status.
Shahid Iqbal
Em Swift, use isto: let rect = CGRect (x: 0, y: 0, width: UIScreen.main.bounds.width, height: UIApplication.shared.statusBarFrame.height) let bar = UIView (frame: rect) bar.backgroundColor = UIColor.white navigationController? .View.addSubview (bar)
JVS
5

Swift 4:

// Alterar a cor de fundo da barra de status

let statusBar = UIApplication.shared.value(forKeyPath: "statusBarWindow.statusBar") as? UIView

statusBar?.backgroundColor = UIColor.red
V.Kumar
fonte
4

Alterar a cor de fundo da barra de status: Swift:

let proxyViewForStatusBar : UIView = UIView(frame: CGRectMake(0, 0,self.view.frame.size.width, 20))    
        proxyViewForStatusBar.backgroundColor=UIColor.whiteColor()
        self.view.addSubview(proxyViewForStatusBar)
Yogesh Lolusare
fonte
1

No caso do swift 2.0 no iOS 9

Coloque o seguinte no delegado do aplicativo, em didFinishLaunchingWithOptions:

    let view: UIView = UIView.init(frame: CGRectMake(0, 0, UIScreen.mainScreen().bounds.size.width, 20))

    view.backgroundColor = UIColor.blackColor()  //The colour you want to set

    view.alpha = 0.1   //This and the line above is set like this just if you want 
                          the status bar a darker shade of 
                          the colour you already have behind it.

    self.window!.rootViewController!.view.addSubview(view)
Keegan Cruickshank
fonte
Isso funciona, mas não acho que seja a melhor maneira de lidar com esse estilo
Michael
1

A solução iTroid23 funcionou para mim. Eu perdi a solução Swift. Então, talvez isso seja útil:

1) No meu plist, tive que adicionar isto:

<key>UIViewControllerBasedStatusBarAppearance</key>
<true/>

2) Não precisei chamar "setNeedsStatusBarAppearanceUpdate".

3) Rapidamente, tive que adicionar isso ao meu UIViewController:

override func preferredStatusBarStyle() -> UIStatusBarStyle {
    return UIStatusBarStyle.LightContent
}
Dirk
fonte
Obrigado pela chave "UIViewControllerBasedStatusBarAppearance", me ajudou :)
LightNight
1

Se estiver usando um UINavigationController, você pode usar uma extensão como esta:

extension UINavigationController {
    private struct AssociatedKeys {
        static var navigationBarBackgroundViewName = "NavigationBarBackground"
    }

    var navigationBarBackgroundView: UIView? {
        get {
            return objc_getAssociatedObject(self,
                                        &AssociatedKeys.navigationBarBackgroundViewName) as? UIView
        }
        set(newValue) {
             objc_setAssociatedObject(self,
                                 &AssociatedKeys.navigationBarBackgroundViewName,
                                 newValue,
                                 .OBJC_ASSOCIATION_RETAIN)
        }
    }

    func setNavigationBar(hidden isHidden: Bool, animated: Bool = false) {
       if animated {
           UIView.animate(withDuration: 0.3) {
               self.navigationBarBackgroundView?.isHidden = isHidden
           }
       } else {
           navigationBarBackgroundView?.isHidden = isHidden
       }
    }

    func setNavigationBarBackground(color: UIColor, includingStatusBar: Bool = true, animated: Bool = false) {
        navigationBarBackgroundView?.backgroundColor = UIColor.clear
        navigationBar.backgroundColor = UIColor.clear
        navigationBar.barTintColor = UIColor.clear

        let setupOperation = {
            if includingStatusBar {
                self.navigationBarBackgroundView?.isHidden = false
                if self.navigationBarBackgroundView == nil {
                    self.setupBackgroundView()
                }
                self.navigationBarBackgroundView?.backgroundColor = color
            } else {
                self.navigationBarBackgroundView?.isHidden = true
                self.navigationBar.backgroundColor = color
            }
        }

        if animated {
            UIView.animate(withDuration: 0.3) {
                setupOperation()
            }
        } else {
            setupOperation()
        }
    }

    private func setupBackgroundView() {
        var frame = navigationBar.frame
        frame.origin.y = 0
        frame.size.height = 64

        navigationBarBackgroundView = UIView(frame: frame)
        navigationBarBackgroundView?.translatesAutoresizingMaskIntoConstraints = true
        navigationBarBackgroundView?.autoresizingMask = [.flexibleWidth, .flexibleBottomMargin]

        navigationBarBackgroundView?.isUserInteractionEnabled = false

        view.insertSubview(navigationBarBackgroundView!, aboveSubview: navigationBar)
    }
}

Basicamente, torna o fundo da barra de navegação transparente e usa outro UIView como fundo. Você pode chamar o setNavigationBarBackgroundmétodo do seu controlador de navegação para definir a cor de fundo da barra de navegação junto com a barra de status.

Lembre-se de que você deve usar o setNavigationBar(hidden: Bool, animated: Bool)método na extensão quando quiser ocultar a barra de navegação, caso contrário, a visualização que foi usada como plano de fundo ainda estará visível.

halil_g
fonte
Para mim, essa foi a melhor resposta, pois atenuou muitos outros problemas de resposta. A desvantagem é o frame.size.height = 64 fixo, que está errado. Uma forma mais recente de obter a altura seria -> .view.window? .WindowScene? .StatusBarManager? .StatusBarFrame.height ?? 0.
Gonçalo Gaspar
1

Experimente isso. Use este código em sua didFinishLaunchingWithOptionsfunção de classe appdelegate :

[[UIApplication sharedApplication] setStatusBarStyle:UIStatusBarStyleLightContent];
[application setStatusBarHidden:NO];
UIView *statusBar = [[[UIApplication sharedApplication] valueForKey:@"statusBarWindow"] valueForKey:@"statusBar"];
if ([statusBar respondsToSelector:@selector(setBackgroundColor:)]) {
    statusBar.backgroundColor = [UIColor blackColor];
}
Karthickkck
fonte
1

O snippet de código a seguir deve funcionar com o Objective C.

   if (@available(iOS 13.0, *)) {
      UIView *statusBar = [[UIView alloc]initWithFrame:[UIApplication sharedApplication].keyWindow.windowScene.statusBarManager.statusBarFrame] ;
      statusBar.backgroundColor = [UIColor whiteColor];
      [[UIApplication sharedApplication].keyWindow addSubview:statusBar];
  } else {
      // Fallback on earlier versions

       UIView *statusBar = [[[UIApplication sharedApplication] valueForKey:@"statusBarWindow"] valueForKey:@"statusBar"];
          if ([statusBar respondsToSelector:@selector(setBackgroundColor:)]) {
              statusBar.backgroundColor = [UIColor whiteColor];//set whatever color you like
      }
  }
Govind
fonte
Você receberá a barra de status dupla no iOS 13.
kelin 01 de
0

Para a cor da barra: você fornece uma imagem de plano de fundo personalizada para a barra.

Para a cor do texto: use as informações em Sobre o tratamento de texto no iOS

Chris Alan
fonte
1
não se trata de definir uma cor de texto
Johnykutty,
Adicionar uma imagem de fundo é um exagero se você deseja apenas definir uma cor sólida, e inviável, especialmente se você deseja ser capaz de alterar a cor
instantaneamente
0

Consegui personalizar a cor do StatusBar de forma bastante simples, adicionando um AppDelegate.csarquivo no método:

public override bool FinishedLaunching(UIApplication app, NSDictionary options)

próximo código:

UIView statusBar = UIApplication.SharedApplication.ValueForKey(new NSString("statusBar")) as UIView;

if (statusBar!=null && statusBar.RespondsToSelector(new Selector("setBackgroundColor:")))
{
   statusBar.BackgroundColor = Color.FromHex(RedColorHex).ToUIColor();
}

Então você consegue algo assim:

insira a descrição da imagem aqui

Link: https://jorgearamirez.wordpress.com/2016/07/18/lesson-x-effects-for-the-status-bar/

Dan
fonte
Que língua é essa?
Ahmadreza
1
@Alfi Xamarin se forma e em segundo plano está C #
Dan
0

Swift 4

Em Info.plistadicionar esta propriedade

Ver a aparência da barra de status baseada no controlador para NÃO

e depois disso no AppDelegateinterior do didFinishLaunchingWithOptionsadicione estas linhas de código

UIApplication.shared.isStatusBarHidden = false
UIApplication.shared.statusBarStyle = .lightContent
Smg baquer
fonte
0

Em Swift 5 e Xcode 10.2

DispatchQueue.main.asyncAfter(deadline: DispatchTime.now() + Double(Int64(0.1 * Double(NSEC_PER_SEC))) / Double(NSEC_PER_SEC), execute: {

//Set status bar background colour
let statusBar = UIApplication.shared.value(forKeyPath: "statusBarWindow.statusBar") as? UIView
statusBar?.backgroundColor = UIColor.red
//Set navigation bar subView background colour
   for view in controller.navigationController?.navigationBar.subviews ?? [] {
      view.tintColor = UIColor.white
      view.backgroundColor = UIColor.red
   }
})

Aqui, fixei a cor de fundo da barra de status e a cor de fundo da barra de navegação. Se você não quiser a cor da barra de navegação, comente.

iOS
fonte
0

Código Swift

            let statusBarView = UIView(frame: CGRect(x: 0, y: 0, width: view.width, height: 20.0))
            statusBarView.backgroundColor = UIColor.red
            self.navigationController?.view.addSubview(statusBarView)
Samkit Jain
fonte
0

Você pode usar como abaixo, para iOS 13 * e Swift 4.

1 -> Definir a aparência da barra de status baseada no controlador de Visualização para NÃO

extension UIApplication {
var statusBarView: UIView? {
    if #available(iOS 13.0, *) {
       let statusBar =  UIView()

        statusBar.frame = UIApplication.shared.statusBarFrame

        UIApplication.shared.keyWindow?.addSubview(statusBar)
      
        return statusBar
    } else {
        let statusBar = UIApplication.shared.value(forKeyPath: "statusBarWindow.statusBar") as? UIView
        return statusBar
    }
}

usar em didFinishLaunchingWithOptions

UIApplication.shared.statusBarView?.backgroundColor = UIColor.red
Lokesh
fonte