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.info
bendera 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:, default
yang 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 UIViewController
instance 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:
- Setelah inisialisasi layar, ketika UI sedang dipersiapkan.
- 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 statusBar
objek menggunakan KVC dan mengatur warna latar belakangnya. Objek yang Anda dapatkan dengan cara ini adalah UIStatusBar
, yang berasal dari UIView
dan dengan demikian secara alami mendukung backgroundColor
properti. Ini kotor, bukan cara hukum, tapi sejauh ini satu-satunya cara untuk mengatur warna khusus untuk statusbar (tidak memperhitungkan UINavigationBar
pendekatan 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")
}
}
}