Dalam aplikasi iPhone dibangun dengan Xcode 5 untuk iOS 7 I set UIViewControllerBasedStatusBarAppearance=YES
di info.plist
, dan di saya ViewController
saya memiliki kode ini:
-(UIStatusBarStyle) preferredStatusBarStyle
{
return UIStatusBarStyleLightContent;
}
Namun bilah status masih hitam dengan latar belakang hitam.
Aku tahu yang mungkin untuk mengubah ini aplikasi-lebar dengan menetapkan UIViewControllerBasedStatusBarAppearance=NO
dalam info.plist
, tapi saya benar-benar perlu untuk mengubah ini pada viewController
dengan viewController
dasar saat runtime.
iphone
ios7
xcode5
uistatusbar
Andrew Smith
sumber
sumber
Jawaban:
Saya menemukan bahwa jika ViewController Anda berada di dalam navigationController maka navigationController akan
navigationBar.barStyle
menentukan statusBarStyle.Menyetel bilah navigasi Anda
barStyle
keUIBarStyleBlackTranslucent
akan memberikan teks bilah status putih (mis.UIStatusBarStyleLightContent
), DanUIBarStyleDefault
akan memberi teks bilah status hitam (mis.UIStatusBarStyleDefault
).Perhatikan bahwa ini berlaku bahkan jika Anda benar-benar mengubah warna navigationBar melalui nya
barTintColor
.sumber
UINavigationController
'spreferredStatusBarStyle
tidak menelepon melalui ke ViewController itu host, dan bukan hanya mengembalikan berdasarkan nya navigationBarStyle.UIBarStyleBlackTranslucent
tidak digunakan lagi, gunakanUIBarStyleBlack
sajaOke, inilah triknya. Anda harus menambahkan kunci "Lihat bilah status berbasis pengontrol" dan setel nilainya ke Tidak.
Ini berlawanan dengan arti kunci ini, tetapi meskipun Anda menyetel nilainya ke
No
, Anda masih dapat mengubah tampilan bilah status, dan apakah itu muncul atau tidak di pengontrol tampilan mana pun. Jadi ini bertindak seperti "Ya" tetapi setel ke "Tidak"!Sekarang saya bisa mendapatkan bilah status putih atau gelap.
sumber
Untuk
preferredStatusBarStyle()
bekerja di dalamUINavigationController
danUITabBarController
saya menambahkan kode berikut, yang akan mendapatkan gaya bilah status yang disukai dari pengontrol tampilan yang saat ini terlihat.Untuk Swift 3 itu bukan metode tetapi properti:
Properti Swift 4.2 telah diganti namanya:
Pemakaian
sumber
Saya mungkin datang sedikit terlambat, tetapi jika ada orang lain yang mencari solusi luas aplikasi yang berfungsi dan diverifikasi.
@mxcl benar dalam menjelaskan mengapa ini terjadi. Untuk memperbaikinya, kita cukup membuat ekstensi (atau kategori dalam obj-c) yang menimpa metode preferSatusBarStyle () dari UINavigationController. Berikut adalah contoh di Swift:
Kode ini hanya mengekstrak pengontrol tampilan pertama (pengontrol tampilan root) dan membukanya (di obj-c cukup periksa bahwa itu bukan nol). Jika pembongkaran berhasil (bukan nihil) maka kita ambil rootViewControllers preferStatusBarStyle. Jika tidak, kami hanya mengembalikan default.
Semoga ini bisa membantu siapa saja yang mungkin membutuhkannya.
sumber
return self.preferredStatusBarStyle()
akan memanggil kembali ke metode yang sama persis.visibleViewController
akan menjadi lebih baikUntuk memberikan lebih banyak detail tentang jawaban yang diterima, letakkan baris berikut dalam
didFinishLaunchingWithOptions:
metode delegasi aplikasi Anda :Kemudian, di Info.plist Anda, tambahkan
View controller-based status bar appearance
dan setel keNO
.Saya percaya begitulah seharusnya dilakukan, BUKAN dari pengontrol navigasi, jika Anda menginginkan warna bilah status yang sama untuk seluruh aplikasi. Anda mungkin memiliki layar yang belum tentu disematkan di
UINavigationController
, atauUINavigationController
subkelas yang berbeda di tempat lain, dan hal-hal lain.EDIT : Anda juga dapat melakukannya tanpa mengetik kode apa pun: https://stackoverflow.com/a/18732865/855680
sumber
Di viewDidLoad, tulis saja ini
lakukan saja dan itu akan berhasil
bisakah kamu mencoba ini
Satu hal lagi yang saya lihat dalam pertanyaan Anda bahwa Anda telah menulis metode seperti ini
tapi seharusnya seperti ini
sumber
[self setNeedsStatusBarAppearanceUpdate];
metode yang sangat bagus, terima kasih!Inilah cara saya menyelesaikannya. Biasanya navigationController atau tabBarController yang menentukan kemunculan status bar (tersembunyi, warna, dll).
Jadi saya akhirnya membuat subclass pengontrol navigasi dan mengesampingkan preferStatusBarStyle. jika ViewContorller saat ini mengimplementasikan StatusBarStyleHandler saya meminta nilai untuk digunakan sebagai gaya, jika tidak, saya hanya mengembalikan nilai default.
Cara Anda memicu pembaruan tampilan bilah status adalah dengan memanggil
setNeedsStatusBarAppearanceUpdate
yang terpicupreferredStatusBarStyle
lagi dan memperbarui UI sesuai dengan apa yang dikembalikan metodeKemudian penggunaan
sumber
1) Satu pengaturan untuk seluruh proyek:
Jika tersedia, hapus
UIViewControllerBasedStatusBarAppearance
pasangan nilai kunci dari info.plist Anda, atau setelNO
tanpa menghapusnya. Jika tidak tersedia di info.plist Anda, jangan lakukan apa pun. DefaultNO
untuk properti ini.Tambahkan kode di bawah ini ke AppDelegate.m Anda:
2) Pengaturan berbeda untuk Pengontrol Tampilan yang berbeda:
Tambahkan
UIViewControllerBasedStatusBarAppearance
pasangan nilai kunci ke info.plist Anda dan setel keYES
.Jika Pengontrol Tampilan Anda tidak disematkan ke Pengontrol Navigasi. Katakanlah MyViewController. cukup tambahkan kode di bawah ini ke file MyViewController.m Anda. Jika Pengontrol Tampilan Anda disematkan ke Pengontrol Navigasi, buat Kelas Cocoa Touch baru dan jadikan itu subkelas dari UINavigationController. Katakanlah MyNC. Pilih Tampilan Pengontrol Navigasi di Storyboard Anda, di panel kanan; Utilitas -> Inspektur Identitas -> Kelas Khusus -> Kelas, ketik "MyNC". Setelah menautkan Tampilan Papan Cerita dengan Kelas Cocoa Touch "MyNC" Anda, tambahkan kode di bawah ini ke MyNC.m Anda:
sumber
Bahkan dengan semua jawaban di sini saya masih belum menemukan solusi yang tepat untuk saya, tetapi dimulai dengan jawaban dari Daniel. Apa yang saya dapatkan adalah:
di pengontrol navigasi (mirip untuk tab, hanya selectedViewController). Dan kemudian itu akan menghormati:
Di setiap pengontrol tampilan kecuali Anda menyetelnya sebaliknya. Saya tidak perlu menelepon ke
setNeedsStatusBarAppearanceUpdate()
mana pun, itu hanya diperbarui ketika Anda tiba di setiap pengontrol tampilan.sumber
Solusi iOS 13
Jawaban dengan suara terbanyak menggunakan kode "warisan" 👎
Menyetel
barStyle
properti sekarang (iOS 13+) dianggap sebagai "penyesuaian lama". Menurut Apple ,Mengenai usaha Anda - Anda berada di jalur yang benar!
UINavigationController
adalah subclass dariUIViewController
(siapa tahu 🙃)!Oleh karena itu, saat menampilkan pengontrol tampilan yang disematkan di pengontrol navigasi, Anda tidak benar-benar menampilkan pengontrol tampilan yang disematkan; Anda sedang menampilkan pengontrol navigasi!
UINavigationController
, sebagai subkelasUIViewController
, mewarisipreferredStatusBarStyle
danchildForStatusBarStyle
, yang dapat Anda setel sesuai keinginan.Salah satu metode berikut harus bekerja:
Timpa
preferredStatusBarStyle
dalamUINavigationController
preferredStatusBarStyle
( doc ) - Gaya bilah status yang disukai untuk pengontrol tampilanSubkelas atau perluasan
UINavigationController
ATAU
Timpa
childForStatusBarStyle
dalamUINavigationController
childForStatusBarStyle
( doc ) - Dipanggil saat sistem memerlukan pengontrol tampilan yang akan digunakan untuk menentukan gaya bilah statusSubkelas atau perluasan
UINavigationController
ATAU
Anda dapat mengembalikan pengontrol tampilan apa pun yang Anda inginkan di atas. Saya merekomendasikan salah satu dari yang berikut:
topViewController
(ofUINavigationController
) ( doc ) - Pengontrol tampilan di bagian atas tumpukan navigasivisibleViewController
(dariUINavigationController
) ( doc ) - Pengontrol tampilan yang terkait dengan tampilan yang saat ini terlihat di antarmuka navigasi (petunjuk: ini dapat mencakup "pengontrol tampilan yang disajikan secara sederhana di atas pengontrol navigasi itu sendiri")Catatan: Jika Anda memutuskan untuk membuat subkelas
UINavigationController
, ingatlah untuk menerapkan kelas tersebut ke pengontrol nav Anda melalui pemeriksa identitas di IB.PS Kode saya menggunakan sintaks Swift 5.1 😎
sumber
.default
gayanya mempertimbangkan mode gelap dan itu tidak didokumentasikan, jadi jika Anda juga mendukung versi iOS sebelumnya, Anda dapat menambahkanif #available(iOS 13, *) { return .darkContent } else { return .default }
jika Anda mencoba mengatur gaya bilah status secara manual sesuai dengan warna di belakang bilah status dan warna itu "cerah".Jika seandainya Anda ingin menyembunyikan statusBar selama splashScreen tetapi ingin mengubah gaya menjadi konten ringan (StatusBarInitiallyHidden on Plist harus NO untuk menyembunyikan statusBar pada splash), Anda dapat menambahkan ini ke metode didFinishLaunchingWithOptions appDelegate untuk mengubah ke lightContent.
sumber
contoh cepat
di AppDelegate.swift
di set info.plist Lihat tampilan bilah status berbasis pengontrol: NO
sumber
Jika Anda menggunakan
NavigationController
, Anda dapat membuat subkelasNavigationController
sehingga berkonsultasi dengan pengontrol tampilan anaknya// MyCustomNavigationController
sumber
Swift 4.2.0
sumber
Anda dapat mengatur gaya bilah status. Ini akan menyerupai bilah status seperti iOS 6 dan di bawahnya.
Tempel metode ini di pengontrol tampilan Anda
dan memanggil metode ini dari tampilan tidak memuat seperti ini
sumber
[self setStatusBarNeedsUpdate]
di blok kedua? (Atau setidaknya sesuatu yang lain).Saya hanya ingin menambahkan catatan untuk kasus tertentu yang saya hadapi. Saya memiliki UIWindow lain di aplikasi saya untuk menampilkan wajah obrolan yang akan mengambang di seluruh aplikasi saya sepanjang waktu. Melakukan ini menyebabkan tidak ada solusi di atas yang berfungsi, dan saya tidak begitu yakin mengapa! Semua yang saya perhatikan adalah bahwa ViewController saya di UIWindow baru adalah alasannya! Dan jika saya ingin mengubah gaya bilah status, saya harus melakukannya di pengontrol tampilan UIWindow baru itu.
Catatan ini mungkin membantu orang lain yang memiliki struktur serupa! Jadi pada dasarnya Anda dapat menerapkan solusi yang disebutkan di atas di ViewController dari UIWindow baru.
Sekali lagi ini kasus khusus.
Terima kasih
sumber
Untuk swift 3, di UIViewController Anda:
sumber