Bagaimana cara menyembunyikan bilah status di aplikasi Swift iOS?

201

Saya ingin menghapus bilah status di bagian atas layar.

Ini tidak bekerja:

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

Saya juga sudah mencoba:

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
sumber
Kemungkinan duplikat Cara menyembunyikan bilah status di iOS?
Jake Chasan

Jawaban:

449

Anda benar-benar harus mengimplementasikan prefersStatusBarHidden di view controller Anda:

Cepat 3 dan kemudian

override var prefersStatusBarHidden: Bool {
    return true
}
drewag
sumber
4
Saya pikir maksud Jay adalah menyembunyikan bilah status untuk aplikasi lengkap. Itu sebabnya dia menulis fungsionalitas hide di didFinishLaunchingWithOptions. Bagaimana cara menyembunyikan bilah status untuk aplikasi lengkap?
Satyam
@Satyam memiliki poin bagus, alangkah baiknya untuk menghapus ini di seluruh aplikasi. Apakah ada pendekatan untuk mengimplementasikan ini melalui warisan? Atau melalui ekstensi protokol?
Dan Beaulieu
3
@DanBeaulieu Saya pikir melalui warisan akan menjadi solusi yang bagus. Buat subkelas UIViewController di mana bilah tersembunyi disetel ke true dan kemudian buat semua subkelas Anda mewarisi dari itu. Pendekatan lain bisa menggunakan Swizzling
crisisGriega
1
Kode Swift 3 tidak berfungsi, lihat: stackoverflow.com/a/38902285/129202
Jonny
1
Dalam metode ini ada kesalahan: ketika Anda ingin melakukan segue, pandangan orang tua Anda dari viewcontroller saat ini jatuh sekitar 20 px
iman kazemayni
99
  1. Buka file Info.plist
  2. Arahkan pada salah satu garis itu dan tombol (+) dan (-) akan muncul.
  3. Klik tombol plus untuk menambahkan kunci baru. Ketik di mulai dengan huruf kapital V dan secara otomatis pilihan pertama adalah tampilan status bar berbasis pengontrol.
  4. Tambahkan itu sebagai KUNCI.
  5. Setel VALUE ke "TIDAK"
  6. Pergi ke Anda AppDelegate.swift
  7. Tambahkan kode, di dalam metode

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

DIBUAT! Jalankan aplikasi Anda dan tidak ada lagi bilah status!

nycdanie
sumber
1
Pada awalnya saya pikir solusi ini berfungsi dengan baik, tetapi kemudian saya perhatikan bahwa itu menyebabkan kesalahan yang saya butuhkan untuk debug dengan CG_CONTEXT_SHOW_BACKTRACE. Ditelusuri kembali ke penambahan "Lihat tampilan status berbasis pengontrol"
Sean
Bekerja dengan baik untuk saya di iOS 9 2.2
uplearnedu.com
1
Bekerja untuk simulator iOS 10.1. Terima kasih, @nycdanie.
Jerome
7
Selain mengatur "Lihat tampilan bilah status berbasis pengontrol" menjadi TIDAK, tambahkan juga "Bilah status pada awalnya disembunyikan" disetel ke "YA". Maka Anda tidak perlu menambahkan kode di view controller dan bilah status akan disembunyikan di seluruh aplikasi. Xcode 8.1, Swift 3.0.1, iOS 10
tylerSF
1
@tylerSF Bekerja sangat bagus! Anda harus menambahkan ini sebagai jawaban :)
Pétur Ingi Egilsson
72

Cepat 3

Di Info.plistset View controller-based status bar appearancekeNO

Dan telepon UIApplication.shared.isStatusBarHidden = true

Joseph Mark
sumber
1
Jika diatur ke ya, ini adalah satu-satunya cara itu akan berhasil.
farzadshbfn
@farzadshbfn itu tidak benar. Seperti yang disebutkan dan diuji oleh saya itu berfungsi dengan NO boolean.
Codetard
43

Jika Anda ingin menyembunyikan dan mengembalikan bilah status pada ketuk tombol , sementara pada saat menyajikan dan menolak menu slide-in , popup dll, maka Anda dapat menggunakan metode ini: -

Untuk menyembunyikan bilah status: -

UIApplication.shared.keyWindow?.windowLevel = UIWindowLevelStatusBar

Untuk mengembalikan bilah status: -

UIApplication.shared.keyWindow?.windowLevel = UIWindowLevelNormal 
Vincent Joy
sumber
Ini lebih merupakan peretasan. Saya tidak ingin ikut campur dengan jendela seperti ini ... terutama jika solusi sudah ada. Saya akan mendorong pengembang untuk menimpa prefersStatusBarHiddenproperti seperti apa yang telah disebutkan.
Stephen Paul
2
ini dapat digunakan jika kita ingin menyembunyikan dan mengembalikan bilah status sebentar .. di aplikasi saya, ketika menu slider berasal dari sisi kiri, saya harus menyembunyikan bilah status. dan ketika menu hilang, kita harus mengembalikan status bar, seperti di aplikasi iOS gmail .. jadi dalam skenario semacam itu, kita bisa menggunakan ini.
Vincent Joy
3
MEMANG hack, dan aku tidak akan ikut campur dengan itu, tapi itu tidak bekerja untuk saat ini. Seperti yang Anda semua katakan. Masalahnya prefersStatusBarHiddenadalah bahwa pandangan terkait dengan bilah status menggunakan kendala, dan juga bilah navigasi, akan bergerak dengan cara yang buruk jika Anda mengaktifkan / menonaktifkan bilah status menggunakan prefersStatusBarHidden . Untuk saat ini tampaknya hanya jawaban ini yang bisa mengatasi itu.
Jonny
Sepenuhnya setuju dengan @Jonny, saya juga tidak suka solusi ini tapi seperti katanya, mengganti prefersStatusBarHiddenakan mengacaukan kendala Anda. Sejauh ini berhasil. Namun saya menggunakan pembungkus kecil untuk menghindari penggunaan lajang, Anda dapat menemukannya di sini
rgkobashi
34

jika Anda lebih suka pendekatan visual daripada mengkodekannya gunakan metode ini: di info.plist

masukkan deskripsi gambar di sini cukup tambahkan View controller-based status bar appearancekeNO

dan Status bar is initially hiddensebagaiYES

MiladiuM
sumber
Ini adalah jawaban kanonik pada tahun 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
sumber
28

Pembaruan untuk iOS 10 / Swift 3.0

Tidak lagi berfungsi, sekarang menjadi properti ...

override var prefersStatusBarHidden: Bool {
    return true
}
atlwx
sumber
Apakah Anda tahu cara mengatur ini di seluruh aplikasi, saat ini saya harus memasukkan ini ke dalam setiap viewController
William T.
Coba Temukan Menu, lalu Temukan dan Ganti di Proyek? Mungkin? Tapi itu penjepit ekstra dengan sarang ... hmmm .... tidak tahu. Pertanyaan bagus!
atlwx
prefersStatusBarHidden tidak pernah dipanggil
Bagusflyer
6
Anda tidak perlu get { }jika Anda tidak punya set, cukup tulisreturn true
Daniel
16

dalam Swift 3.x:

override func viewWillAppear(_ animated: Bool) {
    UIApplication.shared.isStatusBarHidden = true
}
Samira Ekrami
sumber
Ini tidak berlaku lagi di iOS 9.0
Georgios
16

Buka Info.plist Anda dan tambahkan dua Kunci:

Buka Info.plist Anda dan tambahkan dua Kunci:

janaz
sumber
12

Jadi masalah di sini sebenarnya tidak ada hubungannya dengan Swift tetapi hanya bagaimana penampilan status bar ditangani pada iOS 7.

Secara Default, lihat pengontrol yang mengontrol tampilan bilah status secara terpisah saat ditampilkan di layar. Jika Anda ingin menggunakan metode ini mengendalikan bilah status, Anda dapat mengganti metode berikut untuk pengontrol tampilan apa pun yang ingin Anda ubah tampilan untuk:

prefersStatusBarHidden, preferredStatusBarStyle, preferredStatusBarAnimation ,

Dalam kasus Anda, Anda hanya perlu menerapkan prefersStatusBarHiddendan kembali true.

Cara lain adalah dengan mengontrol tampilan bilah status di tingkat aplikasi. Ini sepertinya adalah apa yang sebenarnya Anda coba lakukan (dengan menetapkan application.statusBarHidden).

Untuk membuat ini berfungsi, Anda perlu membuka Info.plistfile aplikasi Anda dan menambahkan kunci UIViewControllerBasedStatusBarAppearance, dan memberikan nilai NO.

Dima
sumber
1
Saya pikir maksud Anda mengembalikan true untuk prefersStatusBarHidden. TIDAK milik ObjC dan merupakan nilai bool yang salah pula.
HenryRootTwo
@HenryRootTwo tidak ada dalam file .plist. Di sana kami masih menggunakan YA / TIDAK
Alex Salom
8

Saya sendiri yang sebenarnya tahu ini. Saya akan menambahkan solusi saya sebagai opsi lain.

extension UIViewController {
    func prefersStatusBarHidden() -> Bool {
        return true
    }
}
Jay
sumber
Pendekatan yang bagus untuk menjaga hal-hal bersih dan modular
Roger Fernandez Guri
2
Saya tidak bisa menerapkan ini. Mungkin karena sekarang saya menggunakan Swift 1.2. Saya mendapatkan kesalahan: "Metode 'prefersStatusBarHidden ()' dengan pemilih Objective-C 'konflik prefersStatusBarHidden' dengan deklarasi sebelumnya dengan pemilih Objective-C yang sama". Saya juga menambahkan kata kunci override di awal, tetapi masih mendapatkan kesalahan yang sama.
Andrej
Apakah Anda perlu menambahkan ini ke setiap tampilan?
Sean
Tidak berfungsi di Swift 2, menampilkan kesalahan seperti yang dijelaskan oleh @Andrej di atas.
Nagendra Rao
4

Oke, jadi ini menjadi masalah bagi saya karena iOS 9 tidak mendukung metode di atas yang telah disebutkan orang di sini seperti UIApplication.sharedApplication().statusBarHidden = true atau

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

dan

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

berfungsi tetapi tidak memberikan solusi yang dapat diprogram di mana saya dapat berubah dengan syarat. ( statusBarHidden = truedan statusBarHidden = falseseperti yang telah kami lakukan sebelumnya).

Solusi untuk kegilaan ini:

Dengan menambahkan prefersStatusBarHidden()seperti di bawah ini, Anda dapat secara terprogram mengontrol menyembunyikan dan menampilkan bilah status tanpa menambahkan UIViewControllerBasedStatusBarAppearancepengaturan ke info Anda. Daftar :

var showStatusBar = true

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

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

kemudian gunakan seperti ini di seluruh kode Anda:

//Hide Status Bar
showStatusBar(false)

ATAU

//Show Status Bar
showStatusBar(true)
CodeOverRide
sumber
1
Apakah prefersStatusBarHiddenmenelepon itu masuk akal? Saya kira maksud Anda self.setNeedsStatusBarAppearanceUpdate()setelah showStatusBarpenugasan
Leo
Ini benar-benar gila, bukan? Apa API yang menyedihkan ini, dan sudah begitu lama. Hal semacam ini membuat pengembangan iOS sangat membuat frustasi.
Womble
@ Womble, ya dan itu bisa sangat rumit juga. Mudah-mudahan Swift 3.0 memiliki perpustakaan yang lebih baik dan dukungan seperti yang pertama kali dilihat, itu akan berubah banyak dari swift 2.3 ... memecahkan barang-barang.
CodeOverRide
Alih-alih memanggil prefersStatusBarHidden dari metode Anda, Anda dapat memanggil setNeedsStatusBarAppearanceUpdate
Oscar
4

Hanya untuk menambahkan, ketika mengganti prefersStatusBarHiddenmetode atau variabel, View controller-based status bar appearancedi Info.plist harus YA, jika tidak maka pengesampingan tidak akan berpengaruh

Huanyan
sumber
4

di Swift 4.2 ini adalah properti sekarang.

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

Dalam kasus saya, saya mencari bilah status untuk disembunyikan / ditampilkan sesuai permintaan; bukannya hanya ketika tampilan dimuat atau menghilang.

cepat 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
sumber
3

Swift 5: Di pengontrol tampilan utama, atau pengontrol navigasi utama jika Anda punya,

    override var preferredStatusBarStyle: UIStatusBarStyle {
        return .lightContent
    }

    override var prefersStatusBarHidden: Bool {
        return false
    }

Dan "Lihat tampilan status berbasis pengontrol" di plist harus YA, jika tidak kode di atas tidak akan dipanggil.

Jika Anda ingin menyembunyikan bilah status saat meluncurkan aplikasi, "Bilah status pada awalnya disembunyikan" di daftar harus YA. Ini dapat mencegah gambar peluncuran terdistorsi ketika bilah biru ekstra muncul di bagian atas layar.

Sam Xu
sumber
2

Solusi yang bekerja untuk saya; jika Anda ingin menyembunyikan bilah status pada pengontrol tampilan tertentu saat memuat:

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

Perhatian: jika Anda mengatur kunci " Lihat tampilan bilah status berbasis pengontrol " menjadi " TIDAK " di info Anda. Daftar kode di atas tidak berfungsi. Anda harus mengatur kunci ke " YA " atau menghapusnya dari info.plist

andre_hold
sumber
Anda tidak dapat mengganti properti hideStatusBar karena ini adalah properti yang disimpan! Anda bisa memilih nama lain dan animasi Anda akan berfungsi.
XcodeNOOB
2

Dalam proyek Anda Umum-> Info Penerapan-> Gaya bilah status pilih tanda centang Sembunyikan bilah status Catatan: - menyembunyikan bilah status di seluruh aplikasi

Sweta Vani
sumber
1
Ini bekerja untuk saya (ios 12), di mana jawaban plist tidak.
threeve
2

Untuk Swift 4+ coba kode berikut (diuji pada 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
sumber
2

Swift 5+

Dalam kasus saya, saya perlu memperbarui bilah status yang disembunyikan berdasarkan beberapa kondisi.

Karena itu, saya membuat pengendali basis BaseViewControlleryang berisi properti baruhideStatusBar .

Pengontrol tampilan lainnya adalah sub-kelas dari pengontrol dasar ini. Akhirnya ketika saya ingin memperbarui perilaku bilah status, saya hanya perlu mengubah hideStatusBarnilai ini .

class BaseViewController: UIViewController {

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

    override var prefersStatusBarHidden: Bool {
           return hideStatusBar
    }
}

Cara Penggunaan

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

Ini demo, saya menggunakan UIView.animate(...)untuk membuat transisi lebih mulus.

masukkan deskripsi gambar di sini

nahung89
sumber
1

Saya menggunakan Xcode 8.1 (8B62) dengan target penyebaran yang ditetapkan ke 10.1 dan saya tidak terlalu beruntung dengan opsi penggantian yang disebutkan di atas. Namun memeriksa opsi "Sembunyikan bilah status" di Info Penerapan melakukan trik untuk saya.

Proyek> Umum

Saya harap ini membantu.

danmerfeld
sumber
1

Jika Anda menghadirkan pengontrol tampilan secara modal, coba

viewController.hidesBottomBarWhenPushed = true
viewController.modalPresentationCapturesStatusBarAppearance = true
YannSteph
sumber
0
func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {
        application.isStatusBarHidden = true
        return true
    }
Prasad Bulbule
sumber
4
Saat menjawab pertanyaan, tolong jelaskan jawaban Anda, cuplikan kode bukan jawaban yang tepat.
LazerBanana
0

Anda dapat menggunakan kode ini di ViewController Class scope

open override var prefersStatusBarHidden: Bool { return true }
Sajjad
sumber
Terima kasih atas jawabannya, apakah Anda mau sedikit lebih rumit. Di mana tepatnya dia harus menambahkan baris kode dan mengapa ini bisa berhasil? Lihat bagian Bagaimana saya menulis jawaban yang baik .
9953-div-37
0

Dalam Proyek Anda-> Umum-> Info penerapan

Gaya Statusbar: -

baru saja ditandai Sembunyikan bilah status (iOS 10)

VD Purohit
sumber
0

Cepat 4

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

//MARK:- Hide Status Bar
UIApplication.shared.isStatusBarHidden = true
Shakeel Ahmed
sumber
ok untuk sekarang saya tidak punya ios 12 saya punya 11,4 ketika pembaruannya saya akan memperbaikinya juga, juga jika Anda memiliki teamviewer saya akan datang dan memperbaikinya pada sistem Anda
Shakeel Ahmed
itu ditinggalkan
Vyachaslav Gerchicov
0

Diperbarui untuk iOS 13 dan Swift 5

Jika tidak ada jawaban di atas yang berfungsi untuk Anda. Periksa daftar Anda untuk melihat apakah Anda memiliki ini:

"Lihat tampilan bilah status berbasis pengontrol"

Jika demikian, pastikan untuk mengaturnya ke YA !!!!!

Kemudian kode berikut akan berfungsi.

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