white - Alterando a cor da barra de status para ViewControllers específicos usando Swift no iOS8




swift status bar white (20)

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

O uso do código acima em qualquer ViewController para definir a cor statusBar como Branco para um controlador de exibição específico não funciona no iOS8 para mim . Alguma sugestão? Usando o método UIApplication.sharedApplication, a cor muda após as alterações necessárias no Info.plist para todo o aplicativo.

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

Como posso fazer alterações na cor da barra de status para alguns ViewControllers necessários e específicos ?


Cor personalizada para a barra de status (iOS11 +, Swift4 +)

Se você está procurando uma solução, como alterar a barra de status para sua cor personalizada, essa é a solução que está funcionando.

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

Atualização do Swift 3.0

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

        UIApplication.shared.statusBarStyle = .lightContent

        return true
    }

Depois de ler todas as sugestões e experimentar algumas coisas, consegui que isso funcionasse para controladores de exibição específicos usando as seguintes etapas:

Primeiro passo:

Abra seu info.plist e insira uma nova chave denominada " Exibir aparência da barra de status baseada em controlador " para NÃO

Segundo passo (apenas uma explicação, não é necessário implementar isso):

Normalmente, colocamos o seguinte código no método application (_: didFinishLaunchingWithOptions :) do AppDelegate,

Swift 2

UIApplication.sharedApplication().statusBarStyle = .LightContent

Swift 3

UIApplication.shared.statusBarStyle = .lightContent

mas isso afeta o statusBarStyle de todos os ViewControllers.

Então, como fazer isso funcionar para ViewControllers específicos - Etapa final:

Abra o arquivo viewcontroller no qual deseja alterar o statusBarStyle e coloque o seguinte código em viewWillAppear() ,

Swift 2

UIApplication.sharedApplication().statusBarStyle = .LightContent

Swift 3

UIApplication.shared.statusBarStyle = .lightContent

Além disso, implemente o método viewWillDisappear() para esse viewController específico e coloque as seguintes linhas de código,

Swift 2

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

}

Swift 3

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

Esta etapa primeiro altera o statusBarStyle para o viewcontroller específico e, em seguida, volta ao default quando o viewcontroller específico desaparece. A não implementação do viewWillDisappear() alterará permanentemente o statusBarStyle para o novo valor definido de UIStatusBarStyle.LightContent


Eu havia definido uma cor específica (no formato RGB) usando o código abaixo no arquivo App Delegate :

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

. . .
}

Você também precisa adicionar a chave abaixo no arquivo Info.plist :

Visualizar a aparência da barra de status baseada no controlador com o valor booleano definido como NO


Eu posso sugerir uma maneira mais simples,

  1. Basta chamar setNeedsStatusBarAppearanceUpdate no viewDidLoad, como diz a documentação da Apple,

Chame esse método se os atributos da barra de status do controlador de exibição, como status ou estilo oculto / não oculto, mudarem. Se você chamar esse método em um bloco de animação, as alterações serão animadas junto com o restante do bloco de animação.

  1. Implemente o preferredStatusBarStyle retornando seu tipo preferido.

Funcionou para mim no iOS 10.1.

Objetivo C

[self setNeedsStatusBarAppearanceUpdate];

-(UIStatusBarStyle)preferredStatusBarStyle {
     return UIStatusBarStyleLightContent;
}

Rápido

setNeedsStatusBarAppearanceUpdate()

var preferredStatusBarStyle: UIStatusBarStyle { 
    return .lightContent
}

Estou surpreso que ninguém tenha apontado isso. De qualquer forma, aproveite :)


Eu segui este tutorial e funcionou para mim. No entanto, não tenho certeza se há alguma ressalva.

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

  • Abra seu info.plist e defina UIViewControllerBasedStatusBarAppearance como false .
  • Na primeira função no AppDelegate.swift , que contém didFinishLaunchingWithOptions , defina a cor desejada.

UIApplication.sharedApplication().statusBarStyle = UIStatusBarStyle.LightContent

  • Atualização Swift 3 *

    UIApplication.shared.statusBarStyle = .lightContent


Funciona para aplicativos baseados em navegação

    var addStatusBar = UIView()
    addStatusBar.frame = CGRectMake(0, 0, UIScreen.mainScreen().bounds.width, 20);
    addStatusBar.backgroundColor = global().UIColorFromRGB(0x65b4d9)
    self.window?.rootViewController?.view .addSubview(addStatusBar)

Funciona para navegação com base em um controlador de exibição específico no 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)

Implemente o preferredStatusBarStyle como você mencionou e chame self.setNeedsStatusBarAppearanceUpdate() em ViewDidLoad e também no Info.plist defina UIViewControllerBasedStatusBarAppearance como YES (por padrão, é YES )

Não está claro por que ele não está funcionando.Eu preciso verificar o código.Uma outra sugestão é o código de trabalho em viewDidLoad UIApplication.sharedApplication().statusBarStyle = .LightContent e altere-o para o padrão quando você visualizar viewWillDisappear desaparecido.


Na minha situação, uso o storyboard para organizar meus controladores de exibição. Quero alterar todo o estilo da barra de status.

Você pode ver na figura abaixo.

Stars View Controller é um CPBaseNavigationController , e CPBaseNavigationController é uma subclasse de UINavigationController .

Eu tento fazer os próximos ajustes:

  1. Em AppDelegate.swift func didFinishLaunchingWithOptions , adicione

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

    mas sem efeito.

  2. No StoryBoard, localize o Base Tab BarController (foto acima) .select Attributes Inspector , altere o atributo Sattus Bar para Light Content . Sattus Bar ruim, sem efeito.

  1. Última vez que eu obtê-lo. No meu controlador de navegação personalizado CPBaseNavigationController , adicione func CPBaseNavigationController

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

    Isso funciona bem!

Além disso, statusBarStyle descontinuado no 9.0, você pode usar -[UIViewController preferredStatusBarStyle] .


O que funcionou comigo, no Storyboard, vá para o Navigation Controller, selecione a barra de navegação, clique no Inspetor de Atributos e mude o estilo de padrão para preto. É isso aí!


Outra maneira realmente fácil de fazer esse trabalho é apenas criar uma extensão da classe UINavigationController.

Como a substituição do método preferredStatusBarStyle: não funcionará, a menos que seja feito dentro da classe UINavigationController.

    extension UINavigationController {
        open override var preferredStatusBarStyle: UIStatusBarStyle {
            return .lightContent
        }
    }

Tudo é muito mais fácil no Swift 3.0 Xcode 8

Usando o código abaixo no arquivo App Delegate, após

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

insira isto:

UINavigationBar.appearance().barStyle = .black

UINavigationBar.appearance().barTintColor = UIColor(red: 230, green: 32, blue: 31, alpha: 1.0)

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

No Swift 4 ou 4.2

Você pode adicionar no seu vc

preferidoStatusBarStyle

e defina o valor de retorno como

.lightContent ou .default

ex:

override var preferredStatusBarStyle: UIStatusBarStyle {
        return .lightContent
}

SWIFT 2

Consegui alterar com êxito a aparência do plano de fundo da barra de status adicionando o seguinte no meu viewWillAppear:

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

    if statusBar.respondsToSelector(Selector("setBackgroundColor:")) {
        statusBar.backgroundColor = .redColor()
    }

Solução Swift 4.2 com NavigationController

Primeiro passo:

Abra seu info.plist e insira uma nova chave denominada " Exibir aparência da barra de status baseada no controlador " ou UIViewControllerBasedStatusBarAppearance para YES para permitir que cada VC use sua própria propriedade de status.

Segundo passo

Em cada VC, substitua a propriedade preferidaStatusBarStyle como esta:

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

Último passo

Substitua a propriedade selectedStatusBarStyle na sua classe NavigationController customizada:

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
}

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

Swift 4 Para o ViewController específico sem o NavigationViewController incorporado, basta adicioná-lo ao seu arquivo ViewController.

override var preferredStatusBarStyle : UIStatusBarStyle {
    return .lightContent
}

AVISO

O setter para 'statusBarStyle' foi descontinuado no iOS 9.0: Use - [UIViewController preferênciaStatusBarStyle]

UIApplication.shared.statusBarStyle = .default

então minha solução foi a seguinte: fazer uma extensão do controlador de navegação:

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

        return .default
    }
}

e se você tiver um viewController que terá outro estilo que não o estilo do aplicativo, poderá fazer isso

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

digamos que seu estilo de status do aplicativo é .default e você deseja que essa tela seja .lightContent para que barStyle leve o .lightContent como seu valor padrão, isso mudará o estilo da barra de status para lightContent e verifique se viewWillDisappear altera o barStyle novamente para o estilo da barra de status do aplicativo, que, no nosso caso, é .default .

isso é funciona para mim





statusbar