Mengubah Warna Bar Status untuk ViewControllers tertentu menggunakan Swift di iOS8

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

Menggunakan kode di atas dalam ViewController apa pun untuk mengatur warna statusBar ke Putih untuk viewcontroller tertentu tidak bekerja di iOS8 untuk saya . Ada saran? Menggunakan metode UIApplication. SharedApplication, warna berubah setelah perubahan yang diperlukan dalam Info.plist untuk seluruh aplikasi.

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

Bagaimana saya bisa membuat perubahan pada warna bilah status untuk beberapa ViewControllers yang diperlukan dan spesifik ?

Anuj
sumber

Jawaban:

350

Setelah membaca semua saran, dan mencoba beberapa hal, saya bisa membuatnya bekerja untuk viewcontrollers tertentu menggunakan langkah-langkah berikut:

Langkah pertama:

Buka info.plist Anda dan masukkan kunci baru bernama " Lihat tampilan status berbasis pengontrol " ke NO

Langkah Kedua (Hanya penjelasan, tidak perlu menerapkan ini):

Biasanya kami menempatkan kode berikut dalam aplikasi (_: didFinishLaunchingWithOptions :) metode AppDelegate,

Cepat 2

UIApplication.sharedApplication().statusBarStyle = .LightContent

Cepat 3

UIApplication.shared.statusBarStyle = .lightContent

tapi itu mempengaruhi statusBarStylesemua ViewControllers.

Jadi, bagaimana agar ini berfungsi untuk ViewControllers tertentu - Langkah Terakhir:

Buka file viewcontroller di mana Anda ingin mengubah statusBarStyledan memasukkan kode berikutviewWillAppear() ,

Cepat 2

UIApplication.sharedApplication().statusBarStyle = .LightContent

Cepat 3

UIApplication.shared.statusBarStyle = .lightContent

Juga, terapkan viewWillDisappear()metode untuk viewController tertentu dan letakkan baris kode berikut,

Cepat 2

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

}

Cepat 3

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

Langkah ini pertama-tama akan mengubah statusBarStyleuntuk viewcontroller tertentu dan kemudian mengubahnya kembali defaultketika viewcontroller tertentu menghilang. Tidak menerapkan viewWillDisappear()akan mengubah statusBarStylesecara permanen ke nilai baru yang ditentukanUIStatusBarStyle.LightContent

Anuj
sumber
4
Perhatikan bahwa jika Anda mengatur Status bar is initially hidden = YESfile info.plist, "Lihat tampilan status bar berbasis-controller = TIDAK" akan menyebabkan status bar menjadi tersembunyi.
xi.lin
13
Jika Anda mengubah kembali untuk UIStatusBarStyle.Defaultmenggunakan viewWillDisappear(), Anda harus menggunakan viewWillAppear()untuk menginisialisasi, daripada viewDidLoad().... jika Anda kembali ke tampilan itu tanpa harus memuat ulang, Anda tidak akan melihat apa yang StatusBarStyleAnda harapkan.
William GP
7
Untuk Swift 3: UIApplication.shared.statusBarStyle = .lightContent
ibrahimyilmaz
4
Masih belum jelas bagaimana Anda mengubah warna status bar
DoruChidean
4
Guys, sudah usang dari iOS 9
byJeevan
109

(Per 20 September 2019)

Swift 5 , Swift 4.2 , Swift 4

override func viewWillAppear(_ animated: Bool) {
    super.viewWillAppear(animated)
    setNeedsStatusBarAppearanceUpdate()
}
override var preferredStatusBarStyle: UIStatusBarStyle {
    .lightContent
}
BennyTheNerd
sumber
7
Pastikan untuk menelepon super.viewWillAppearjika Anda menyalin dan menempelkan kode ini
Stephen Silber
Diedit untuk memasukkan super.viewWillAppear (). Terima kasih @StephenSilber untuk tipnya!
BennyTheNerd
Anda harus menggantiStatusStyle yang disukai atau tidak akan berfungsi. terima kasih telah menunjukkan itu. +1
Alix
3
Menggunakan UIApplication.shared.statusBarStyle = .lightContenthasil dalam peringatan kompiler ini: Setter untuk 'statusBarStyle' sudah tidak digunakan lagi di iOS 9.0: Gunakan - [UIViewController
preferStatusBarStyle
3
Dalam Info.plist aplikasi Anda, atur "Lihat tampilan status bar berbasis pengontrol" ke YES
IvanPavliuk
31

Solusi Swift 4.2 dengan NavigationController

Langkah pertama:

Buka info.plist Anda dan masukkan kunci baru bernama " Lihat tampilan status berbasis pengontrol " atau UIViewControllerBasedStatusBarAppearanceke YA untuk membiarkan setiap VC menggunakan properti status mereka sendiri.

Tahap kedua

Di setiap VC, ganti propertiStatusBarStyle yang disukai seperti ini:

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

Langkah terakhir

Menimpa preferredStatusBarStyle properti di kustom NavigationController kelas Anda:

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
}
guillama
sumber
Ini hanya cara bagaimana mencapai hasil yang diharapkan dengan menggunakan Pengontrol Navigasi dan pengontrol Anda sendiri. Anda juga dapat melakukan cara ini untuk prefersStatusBarHidden seperti yang saya lakukan untuk proyek saya :)
atereshkov
29

Saya mengikuti tutorial ini dan itu berhasil untuk saya. Namun, saya tidak yakin apakah ada peringatan.

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

  • Buka info.plist Anda dan atur UIViewControllerBasedStatusBarAppearanceke false.
  • Di fungsi pertama AppDelegate.swift, yang berisi didFinishLaunchingWithOptions, atur warna yang Anda inginkan.

UIApplication.sharedApplication().statusBarStyle = UIStatusBarStyle.LightContent

  • Pembaruan Swift 3 *

    UIApplication.shared.statusBarStyle = .lightContent

chris_s
sumber
11
bagaimana itu spesifik untuk setiap tampilan controller
Yarneo
4
Tepat, ini untuk aplikasi lengkap, dan itu bukan pertanyaannya.
Anuj
3
Saya menggunakan iOS 8 Swift dan xCode 6.1.1 dan hanya mengikuti dua langkah ini tidak berhasil. Anda juga perlu menambahkan UIApplication.sharedApplication().statusBarHidden = falseke AppDelegate.swift didFinishLauchingWithOptions
Ahmad Amin
Ini mengaturnya untuk seluruh aplikasi. Untuk pengontrol tampilan tertentu, lihat jawaban pertama. Ini berhasil untuk saya.
Akshar Patel
Penyetel untuk 'statusBarStyle' sudah tidak digunakan lagi di iOS 9.0: Gunakan - [UIViewController diutamakanStatusBarStyle]
Oleksandr
22

Ada satu miliar jawaban di sini jadi saya pikir mengapa tidak menambahkan yang lain dalam bentuk ekstensi (dengan bantuan dari @ Cœur)

Cepat 3

Perpanjangan:

extension UIApplication {
    class var statusBarBackgroundColor: UIColor? {
        get {
            return (shared.value(forKey: "statusBar") as? UIView)?.backgroundColor
        } set {
            (shared.value(forKey: "statusBar") as? UIView)?.backgroundColor = newValue
        }
    }
}

Penerapan:

UIApplication.statusBarBackgroundColor = .blue
John R Perry
sumber
2
Harap perhatikan bahwa pendekatan ini dapat dianggap mengakses API pribadi, dan mungkin berarti aplikasi Anda akan ditolak oleh Apple.
JWhitey
Atau setidaknya itu tergantung pada detail implementasi Apple dan dapat rusak tanpa peringatan dengan perubahan di iOS.
Chris Prince
19

Di Info.plist Anda, Anda perlu menentukan tampilan status bar berbasis pengontrol untuk nilai apa pun.

Jika Anda mendefinisikannya YA maka Anda harus mengganti fungsi preferStatusBarStyle di setiap pengontrol tampilan.

Jika Anda mendefinisikannya TIDAK maka Anda dapat mengatur gaya di AppDelegate menggunakan

UIApplication.sharedApplication().setStatusBarStyle(UIStatusBarStyle.LightContent, animated: true)
Nikita Khandelwal
sumber
7
setStatusBarStyledihentikan di iOS 9.0
Jeffrey Neo
@ Jeffrey_Neo Meskipun itu benar saya tidak bisa mendapatkan penggantian untuk bekerja. Akan bermanfaat untuk melihat komentar Anda sebagai jawaban dengan kode yang berfungsi.
Dumbledad
15
override func viewWillAppear(animated: Bool) {
    self.navigationController?.navigationBarHidden =  true

    UIApplication.sharedApplication().statusBarHidden = false
    UIApplication.sharedApplication().statusBarStyle = .LightContent

    let statusBar: UIView = UIApplication.sharedApplication().valueForKey("statusBar") as! UIView
    if statusBar.respondsToSelector("setBackgroundColor:") {
        statusBar.backgroundColor = UIColor.redColor()
    }

}
AG
sumber
menggunakan valueForKey("statusBar")mungkin tidak sesuai dengan pedoman Apple
Cœur
15

Cepat 3

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

Itulah solusi untuk mengatur warna latar belakang bilah status untuk pengontrol tampilan tertentu.

Chris Tsitsaris
sumber
3
UIView selalu merespons backgroundColor di Swift.
Cœur
13

SWIFT 2

Saya berhasil mengubah tampilan latar belakang bilah status dengan menambahkan yang berikut di viewWillAppear saya:

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

    if statusBar.respondsToSelector(Selector("setBackgroundColor:")) {
        statusBar.backgroundColor = .redColor()
    }
AJ Hernandez
sumber
10

Menerapkan preferredStatusBarStyleseperti yang Anda sebutkan dan panggilan self.setNeedsStatusBarAppearanceUpdate()di ViewDidLoaddan juga dalam Info.plist set UIViewControllerBasedStatusBarAppearanceke YES(Ini YESsecara default)

Tidak jelas mengapa itu tidak berfungsi. Saya perlu memeriksa kode. Salah satu saran lainnya adalah masuk dengan kode yang berfungsi viewDidLoad UIApplication.sharedApplication().statusBarStyle = .LightContentdan ubah ini ke default ketika Anda melihat menghilang viewWillDisappear.

codester
sumber
Hanya menerapkan bagian pertama dari jawaban, berhasil untuk saya. Namun, saya tidak menambahkan UIViewcontrollerBasedStatusBarAppearance di Info.plist. Itu masih bekerja.
Akshar Patel
10

untuk cepat 3

. daftar

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
    }
Giang
sumber
1
Saya mencoba semua solusi ... ini hanya bekerja untuk saya !! Saya tidak tahu mengapa: D
Khaled Hayek
keberuntungan undian
Giang
Setter untuk 'isStatusBarHidden' sudah tidak digunakan lagi di iOS 9.0: Gunakan - [UIViewController preferersStatusBarHidden] ...
drew ..
9

Dalam situasi saya, saya menggunakan papan cerita untuk mengatur pengontrol tampilan saya. Saya ingin mengubah semua gaya bilah status.

Anda dapat melihat pada gambar di bawah ini.

masukkan deskripsi gambar di sini

StarsView Controller adalah a CPBaseNavigationController, dan CPBaseNavigationControllermerupakan subclass dari UINavigationController.

Saya mencoba melakukan setps berikutnya:

  1. Dalam AppDelegate.swiftfunc didFinishLaunchingWithOptions, tambahkan

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

    tetapi tidak ada efek.

  2. Di StoryBoard, cari Base Tab BarController(gambar di atas). Pilih Attributes Inspector, ubah Sattus Baratribut menjadi Light Content.begitu buruk, tidak ada efek.

masukkan deskripsi gambar di sini

  1. Terakhir saya mendapatkannya. Di pengontrol navigasi kustom saya CPBaseNavigationController, tambahkan funcpreferredStatusBarStyle

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

    Itu bekerja dengan baik!

Selain itu, statusBarStyleusang dalam 9.0, Anda dapat menggunakan -[UIViewController preferredStatusBarStyle].

wenghengcong
sumber
9

Bekerja untuk Aplikasi Berbasis Navigasi

    var addStatusBar = UIView()
    addStatusBar.frame = CGRectMake(0, 0, UIScreen.mainScreen().bounds.width, 20);
    addStatusBar.backgroundColor = global().UIColorFromRGB(0x65b4d9)
    self.window?.rootViewController?.view .addSubview(addStatusBar)
Jio
sumber
Di mana menambahkan kode khusus ini, tidak bisa membuatnya berfungsi.
Anuj
Anda dapat menambahkannya dalam file delegasi aplikasi di didFinishLaunchingWithOptions
Jio
1
Bukankah lebih baik menggunakan addStatusBar.frame = CGRectMake (0, 0, UIScreen.mainScreen (). Bounds.width, 20) alih-alih dengan kode keras 320 lebar?
Torsten Ojaperv
Diedit @TorstenOjaperv
Jio
Bagaimana cara melakukannya dengan swift 3.0?
YETI
8

Semuanya jauh lebih mudah di Swift 3.0 Xcode 8

Menggunakan kode di bawah ini dalam file App Delegate, setelahnya

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

masukkan ini:

UINavigationBar.appearance().barStyle = .black

UINavigationBar.appearance().barTintColor = UIColor(red: 230, green: 32, blue: 31, alpha: 1.0)
Anton Rusia
sumber
1
Nilai merah, hijau, dan biru berkisar dari 0 hingga 1. Anda harus membaginya dengan 255 atau tidak akan berfungsi.
Makalele
8

Cepat 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
    }
}
kepiting
sumber
7

Swift 4 Untuk ViewController tertentu tanpa navigasiViewController tertanam, tambahkan saja ini ke file ViewController Anda.

override var preferredStatusBarStyle : UIStatusBarStyle {
    return .lightContent
}
Surjit Singh
sumber
Jika kami memiliki pengontrol navigasi yang tertanam, apa yang Anda lakukan?
icekomo
7

Cara lain yang sangat mudah untuk membuat pekerjaan ini hanya dengan membuat ekstensi kelas UINavigationController.

Karena mengganti preferredStatusBarStyle:metode tidak akan bekerja KECUALI kita melakukannya di dalam kelas UINavigationController.

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

Saya telah menetapkan warna tertentu (dalam format RGB) menggunakan kode di bawah ini dalam App Delegatefile:

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

. . .
}

Anda juga perlu menambahkan kunci di bawah ini dalam Info.plistfile:

Lihat tampilan bilah status berbasis pengontrol dengan nilai boolean diatur ke NO

Tangkapan layar 1

Tangkapan layar 2

Jayprakash Dubey
sumber
Dengan Siwft 3.0, bagaimana cara melakukannya?
YETI
4

Saya dapat menyarankan Anda cara yang lebih sederhana,

  1. Panggil saja setNeedsStatusBarAppearanceUpdate di viewDidLoad seperti yang dikatakan Apple docs,

Panggil metode ini jika bilah status pengontrol atribut, seperti status atau gaya tersembunyi / tidak tersembunyi, berubah. Jika Anda memanggil metode ini di dalam blok animasi, perubahan dianimasikan bersama dengan sisa blok animasi.

  1. Menerapkan preferStatusBarStyle mengembalikan jenis pilihan Anda.

Ini bekerja untuk saya di iOS 10.1.

Tujuan C

[self setNeedsStatusBarAppearanceUpdate];

-(UIStatusBarStyle)preferredStatusBarStyle {
     return UIStatusBarStyleLightContent;
}

Cepat

setNeedsStatusBarAppearanceUpdate()

var preferredStatusBarStyle: UIStatusBarStyle { 
    return .lightContent
}

Saya terkejut tidak ada yang menunjukkan ini. Selamat menikmati :)

Bhaumik Desai
sumber
4

Saya punya masalah dengan yang ini. Saya tidak benar-benar merasa senang tentang perubahan warna bilah status secara global dalam tampilan memang muncul dan kemudian mengubahnya kembali pada tampilan menghilang seperti jawaban yang diterima. Percaya atau tidak, Anda bisa membuatnya bekerja dengan mengabaikan preferredStatusBarStylepengontrol tampilan yang Anda inginkan. Setelah banyak waktu inilah yang saya lakukan untuk membuatnya bekerja:

  1. Ubah tampilan tampilan status berbasis pengontrol di Anda info.plistke YES.
  2. Sekarang setiap pengontrol tampilan layar penuh dapat mengubah gaya bilah status dengan menimpa preferredStatusBarStyle.
  3. Saya menentukan layar penuh karena ini tidak akan berfungsi untuk pengontrol tampilan modal (non-layar penuh), bukan tanpa pengaturan modal​Presentation​Captures​Status​Bar​Appearance ke Ya itu.
  4. Juga jika Anda memiliki pengendali tampilan tertanam, seperti pada pengontrol navigasi misalnya, ia akan meminta pengontrol tampilan paling atas untuk gaya bar status. Mengganti child​View​Controller​For​Status​Bar​Styledan melewati pengontrol tampilan tertanam seharusnya berfungsi tetapi tidak bagi saya. Jadi saya baru saja mengembalikan bilah status pengendali tampilan tersemat yang disukai sebagai gaya bilah status yang disukai. Sesuatu seperti ini:

    override var preferredStatusBarStyle: UIStatusBarStyle {
         if let topViewController = viewControllers.last {
             return topViewController.preferredStatusBarStyle
         }
    
         return .default
    }
John C.
sumber
Jawaban ini membantu saya! Saya menemukan bahwa untuk beberapa alasan pengendali navigasi saya (disajikan secara modial) tidak secara implisit meminta pengendali tampilan teratas untuk gaya bar statusnya. Jadi saya harus subclass UINavigationControllerdan menimpa child​View​Controller​For​Status​Bar​Stylevar di sana, kembali self.topViewController.
taber
3

Dalam Swift 4 atau 4.2

Anda dapat menambahkan pada vc Anda

preferStatusBarStyle

dan atur nilai kembali ke

.lightContent atau .default

ex:

override var preferredStatusBarStyle: UIStatusBarStyle {
        return .lightContent
}
Ridho Octanio
sumber
3

(Per 10 Juni 2020)

Swift 5 ( Tanpa mengedit .Plistfile )

Jika Anda menggunakan Storyboard, buka NavigationController, pilih navigationBar, klik pada Attributes Inspector, lalu ubah style. jika Anda perlu light content( bilah status putih ) atur apa saja kecuali defaultkatakanlah setel gaya blackDan jika Anda ingin dark content ( bilah status hitam ) atur default.

Default ( UIBarStyleDefault) menghasilkan UIStatusBarStyleDefaultbilah status latar depan gelap . Dan UIBarStyleBlackakan memberikan UIStatusBarStyleLightContentstatus bar.

Secara terprogram

let nav = UINavigationController(rootViewController: rootViewController)

    nav.navigationBar.barStyle = .default //gives you dark Content status bar

    nav.navigationBar.barStyle = .black  //gives you light content status bar

Tanpa Bilah Navigasi ( Edit.Plist )

tambahkan UIViewControllerBasedStatusBarAppearance/ View controller-based status bar appearanceke Anda info.plist, dan nilai yang ditetapkan adalah true.

Overrideyang preferredStatusBarStyleproperti dalam Controller Anda

class ViewController: UIViewController {
    override var preferredStatusBarStyle : UIStatusBarStyle {
        return .lightContent
    }
}
jawadAli
sumber
2

Pembaruan Swift 3.0

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

        UIApplication.shared.statusBarStyle = .lightContent

        return true
    }
Jaseibert
sumber
2

Apa yang berhasil dengan saya, di Storyboard, buka Pengontrol Navigasi, pilih bilah navigasi, klik pada Inspektur Atribut, lalu ubah gaya dari default menjadi hitam. Itu dia!

Amr
sumber
2

SWIFT 4.2 Hai, saya ingin berbagi solusi, yang berhasil bagi saya yang saya dapatkan dari artikel hebat tentang subjek yang sangat menarik ini oleh Graig Grummitt.

Langkah 1 Seperti yang orang lain katakan ADD di bawah ini ke PLIST Anda

View controller-based status bar appearance YES

Langkah 2 di RootViewcontroller tambahkan di bawah ini

var statusBarHidden: Bool = false {
        didSet(newValue) {
            UIView.animate(withDuration: 0.1) {
                self.setNeedsStatusBarAppearanceUpdate()
            }
        }
    }

    override var prefersStatusBarHidden: Bool {
        return statusBarHidden
    }

    var vcStatusBarStyle: UIStatusBarStyle = .default {
        didSet(newValue) {
            UIView.animate(withDuration: 0.1) {
                self.setNeedsStatusBarAppearanceUpdate()
            }
        }
    }

    override var preferredStatusBarStyle: UIStatusBarStyle {
        return vcStatusbarStyle
    }

Ketika memperbarui salah satu properti statusBarHiddenatau vcStatusBarStyleitu akan memanggil setNeedsStatusBarAppearanceUpdate()dan akan memperbarui bilah status dengan nilai-nilai baru untuk prefersStatusBarHiddenatau preferredStatusBarStyle. Dalam situasi saya, saya harus memperbarui properti ini untuk viewcontroller wadah, yang merupakan induk dari childviewcontroller yang terlihat. Saya melakukan ini menggunakan metode delegasi sederhana.

protocol MainViewControllerDelegate {
    func updateStatusBarStyle(statBarStayle: UIStatusBarStyle)
    func toggleStatusBar(visable: Bool)
}

Tentu ketika instantiating childViewController (Visible VC) jangan lupa untuk mengatur MainViewcontroller (Container VC) sebagai delegasinya. Terkadang saya melakukannya. :)

childViewController.delegate = self

Kemudian di childViewController saya baru saja memanggil metode delegate ketika diperlukan untuk memperbarui status bar.

self.delegate?.updateStatusBarStyle(statBarStayle: .default)

Seperti disebutkan di atas Graig Grummitt menjelaskan lebih detail tentang solusi ini dan juga bekerja dengan UINavigationControllers juga. Tautan di sini: Kasus Misterius dari Bilah Status

Erik Uecke
sumber
1

Klik pada grup File Pendukung (sisi kiri atas - nama proyek Anda). Arahkan ke Info. Klik + di suatu tempat di antara daftar, seperti nama bundel di bawah ini. Dan tambahkan "Lihat tampilan bilah status berbasis pengontrol" dan atur ke NO. Kemudian buka AppDelegate.swift dan ubah seperti ini:

func application(application: UIApplication!, didFinishLaunchingWithOptions launchOptions: NSDictionary!) -> Bool {

UIApplication.sharedApplication().setStatusBarStyle(UIStatusBarStyle.LightContent, animated: true)

return true
}

Itu dia.

Goran Jakovljevic
sumber
Anda salah membaca pertanyaan. Saya bertanya tentang cara mengubah StatusBarStyle untuk viewcontrollers tertentu, bukan untuk aplikasi lengkap.
Anuj
Lihat jawaban saya di bawah @Anuj
theCrab
1

Untuk Xcode 10 Anda dapat membuat kelas dan meletakkannya di depan kelas viewController Anda, Anda dapat memanggil kelas ini di semua pengontrol tampilan diperlukan bilah status konten ...

class UIViewControllerWithLightStatusBar: UIViewController {
override var preferredStatusBarStyle: UIStatusBarStyle {
return UIStatusBarStyle.lightContent
}
}

Sekarang ubah kelas viewController Anda di:

class YourViewController: UIViewControllerWithLightStatusBar {
...
}

Dan itu saja ...

Fabio
sumber
1

Bekerja untuk Navigasi Berbasis untuk pengontrol tampilan tertentu di 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)
Gangireddy Rami Reddy
sumber
1

PERINGATAN


Setter untuk 'statusBarStyle' sudah tidak digunakan lagi di iOS 9.0: Gunakan - [UIViewController preferStatusBarStyle]

UIApplication.shared.statusBarStyle = .default

jadi solusi saya adalah seperti ini: membuat ekstensi dari pengontrol navigasi:

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

        return .default
    }
}

dan jika Anda memiliki viewController yang akan memiliki gaya selain gaya aplikasi, Anda dapat membuatnya

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

katakanlah bahwa Anda adalah gaya status aplikasi .defaultdan Anda ingin layar ini menjadi .lightContent begitu barStyle akan mengambil .lightContentsebagai nilai defaultnya, ini akan mengubah gaya bilah status menjadi lightContent, dan kemudian pastikan ketika viewWillDisappearmengubah barStyle lagi ke gaya bilah status app yang dalam kasus kami adalah .default.

ini bekerja untuk saya

hesham ghalaab
sumber
1

Warna khusus untuk bilah status (iOS11 +, Swift4 +)

Jika Anda mencari solusi bagaimana mengubah bilah status ke warna kustom Anda, ini solusi yang berfungsi.

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
Tung Fam
sumber