Como ocultar a barra de status em um aplicativo Swift iOS?

201

Gostaria de remover a barra de status na parte superior da tela.

Isso não funciona:

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

Eu também tentei:

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
}
Jay
fonte
Possível duplicata de Como ocultar uma barra de status no iOS?
Jake Chasan

Respostas:

449

Você realmente deve implementar prefersStatusBarHidden no (s) seu (s) controlador (es) de visualização:

Swift 3 e posterior

override var prefersStatusBarHidden: Bool {
    return true
}
drewag
fonte
4
Acho que a intenção de Jay é ocultar a barra de status para o aplicativo completo. Por isso, ele teria escrito a funcionalidade ocultar no didFinishLaunchingWithOptions do aplicativo. Como ocultar a barra de status para o aplicativo completo?
Satyam
O @Satyam tem um bom argumento, seria bom removê-lo em todo o aplicativo. Existe uma abordagem para implementar isso por herança? Ou via extensão de protocolo?
Dan Beaulieu
3
@ DanBeaulieu Eu acho que através da herança seria uma ótima solução. Crie uma subclasse UIViewController em que bar hidden esteja definido como true e faça com que todas as suas subclasses sejam herdadas dessa. Outra abordagem poderia estar usando o Swizzling
criseGriega
1
O código Swift 3 não funcionou, consulte: stackoverflow.com/a/38902285/129202
Jonny
1
Neste método existe uma falha: quando você quer executar um segue, a sua visão controladora da viewcontroller atual cair cerca de 20 px
iman kazemayni
99
  1. Vá para o arquivo Info.plist
  2. Passe o mouse sobre uma dessas linhas e um botão (+) e (-) será exibido.
  3. Clique no botão de adição para adicionar uma nova chave Digite no início com capital V e automaticamente a primeira opção será Exibir a aparência da barra de status baseada no controlador.
  4. Adicione isso como a CHAVE.
  5. Defina o VALUE como "NÃO"
  6. Vá para você AppDelegate.swift
  7. Adicione o código, dentro do método

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

FEITO! Execute seu aplicativo e sem mais barra de status!

nycdanie
fonte
1
No começo, achei que essa solução funcionava bem, mas percebi que isso causava um erro que eu precisava depurar com CG_CONTEXT_SHOW_BACKTRACE. Retrocedeu para a adição de "Exibir aparência da barra de status baseada em controlador"
Sean
Bem trabalhado para mim no IOS 9 2.2
uplearnedu.com
1
Trabalhou para o simulador iOS 10.1. Obrigado, @nycdanie.
Jerome
7
Além de definir "Exibir aparência da barra de status com base no controlador" como NÃO, adicione também "A barra de status está oculta inicialmente" definida como "SIM". Então você não precisa adicionar código no controlador de exibição e a barra de status ficará oculta em todo o aplicativo. Xcode 8.1, Swift 3.0.1, iOS 10
tylerSF
1
@tylerSF Funciona muito bem! Você deve adicionar isso como uma resposta :)
Pétur Ingi Egilsson
72

Swift 3

Em Info.plistdefinido View controller-based status bar appearancecomoNO

E ligar UIApplication.shared.isStatusBarHidden = true

Joseph Mark
fonte
1
Se estiver definido como sim, é a única maneira de funcionar.
farzadshbfn
@farzadshbfn isso não está certo. Como mencionado e testado por mim, funciona com o NO booleano.
Codetard
43

Se você deseja ocultar e trazer de volta a barra de status com o toque no botão , ao mesmo tempo em que apresenta e dispensa o menu deslizante , pop-ups , etc., você pode usar este método: -

Para ocultar a barra de status: -

UIApplication.shared.keyWindow?.windowLevel = UIWindowLevelStatusBar

Para retornar a barra de status: -

UIApplication.shared.keyWindow?.windowLevel = UIWindowLevelNormal 
Vincent Joy
fonte
Isso é mais um truque. Eu não gostaria de me intrometer nessa janela ... especialmente se uma solução já existir. Eu encorajaria os desenvolvedores a substituir a prefersStatusBarHiddenpropriedade como o que já foi mencionado.
Stephen Paul
2
isso pode ser usado se quisermos ocultar e recuperar a barra de status momentaneamente. No meu aplicativo, quando o menu deslizante vem do lado esquerdo, tenho que ocultar a barra de status. e quando o menu desaparece, é preciso recuperar a barra de status, como no aplicativo iOS do gmail. Para que nesse tipo de cenário, possamos usar isso.
Vincent Joy
3
É um truque, e eu não iria se meter com ele, mas ele faz o trabalho para o momento. Tipo como todos vocês dizem. O problema prefersStatusBarHiddené que as visualizações vinculadas à barra de status usando restrições e também as barras de navegação se moverão de maneira incorreta se você ativar / desativar a barra de status prefersStatusBarHidden . No momento, apenas essa resposta parece contornar isso.
Jonny
Concordo totalmente com @ Jonny, também não gosto dessa solução, mas, como ele disse, a substituição prefersStatusBarHiddenatrapalhará sua restrição. Até agora, isso faz o trabalho. No entanto, estou usando um pequeno wrapper para evitar o uso de singletons, você pode encontrá-lo aqui
rgkobashi
34

se você preferir uma abordagem visual em vez de codificá-la, use este método: em seu info.plist

insira a descrição da imagem aqui basta adicionar View controller-based status bar appearanceaNO

e Status bar is initially hiddencomoYES

MiladiuM
fonte
Esta é a resposta canônica em 2018
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
fonte
28

Atualização para iOS 10 / Swift 3.0

Não é mais uma função, agora uma propriedade ...

override var prefersStatusBarHidden: Bool {
    return true
}
atlwx
fonte
Sabe como configurar isso durante todo o aplicativo, eu tenho atualmente para entrar isto em cada viewController
William T.
Experimente o menu Localizar e, em seguida, encontre e substitua no projeto? Possivelmente? Mas essa chave extra com os aninhados fica ... hmmm ... não sei. boa pergunta!
atlwx
prefersStatusBarHidden nunca foi chamado
Bagusflyer
6
Você não precisa do get { }se você não tiver um set, basta escreverreturn true
Daniel
16

no Swift 3.x:

override func viewWillAppear(_ animated: Bool) {
    UIApplication.shared.isStatusBarHidden = true
}
Samira Ekrami
fonte
Isso foi preterido no iOS 9.0
Georgios
16

Vá para o seu Info.plist e adicione duas chaves:

Vá para o seu Info.plist e adicione duas chaves:

janaz
fonte
12

Portanto, o problema aqui não tem nada a ver com Swift, mas apenas como a aparência da barra de status é tratada no iOS 7.

Por padrão, os controladores de exibição controlam individualmente a aparência da barra de status quando estão na tela. Se você quiser usar esse método para controlar a barra de status, poderá substituir os métodos a seguir para os controladores de exibição para os quais deseja modificar a aparência:

prefersStatusBarHidden, preferredStatusBarStyle , preferredStatusBarAnimation,

No seu caso, você apenas implementaria prefersStatusBarHidden e retornariatrue .

A outra maneira seria controlar a aparência da barra de status no nível do aplicativo. Parece ser o que você está realmente tentando fazer (definindoapplication.statusBarHidden ).

Para fazer isso funcionar, você precisa abrir o Info.plistarquivo do seu aplicativo, adicionar a chave UIViewControllerBasedStatusBarAppearancee atribuir um valor de NO.

Dima
fonte
1
Eu acho que você quer dizer return true para prefersStatusBarHidden. NO pertence ao ObjC e, de qualquer maneira, é o valor bool errado.
HenryRootTwo
@HenryRootTwo não está em arquivos .plist. Lá ainda usamos SIM / NÃO
Alex Salom
8

Na verdade, eu mesmo descobri isso. Vou adicionar minha solução como outra opção.

extension UIViewController {
    func prefersStatusBarHidden() -> Bool {
        return true
    }
}
Jay
fonte
Agradável abordagem para manter as coisas limpas e modular
Roger Fernandez Guri
2
Não consigo implementar isso. Talvez seja porque agora eu uso o Swift 1.2. Estou recebendo o erro: "O método 'prefereStatusBarHidden ()' com o seletor Objective-C 'prefereStatusBarHidden' entra em conflito com a declaração anterior com o mesmo seletor Objective-C". Também adicionei a palavra-chave override no início, mas ainda assim recebo o mesmo erro.
Andrej
Você precisa adicionar isso a todas as visualizações?
20515 Sean
Não funciona no Swift 2, mostra um erro conforme explicado por @Andrej acima.
Nagendra Rao
4

Ok, isso se tornou um problema para mim, pois o iOS 9 não suporta nenhum método acima do mencionado pelas pessoas aqui, como UIApplication.sharedApplication().statusBarHidden = true ou

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

e

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

funciona, mas não fornece solução programável onde eu posso alterar em uma condição. ( statusBarHidden = truee statusBarHidden = falsecomo fizemos antes).

Solução para essa loucura:

Ao adicionar a prefersStatusBarHidden()gosto abaixo você pode controlar programaticamente a esconder e mostrar de barra de status sem adicionar UIViewControllerBasedStatusBarAppearancedefinição para o seu info.plist :

var showStatusBar = true

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

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

use-o assim em todo o seu código:

//Hide Status Bar
showStatusBar(false)

OU

//Show Status Bar
showStatusBar(true)
CodeOverRide
fonte
1
Chamar prefersStatusBarHiddenfaz algum sentido? Eu acho que você quer dizer self.setNeedsStatusBarAppearanceUpdate()depois de showStatusBaratribuir
Leo
É realmente loucura, não é? Que API lamentável é essa e tem sido por tanto tempo. Esse tipo de coisa torna o desenvolvimento do iOS incrivelmente frustrante às vezes.
Womble
@ Womble, sim, e pode ficar bastante complicado também. Esperemos que o Swift 3.0 tenha uma biblioteca e suporte melhores, pois, pela primeira vez, ele mudará muito do swift 2.3 ... quebrando coisas.
CodeOverRide 19/09/16
Em vez de chamar prefersStatusBarHidden do seu método, você pode chamar setNeedsStatusBarAppearanceUpdate
Oscar
4

Apenas para adicionar, ao substituir o prefersStatusBarHiddenmétodo ou a variável, o View controller-based status bar appearancearquivo Info.plist deve ser SIM, caso contrário, a substituição não terá efeito

Huanyan
fonte
4

no Swift 4.2, é uma propriedade agora.

override var prefersStatusBarHidden: Bool {
    return true
}
Rawand Saeed
fonte
3

No meu caso, eu estava procurando a barra de status para ocultar / mostrar sob demanda; em vez de apenas quando a vista é carregada ou desaparece.

swift 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
fonte
3

Swift 5: no controlador de vista principal ou no controlador de navegação principal, se você tiver,

    override var preferredStatusBarStyle: UIStatusBarStyle {
        return .lightContent
    }

    override var prefersStatusBarHidden: Bool {
        return false
    }

E "Exibir aparência da barra de status baseada no controlador" no plist deve ser SIM, caso contrário, o código acima não será chamado.

Se você deseja ocultar a barra de status ao iniciar o aplicativo, "A barra de status está oculta inicialmente" deve ser SIM. Isso pode impedir que a imagem de inicialização seja distorcida quando uma barra azul extra é exibida na parte superior da tela.

Sam Xu
fonte
2

Uma solução que funciona para mim; se você deseja ocultar a barra de status em um controlador de exibição específico durante o carregamento:

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

Atenção: se você definir a chave " Exibir aparência da barra de status baseada no controlador " como " NÃO " em suas informações, lembre-se de que o código acima não funciona. Você deve definir a chave como " SIM " ou removê- la de info.plist

andre_hold
fonte
Você não pode substituir a propriedade hideStatusBar, pois é uma propriedade armazenada! no entanto, você pode apenas escolher outro nome e sua animação funcionará.
XcodeNOOB 29/07
2

No seu projeto Geral-> Informações de Implantação-> Estilo da barra de status, selecione a opção Ocultar barra de status Nota: - oculta a barra de status em todo o aplicativo

Sweta Vani
fonte
1
Isso funciona para mim (iOS 12), onde respostas plist não.
Threeve 3/03/19
2

Para o Swift 4+, tente o seguinte código (testado no 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
fonte
2

Swift 5+

No meu caso, preciso atualizar a barra de status oculta com base em algumas condições.

Por isso, crio uma controlller base BaseViewControllerque contém novas propriedades hideStatusBar.

Outros controladores de exibição são subclasses desse controlador base. Finalmente, quando quero atualizar o comportamento da barra de status, preciso alterar apenas esse hideStatusBarvalor.

class BaseViewController: UIViewController {

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

    override var prefersStatusBarHidden: Bool {
           return hideStatusBar
    }
}

Como usar

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

Demo

Aqui está uma demonstração que estou usando UIView.animate(...)para tornar a transição mais suave.

insira a descrição da imagem aqui

nahung89
fonte
1

Estou usando o Xcode 8.1 (8B62) com um destino de implantação definido para 10.1 e não tive muita sorte com as opções de substituição mencionadas acima. No entanto, verificar a opção "Ocultar barra de status" em Informações de implantação fez o truque para mim.

Projeto> Geral

Eu espero que isso ajude.

danmerfeld
fonte
1

Se você estiver apresentando o controlador de exibição modalmente, tente

viewController.hidesBottomBarWhenPushed = true
viewController.modalPresentationCapturesStatusBarAppearance = true
YannSteph
fonte
0
func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {
        application.isStatusBarHidden = true
        return true
    }
Prasad Bulbule
fonte
4
Ao responder uma pergunta, explique sua resposta, o snippet de código não é uma resposta adequada.
LazerBanana
0

Você pode usar esse código em seu ViewController Class scope

open override var prefersStatusBarHidden: Bool { return true }
Sajjad
fonte
Obrigado pela resposta, você gostaria de elaborar um pouco mais. Onde exatamente ele deve adicionar a linha de código e por que isso funcionaria? Consulte a seção Como redigir uma boa resposta .
9953-div-37
0

No seu Projeto-> Geral-> Informações de implantação

Estilo da barra de status: -

acabou de marcar Ocultar barra de status (iOS 10)

VD Purohit
fonte
0

Swift 4

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

//MARK:- Hide Status Bar
UIApplication.shared.isStatusBarHidden = true
Shakeel Ahmed
fonte
ok por agora i donot tem nenhum ios 12 i têm 11,4 quando sua atualização eu vou corrigi-lo, bem como, também se você tem teamviewer i virá e corrigi-lo em seu sistema
Shakeel Ahmed
está obsoleto #
Vyachaslav Gerchicov 13/08/19
0

Atualizado para iOS 13 e Swift 5

Se nenhuma das respostas acima funcionar para você. Verifique seu plist para ver se você tem isso:

"Exibir aparência da barra de status baseada no controlador"

Em caso afirmativo, certifique-se de configurá-lo para SIM !!!!!

Em seguida, o código a seguir funcionará.

override var prefersStatusBarHidden: Bool {
    return true
}
Legolas Wang
fonte