Cara mengatur Gaya Bar Status di Swift 3

186

Saya menggunakan Xcode 8.0 beta 4.

Dalam versi sebelumnya, UIViewController memiliki metode untuk mengatur gaya status bar

public func preferredStatusBarStyle() -> UIStatusBarStyle

Namun, saya menemukan itu berubah menjadi "Get ONLY varaiable" di Swift 3.

public var preferredStatusBarStyle: UIStatusBarStyle { get } 

Bagaimana cara menyediakan gaya untuk digunakan di UIViewController saya?

Willjay
sumber
coba var ini preferStatusBarStyle: UIStatusBarStyle = .lightContent
Anbu.Karthik

Jawaban:

485

[DIPERBARUI] Untuk Xcode 10+ & Swift 4.2+

Ini adalah metode yang disukai untuk iOS 7 dan lebih tinggi

Di aplikasi Anda Info.plist, setel View controller-based status bar appearanceke YES.

Override preferredStatusBarStyle ( Apple docs ) di setiap pengontrol tampilan Anda. Sebagai contoh:

override var preferredStatusBarStyle: UIStatusBarStyle {     
      return .lightContent
}

Jika Anda telah preferredStatusBarStylemengembalikan gaya bilah status pilihan yang berbeda berdasarkan pada sesuatu yang berubah di dalam pengontrol tampilan Anda (misalnya, apakah posisi gulir atau apakah gambar yang ditampilkan gelap), maka Anda akan ingin memanggil setNeedsStatusBarAppearanceUpdate()ketika keadaan itu berubah.

iOS sebelum versi 7, metode usang

Apple telah menghentikan ini , sehingga akan dihapus di masa depan. Gunakan metode di atas sehingga Anda tidak perlu menulis ulang ketika versi iOS berikutnya dirilis.

Jika aplikasi Anda akan mendukung Dalam aplikasi Anda Info.plist, atur View controller-based status bar appearanceke NO.

Di appDelegate.swift, didFinishLaunchingWithOptionsfungsinya, tambahkan:

UIApplication.shared.statusBarStyle = .lightContent

Untuk Pengontrol Navigasi

Jika Anda menggunakan pengontrol navigasi dan Anda ingin gaya bilah status yang disukai dari setiap pengontrol tampilan digunakan dan diatur View controller-based status bar appearanceke YESdalam aplikasi Andainfo.plist

extension UINavigationController {
   open override var preferredStatusBarStyle: UIStatusBarStyle {
      return topViewController?.preferredStatusBarStyle ?? .default
   }
}
PRAVEEN
sumber
3
Bekerja untukku. Lupa untuk memasukkan pengaturan baru ke Info.plist terlebih dahulu.
falsecrypt
1
@LightMan status uiapplicationBarStyle tidak ditinggalkan, saya menggunakan ini di iOS 11 dan berfungsi.
Sushobhit
1
@Sushobhit setStatusBarStyle sudah tidak digunakan lagi di iOS 9, seperti yang digunakan dalam jawaban ini. Tetapi Anda masih memiliki UIApplication.statusBarStyle sebagai properti hanya baca.
LightMan
1
Ada saat-saat di mana Anda ingin dapat mengaturnya secara terprogram karena warna dari setiap tampilan.
Alejandro Cavazos
9
Anda juga dapat menghapus baris di appDelegate.swift dan pergi ke Target -> General -> Info Penerapan -> Status Bar Style -> Light
Robert Veringa
162

Pembaruan Terbaru (Xcode 10+ / Swift 4.2+)

Artikel ini dibiarkan utuh bagi siapa pun yang mau memahami logika di balik berbagai pendekatan yang ada selama beberapa tahun terakhir. Sementara itu, pada Xcode 10, pendekatan pertama Swift 4.2 sudah usang dan tidak lagi didukung (yaitu tidak akan berlaku jika Anda mencoba menggunakannya). Masih merujuk pada informasi Anda untuk lebih memahami alasan di balik Plist.infobendera dan praktik penyesuaian.

Klarifikasi penting

Sangat penting untuk memahami dua pendekatan untuk menyesuaikan tampilan status bar. Mereka berbeda dan tidak boleh dicampur.

Pendekatan pertama - satu warna untuk seluruh aplikasi (DIPERKIRAKAN sejak iOS7)

Di info.plist Anda menemukan atau membuat kunci bernama

View controller-based status bar appearance

dan atur ke NO .

Apa itu? Ini pada dasarnya menetapkan pengaturan yang mengatakan bahwa dalam aplikasi Anda, tampilan bilah status tidak ditentukan secara individual oleh setiap pengontrol tampilan . Ini sangat penting untuk dipahami. Ini berarti Anda memiliki pengaturan seragam untuk seluruh aplikasi, untuk semua layar. Ada dua pengaturan:, defaultyang merupakan teks hitam dengan latar belakang putih, atau lightContent, yang merupakan teks putih dengan latar belakang hitam.

Untuk mengatur salah satu dari ini ( satu pengaturan untuk semua layar ):

func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {
    application.statusBarStyle = .lightContent // .default
    return true
}

Dengan cara ini Anda tidak perlu membangun kembali pengaturan ini pada setiap pengontrol tampilan. Namun, Anda selalu dapat menggunakan metode ini untuk mengubah penampilan secara sukarela.

Pendekatan kedua - warna individual untuk setiap pengontrol tampilan

Ini kebalikannya. Untuk membuatnya bekerja, silakan ke info.plist dan atur

View controller-based status bar appearance

ke YA

Dengan cara ini, setiap kali controller tampilan baru terbuka, gaya bilah status diatur secara individual jika Anda memasukkan implementasi ini dalam setiap UIViewControllerinstance yang Anda butuhkan:

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

Anda memiliki yang sama seperti di pertama, mengatur gaya gelap atau terang untuk statusbar, masing-masing untuk setiap pengontrol tampilan.

Properti ini diambil oleh UIKit dalam dua skenario:

  1. Setelah inisialisasi layar, ketika UI sedang dipersiapkan.
  2. Setelah memanggil setNeedsStatusBarAppearanceUpdate()kode.

Dalam kasus terakhir, Anda berhak memanipulasi tampilan statusbar dengan kode berikut:

var isDark = false {
    didSet {
        setNeedsStatusBarAppearanceUpdate()
    }
}

override var preferredStatusBarStyle: UIStatusBarStyle {
    return isDark ? .lightContent : .default
}

func toggleAppearance() {
   isDark.toggle()
}

Lalu, setiap kali Anda menelepon toggleAppearance(), perubahan gaya statusbar akan dipicu.

Pendekatan ketiga - Retas!

Ada peretasan yang memungkinkan untuk mengakses statusbar secara langsung:

func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {
    
    if let statusBar = UIApplication.shared.value(forKey: "statusBar") as? UIView {
        statusBar.backgroundColor = UIColor.blue
    }
    
    return true
}

Mengapa hack Jika Anda membutuhkan warna bilah status selain hitam atau putih, Anda menggunakan API tidak berdokumen. Anda mendapatkan statusBarobjek menggunakan KVC dan mengatur warna latar belakangnya. Objek yang Anda dapatkan dengan cara ini adalah UIStatusBar, yang berasal dari UIViewdan dengan demikian secara alami mendukung backgroundColorproperti. Ini kotor, bukan cara hukum, tapi sejauh ini satu-satunya cara untuk mengatur warna khusus untuk statusbar (tidak memperhitungkan UINavigationBarpendekatan akun , yang memungkinkan untuk menyesuaikan tampilan navbar + statusbar sama sekali). Ini mungkin menyebabkan aplikasi Anda ditolak. Tapi mungkin Anda beruntung. Dan jika Anda, dalam keadaan kompleks tertentu (seperti hierarki bersarang, navigasi anak, dan pengontrol tampilan) ini mungkin satu-satunya cara, atau setidaknya cara yang kurang sulit untuk menyesuaikan tampilan statusbar (misalnya, untuk membuatnya transparan)

Xcode 10+, Swift 4.2

Tidak ada alternatif lagi: pengembang harus membiarkan setiap pengontrol tampilan menentukan tampilan statusbar, dengan mengatur bendera ke YA (atau menghilangkan tindakan ini, karena YA secara default) dan mengikuti instruksi di atas.


Bonus

Solusi berbasis peretasan yang mungkin (walaupun tidak dianjurkan) Anda gunakan dalam keadaan yang rumit untuk mengubah tampilan statusbar secara sukarela pada tahap apa pun. Dari segi warna, metode ekstensi berikut ini melakukan apa yang bisa Anda lakukan dengan pendekatan reguler. Anda dapat menyesuaikannya dengan kebutuhan Anda.

extension UIViewController {
    func setStatusBarStyle(_ style: UIStatusBarStyle) {
        if let statusBar = UIApplication.shared.value(forKey: "statusBar") as? UIView {
            statusBar.backgroundColor = style == .lightContent ? UIColor.black : .white
            statusBar.setValue(style == .lightContent ? UIColor.white : .black, forKey: "foregroundColor")
        }
    }
}
Hexfire
sumber
2
Setelah Anda memiliki bilah status, Anda juga bisa melakukan ini: statusBar.setValue (UIColor.red, forKey: "foregroundColor"); atau gunakan kunci apa pun yang ada untuk mengatur properti apa pun yang tersedia untuk UIStatusBar tetapi tidak untuk UIView
Mark
application.statusBarStyle = .lightContent pendekatan ini umumnya karena iOS9> Setter untuk 'statusBarStyle' sudah tidak digunakan lagi di iOS 9.0: Gunakan - [UIViewController preferstatusBarStyle] tunggu untuk pergi adalah untuk UIViewController
toxicsun
Ini adalah satu-satunya yang berfungsi di sini saat mengubah tema warna aplikasi. Namun, tampaknya, setelah ini diatur, Anda selalu harus mengatur ulang ketika beralih pengontrol tampilan. Metode preferStatusBarStyle () diabaikan sejak saat ini (bahkan dengan pengaturan yang tepat di info.plist).
otomatis
2
Jawaban ini lebih deskriptif dibandingkan dengan yang lain.
ViruMax
2
Solusi bonus rusak di iOS 13.1
ViruMax
130

Anda bisa mencoba menimpa nilai yang dikembalikan, daripada mengaturnya. Metode ini dinyatakan sebagai {get}, jadi sediakan saja pengambil:

 override var preferredStatusBarStyle: UIStatusBarStyle {
    return .lightContent
}

Jika Anda mengatur ini secara kondisional, Anda harus menelepon setNeedsStatusBarAppearanceUpdate()sehingga akan menghidupkan perubahan saat Anda siap

Abizern
sumber
2
Ini adalah pendekatan yang lebih baik karena Anda dapat memilih prefersStatusBarHiddenuntuk beberapa pandangan Anda. Jika Anda pergi dengan UIApplication.shared.statusBarStyleAnda akan terjebak dengan itu.
superarts.org
105

Swift 3 & 4, iOS 10 & 11, Xcode 9 & 10
Bagi saya, metode ini tidak berfungsi:

override var preferredStatusBarStyle: UIStatusBarStyle {
    return .lightContent
}

ketika saya menggunakan masing-masing view controller, tetapi ini berhasil:

  • Dalam info.list file, tambahkan baris: View controller-based status bar appearancedan atur keNO

  • Berikutnya di delegasi:

    UIApplication.shared.statusBarStyle = .lightContent
Gracu
sumber
Saya mencoba hanya setelah menambahkan kode ke delegasi aplikasi, tetapi pengaturan info daftar sangat membantu bagi saya. Terima kasih
Akhilesh Sharma
6
Setter untuk 'statusBarStyle' sudah tidak digunakan lagi di iOS 9.0: Gunakan - [UIViewController diutamakanStatusBarStyle]
Reimond Hill
33

Jika Anda ingin mengubah statusBarwarna menjadi putih, untuk semua tampilan yang ada dalam a UINavigationController, tambahkan ini di dalamnya AppDelegate:

func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {
    // Override point for customization after application launch.

    UINavigationBar.appearance().barStyle = .blackOpaque
    return true
}

Kode ini:

override var preferredStatusBarStyle: UIStatusBarStyle {
    return .lightContent
}

tidak bekerja untuk UIViewControllersyang terkandung dalam UINavigationController, karena compiler terlihat untuk statusBarStylesatu UINavigationController, bukan untuk statusBarStyleyang ViewControllersdikandung oleh itu.

Semoga ini bisa membantu mereka yang belum berhasil dengan jawaban yang diterima!

Tuan Xcoder
sumber
Ya terima kasih banyak! Kontroler navigasi sedikit bernuansa yang tidak dipertimbangkan banyak orang!
Alexis Candelaria
26

Jika Anda ingin mengubah gaya bilah status kapan saja setelah tampilan muncul, Anda dapat menggunakan ini:

  • Dalam file info.list tambahkan baris: Lihat tampilan bilah status berbasis pengontrol dan atur ke YES

    var viewIsDark = Bool()
    
    func makeViewDark() {
    
        viewIsDark = true
        setNeedsStatusBarAppearanceUpdate()
    }
    
    func makeViewLight() {
    
        viewIsDark = false
        setNeedsStatusBarAppearanceUpdate()
    }
    
    override var preferredStatusBarStyle: UIStatusBarStyle {
    
        if viewIsDark {
            return .lightContent 
        } else {
            return .default 
        } 
    }
alex de oliveira
sumber
1
DanIf you call this method within an animation block, the changes are animated along with the rest of the animation block.
Alexandre G
26

Xcode 10 atau lebih baru

Diuji dalam Swift 5

Tidak diperlukan kode, cukup ikuti langkah-langkah di bawah ini.

Jika Anda ingin mengubah bilah status di seluruh aplikasi.

  1. Pilih Project dari Project Navigator (panel sisi kiri).
  2. Pilih target.
  3. Pilih tab Umum.
  4. Temukan info Penerapan.
  5. Ubah gaya bilah status menjadi Terang (untuk latar belakang "Light" gelap , Latar belakang terang "Default" )

Jangan lupa perubahan info.plist

  1. Pilih tab Info
  2. Tambahkan kunci ini ke file plist Anda "Lihat tampilan bilah status berbasis pengontrol" = TIDAK

Jalankan proyek Anda dan periksa.

Proyek saya di swift 5 dan Xcode 10.2 & 11.0

Vivek
sumber
Untuk Xcode 10 / Swift5 ini harus menjadi jawaban yang diterima. Anda harus melakukan KEDUA langkah agar ini berfungsi.
John Robi
Sempurna. Terima kasih! Saya setuju bahwa ini seharusnya jawaban yang sebenarnya diterima.
DungeonDev
Ini adalah jawaban sempurna 🤟🏻
nikhilgohil11
Ini benar-benar berfungsi juga untuk xcode 11 dengan cepat 5, terima kasih
Luis Santiago
25

Anda perlu menambahkan kunci di bawah ini dalam file Info.plist Anda:

View controller-based status bar appearance dengan nilai boolean diatur ke NO

Di kelas appdelegate Anda, dalam didFinishLaunchingWithOptionsmetode sebelum kembali.

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

berubah backgroundColordan statusBarStylesesuai kebutuhan.

Himanshu padia
sumber
Solusi yang bagus, tetapi apakah ini termasuk menggunakan API pribadi?
GoldenJoe
Bekerja dengan baik tetapi bagaimana saya bisa berubah ke warna kustom saya?
iSrinivasan27
@MohanSrinivasan alih-alih "UIColor.red" Anda dapat menentukan warna khusus Anda.
Himanshu padia
13

Anda juga dapat melakukan ini di storyboard

  1. Buat entri baru di info.plist "Lihat tampilan bilah status berbasis pengontrol" setel ke "YA".
  2. Buka papan cerita Anda dan kemudian pilih pengontrol navigasi yang ingin Anda ubah. Klik pada bilah navigasi dari bagian garis besar dokumen Storyboard (panel kiri pada storyboard)
  3. Buka panel kanan dan klik bagian atribut
  4. Di bawah bagian Bilah Navigasi Anda akan melihat gaya. Pilih gaya yang Anda inginkan (default untuk hitam dan hitam untuk putih)

Anda harus melakukan ini untuk setiap pengontrol navigasi yang Anda miliki. Namun, setiap tampilan di bawah pengontrol navigasi akan mengubah semua gaya / warna bilah status tampilan menjadi yang baru saja Anda pilih. Saya menemukan opsi ini lebih baik karena Anda dapat melihat hasil Anda secara instan dan tidak perlu menambahkan baris kode tambahan di setiap pengontrol tampilan.

masukkan deskripsi gambar di sini

(Selesai dengan Xcode 8.3.3 di semua proyek Swift)

Bryan Norden
sumber
"Lihat tampilan bilah status berbasis pengontrol" harus diatur ke "TIDAK"
Willjay
2
Cara yang sangat bersih untuk mengatur gaya bilah status sesuai dengan konten View Controller, yang merupakan cara yang benar alih-alih hanya pengaturan View controller-based status bar appearance = NOdan harus menggunakan hanya gaya terang atau gelap di seluruh aplikasi. Sayang sekali bahwa cara "Tanpa Kode" ini hanya berfungsi di Navigasi Kontroler, Apple harus mempertimbangkan untuk menambahkan bidang lain untuk mengatur opsi ini di dalam instance Lihat Kontrol.
aldoram5
12

Bagi orang yang ingin mengubah bilah status untuk semua viewcontrollers di: iOS 11, solusi Swfit 4/5 cukup mudah.

1) Info.plist tambahkan:

Lihat tampilan bilah status berbasis pengontrol -> NO

2) Sisi kiri proyek slect XCode> Target > Pilih proyek Anda> Di bawah Umum> Info Penerapan> Pilih Status Bar Style: Light

Jika Anda ingin mengubah bilah status hanya untuk satu viewcontroller , di viewDidLoad tambahkan:

2.1 ) Info.plist

Lihat tampilan bilah status berbasis pengontrol -> YES

2.2 )

override var preferredStatusBarStyle : UIStatusBarStyle {
    return .lightContent
}

Objective-C (atau reaksi asli) yang berubah dari Delegasi Aplikasi:

1) Info.plist tambahkan:

Lihat tampilan bilah status berbasis pengontrol -> NO

2) AppDelegate -> didFinishLaunchingWithOptions

[[UIApplication sharedApplication] setStatusBarHidden:NO animated:YES];
[[UIApplication sharedApplication] setStatusBarStyle:UIStatusBarStyleDarkContent animated:YES];

Mengubah bilah status tidak berfungsi mencoba melakukan push (pengontrol navigasi), hanya pada penyajian pengendali tampilan secara moderat.

Doci
sumber
8

Langkah pertama Anda perlu menambahkan baris dengan kunci: View controller-based status bar appearancedan nilai NOke Info.plistfile. Setelah itu, tambahkan 2 fungsi di controller Anda untuk spesifik hanya controller yang akan berpengaruh:

override func viewWillAppear(_ animated: Bool) {
       super.viewWillAppear(animated)
       UIApplication.shared.statusBarStyle = .lightContent
}

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

Cepat 3

Di Info.plist tambahkan baris yang disebut "Lihat tampilan status bar berbasis pengontrol" dan tetapkan nilainya No.

class YourViewController: UIViewController {

    override func viewDidLoad() {
        super.viewDidLoad()

        UIApplication.shared.statusBarStyle = .lightContent //or .default
        setNeedsStatusBarAppearanceUpdate()

    }

}
Anda adalah pelayan wanita
sumber
6

Tampaknya ada masalah kecil tentang warna teks bilah status ketika berhadapan dengan bilah navigasi.

Jika Anda ingin tampilan .plist entri tampilan status berbasis pengontrol ditetapkan YES, kadang-kadang tidak akan berfungsi ketika Anda memiliki nav bar berwarna.

Sebagai contoh:

override func viewWillAppear(_ animated: Bool) {
    let nav = self.navigationController?.navigationBar
    nav?.barTintColor = .red
    nav?.tintColor = .white
    nav?.titleTextAttributes = [NSAttributedStringKey.foregroundColor: UIColor.white]
    setNeedsStatusBarAppearanceUpdate()
}

dan

override var preferredStatusBarStyle: UIStatusBarStyle {return .lightContent}

Kode di atas tidak akan berfungsi bahkan jika Anda telah menetapkan yang berikut di AppDelegate:

UIApplication.shared.statusBarStyle = .lightContent

Bagi mereka yang masih berjuang, tampaknya entah bagaimana menilai apakah bilah status harus terang atau gelap oleh gaya di bilah nav. Jadi, saya berhasil memperbaikinya dengan menambahkan baris berikut di viewWillAppear:

nav?.barStyle = UIBarStyle.black

Ketika gaya bar berwarna hitam, maka itu mendengarkan variabel yang diganti. Semoga ini bisa membantu seseorang :)

nCr78
sumber
6

Untuk menambah asnwer hebat dengan @Krunal https://stackoverflow.com/a/49552326/4697535

Jika Anda menggunakan UINavigationController, tidak preferredStatusBarStyleakan berpengaruh pada UIViewController.

Xcode 10 dan Swift 4.

Tetapkan kebiasaan UINavigationController

Contoh:

class LightNavigationController: UINavigationController {

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

Gunakan ekstensi untuk solusi tingkat aplikasi:

extension UINavigationController {

  open override var preferredStatusBarStyle: UIStatusBarStyle {
      guard let index = tabBarController?.selectedIndex else { return .default }
      switch index {
      case 0, 1, 2: return .lightContent // set lightContent for tabs 0-2
      default: return .default // set dark for tab 3
      }
  }
}
Tal Zion
sumber
5

Xcode 8.3.1, Swift 3.1

  1. Buat entri baru di info.plist "Lihat tampilan bilah status berbasis pengontrol" setel ke "TIDAK".

  2. Buka AppDelegate.swift dan tambahkan baris ini dalam metode "didFinishLaunchingWithOptions":

application.statusBarStyle = .lightContent

joemalski
sumber
5

Swift 4+

untuk teks statusbar putih:

navigationController.navigationBar.barStyle = .blackTranslucent
Alfi
sumber
5

Berikut adalah Panduan / Instruksi Apple tentang perubahan gaya bilah status.

Jika Anda ingin mengatur gaya bilah status, tingkat aplikasi kemudian diatur UIViewControllerBasedStatusBarAppearanceke NOdalam .plistfile Anda . Dan di appdelegate> didFinishLaunchingWithOptionstambah in mengikuti Anda (secara program Anda dapat melakukannya dari delegasi aplikasi).

Tujuan C

[UIApplication sharedApplication] setStatusBarStyle:UIStatusBarStyleLightContent animated:YES];

Cepat

func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {
    application.statusBarStyle = .lightContent
    return true
}

jika Anda ingin mengatur gaya bilah status, pada tingkat pengontrol tampilan lalu ikuti langkah-langkah ini:

  1. Setel UIViewControllerBasedStatusBarAppearanceke YESdalam .plistfile, jika Anda perlu mengatur gaya bilah status di level UIViewController saja.
  2. Dalam fungsi add viewDidLoad - setNeedsStatusBarAppearanceUpdate

  3. menimpa preferStatusBarStyle di pengontrol tampilan Anda.

Tujuan C

- (void)viewDidLoad
{
    [super viewDidLoad];
    [self setNeedsStatusBarAppearanceUpdate];
}

- (UIStatusBarStyle)preferredStatusBarStyle
{
    return UIStatusBarStyleLightContent;
}

Cepat

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

override var preferredStatusBarStyle: UIStatusBarStyle {
    return .lightContent
}

Tetapkan nilai .plist sesuai dengan tingkat pengaturan gaya bilah status.

masukkan deskripsi gambar di sini

Krunal
sumber
4

Swift 4.0 Silakan gunakan kode ini di "didFinishLaunchingWithOptions launchOptions:" Appdelegate class

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

iOS 11.2

func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {
    // Override point for customization after application launch.

    UINavigationBar.appearance().barStyle = .black

    return true
}
Satish Babariya
sumber
'blackOpaque' tidak tersedia: Gunakan UIStatusBarStyleLightContent
Makalele
3

Ini berhasil untuk saya

Atur View controller-based status barpenampilan menjadi NO di dalam daftar kemudian In UIViewController viewDidAppearbaru saja menambahkan baris berikut

UIApplication.shared.setStatusBarStyle(UIStatusBarStyle.lightContent, animated: true)
Anshad Rasheed
sumber
setStatusBarStyle sudah tidak digunakan lagi di iOS 9.
Lastmboy
3

cepat 3

jika Lihat tampilan bilah status berbasis pengontrol = YES di Info.plist

kemudian gunakan ekstensi ini untuk semua NavigationController

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

jika tidak ada UINavigationController dan hanya memiliki UIViewController kemudian gunakan kode di bawah ini:

    extension UIViewController
    {
        override open var preferredStatusBarStyle: UIStatusBarStyle {
        return .lightContent
         }
     }
Datt Patel
sumber
2
Tidak bekerja untuk saya. Saya mendapatkan kesalahan "Properti tidak mengesampingkan properti apa pun dari superclass" dan "Getter untuk 'preferStatusBarStyle' dengan pemilih Objective-C konflik 'preferStatusBarStyle' konflik dengan deklarasi sebelumnya dengan pemilih Objective-C yang sama".
Theo
Terima kasih untuk ini, setelah 20 upaya berbeda dan beberapa kombinasi item untuk dicoba ini adalah cara untuk mengatur warna bilah status. Saya hanya perlu mengingat untuk memanggil setNeedsStatusBarAppearanceUpdate () ketika saya ingin mengubah warna karena saya menambahkan dalam mode malam dan hitam pada hitam tidak berfungsi.
Stuart P.
3

Cepat 5

Untuk menambahkan lebih detail untuk jawaban PRAVEEN di https://stackoverflow.com/a/40066798/2082851 , saya ingin memberikan implementasi saya. Ini mendukung fleksibilitas untuk menyesuaikan bilah status setiap pengontrol.

Secara keseluruhan, kami akan membuat BaseViewControlleryang menangani statusBarStyleproperti dalam semua kasus. Saat Anda membuat pengontrol baru, jadikan sebagai subkelas pengontrol dasar ini.

Kapan pun Anda ingin mengubah tampilan status, Anda hanya perlu memperbarui properti ini. Gaya bilah status akan segera diperbarui.

Penerapan

class BaseViewController: UIViewController {

    var statusBarStyle: UIStatusBarStyle = .default {
        didSet {
            setNeedsStatusBarAppearanceUpdate()
        }
    }

    override var preferredStatusBarStyle: UIStatusBarStyle {
        return statusBarStyle
    }
}

Demo

class ViewController: BaseViewController, UIScrollViewDelegate {

    let scrollView = UIScrollView()
    ... 
    func scrollViewDidScroll(_ scrollView: UIScrollView) {
        UIView.animate(withDuration: 0.3) {
            if scrollView.contentOffset.y > 30 {
                self.statusBarStyle = .darkContent
            } else {
                self.statusBarStyle = .lightContent
            }
        }
    }
}

masukkan deskripsi gambar di sini

2. UINavigationController

Sebab UINavigationController, ini adalah kasus khusus, yang dapat Anda ikuti salah satu solusi:

Solusi A: Ganti dengan pengiriman pesan

Karena UINavigationController adalah NSObjectdan mewarisi dari ObjectiveC, metodenya adalah message dispatchdan Anda dapat menimpanya.

extension UINavigationController {
   open override var preferredStatusBarStyle: UIStatusBarStyle {
      return topViewController?.preferredStatusBarStyle ?? .default
   }
}

Solusi B: Buat UINavigationControllersubkelas

Jika Anda sudah memiliki kebiasaan UINavigationController(yang biasanya perlu mengontrol lebih banyak persyaratan), ini adalah solusi terbaik untuk Anda.

final class NavigationController: UINavigationController {
    override var preferredStatusBarStyle: UIStatusBarStyle {
        return topViewController?.preferredStatusBarStyle ?? super.preferredStatusBarStyle
    }
}
nahung89
sumber
2

Anda dapat menggunakan properti bool bernama "shouldStatusBarDark" untuk mengganti warna bilah status Anda. Dan Anda juga dapat memperbarui nilainya untuk mengubah warna bilah status saat Anda menggulir.

 var shouldStatusBarDark = false {
     didSet {
         setNeedsStatusBarAppearanceUpdate()
     }
 }

 override var preferredStatusBarStyle: UIStatusBarStyle {
     return shouldStatusBarDark ? .default : .lightContent
 }

 func scrollViewDidScroll(_ scrollView: UIScrollView) {
     let offSetY = scrollView.contentOffset.y
     if offSetY > 50 {
         UIView.animate(withDuration: 0.4, animations: {
             self.navView.alpha = 1
             self.shouldStatusBarDark = true
         })
     } else {
         UIView.animate(withDuration: 0.4, animations: {
             self.navView.alpha = 0
             self.shouldStatusBarDark = false
         })
     }
 }
tiantong
sumber
apa properti navView? terima kasih telah membagikan solusi Anda
medskill
1
@medskill navView hanyalah bilah navigasi mimik yang ditambahkan secara terprogram.
tiantong
2

Sebagian besar jawaban ini adalah hal yang sama hash, tetapi tidak ada yang benar-benar membahas layar peluncuran untuk saya ketika menggunakan latar belakang gelap.

Saya menyiasatinya dengan yang berikut ini info.plistyang menghasilkan status bar cahaya gaya.

<key>UIStatusBarStyle</key>
<string>UIStatusBarStyleLightContent</string>
CodeBender
sumber
2

Jika Anda menerima peringatan: Setter untuk 'statusBarStyle' sudah tidak digunakan lagi di iOS 9.0: Gunakan - [UIViewController preferStatusBarStyle] , lalu untuk mengatur bilah status ke terang atau gelap gunakan kode berikut:

//To set the status bar to white
self.navigationController?.navigationBar.barStyle = .black //or .blackTranslucent

//To set the status bar to black
self.navigationController?.navigationBar.barStyle = .default

Ini tidak akan membuat navBar Anda mengubahnya, ini murni menunjukkan gaya dan karenanya mengubah bilah status sesuai.

NB. Anda perlu memastikan bahwa Anda mengatur di info.plist Anda.

View controller-based status bar appearance to YES
Richard Hope
sumber
2

Jika Anda menggunakan presentasi modal, Anda perlu mengatur:

viewController.modalPresentationCapturesStatusBarAppearance = true
RomanMisnikov
sumber
1

Di iOS 13 Anda dapat menggunakan .darkContent UIStatusBarStyleproperti untuk menampilkan bilah status gelap

Hubert Fabisiak
sumber
1

Jika Anda masih tidak dapat mengubah basis gaya bar status pada metode

override var preferredStatusBarStyle: UIStatusBarStyle {
    return .lightContent
}

Anda dapat mencoba menggunakan metode ini:

override viewWillAppear(_ animated: Bool) {
    super.viewWillAppear(animated)
    navigationController?.navigationBar.barStyle = .black
}
Jin
sumber
0

Untuk tujuan C cukup tambahkan baris ini di aplikasi Anda metode didFinishLaunch

UIApplication.sharedApplication.statusBarStyle = UIStatusBarStyleLightContent;
Asfand Shabbir
sumber
3
Ini telah ditinggalkan sejak iOS 9
MK_Dev
0

menggunakan WebkitView

Swift 9.3 iOS 11.3

import UIKit
import WebKit

class ViewController: UIViewController, WKNavigationDelegate, WKUIDelegate {

    @IBOutlet weak var webView: WKWebView!
    var hideStatusBar = true

    override func loadView() {
        let webConfiguration = WKWebViewConfiguration()
        webView = WKWebView(frame: .zero, configuration: webConfiguration)
        webView.uiDelegate = self
        view = webView
    }

    override func viewDidLoad() {
        super.viewDidLoad()
        self.setNeedsStatusBarAppearanceUpdate()
        let myURL = URL(string: "https://www.apple.com/")
        let myRequest = URLRequest(url: myURL!)
        UIApplication.shared.statusBarView?.backgroundColor = UIColor.red

         webView.load(myRequest)

    }
}

extension UIApplication {

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

}
Laki-laki yang luar biasa
sumber
3
Cepat 9.3? Tahun yang salah, Marty
Unit iOS
Saya sarankan untuk tidak menggunakan API pribadi untuk exaple "statusBar". Apple membuat perubahan pada API setiap saat! Dan ketika apel mengubah API itu, aplikasi Anda mungkin macet dan itu tidak akan mengubah bilah status lagi. Ini akan membuat Anda mencari lagi solusi lain.
Doci