Saya mengikuti utas ini untuk mengganti -preferredStatusBarStyle
, tetapi tidak dipanggil. Apakah ada opsi yang dapat saya ubah untuk mengaktifkannya? (Saya menggunakan XIB dalam proyek saya.)
ios
ios7
uikit
uistatusbar
trgoofi
sumber
sumber
Jawaban:
Kemungkinan penyebab root
Saya memiliki masalah yang sama, dan menemukan itu terjadi karena saya tidak mengatur pengontrol tampilan root di jendela aplikasi saya.
Di
UIViewController
mana saya telah menerapkanpreferredStatusBarStyle
itu digunakan dalamUITabBarController
, yang mengontrol tampilan tampilan di layar.Ketika saya mengatur pengontrol tampilan root untuk menunjukkan hal ini
UITabBarController
, perubahan bilah status mulai berfungsi dengan benar, seperti yang diharapkan (danpreferredStatusBarStyle
metode dipanggil).Metode alternatif (Tidak digunakan di iOS 9)
Atau, Anda dapat memanggil salah satu metode berikut ini, yang sesuai, di setiap pengontrol tampilan Anda, tergantung pada warna latar belakangnya, daripada harus menggunakan
setNeedsStatusBarAppearanceUpdate
:atau
Perhatikan bahwa Anda juga perlu mengatur
UIViewControllerBasedStatusBarAppearance
keNO
dalam file plist jika Anda menggunakan metode ini.sumber
setNeedsStatusBarAppearanceUpdate
- kecurigaan saya dikonfirmasi ketika saya melakukan perubahan ini.Bagi siapa pun yang menggunakan UINavigationController:
The
UINavigationController
tidak meneruskanpreferredStatusBarStyle
panggilan ke pengontrol tampilan anaknya. Alih-alih mengelola negaranya sendiri - sebagaimana mestinya, ia menggambar di bagian atas layar tempat bilah status berada dan karenanya harus bertanggung jawab untuk itu. Karenanya menerapkanpreferredStatusBarStyle
VC Anda dalam kontroler nav tidak akan melakukan apa pun - mereka tidak akan pernah dipanggil.Kuncinya adalah apa
UINavigationController
gunanya memutuskan apa yang akan kembaliUIStatusBarStyleDefault
atauUIStatusBarStyleLightContent
. Ini mendasarkan ini padaUINavigationBar.barStyle
. Default (UIBarStyleDefault
) menghasilkanUIStatusBarStyleDefault
bilah status latar depan gelap . DanUIBarStyleBlack
akan memberikanUIStatusBarStyleLightContent
status bar.TL; DR:
Jika Anda ingin
UIStatusBarStyleLightContent
padaUINavigationController
penggunaan:sumber
preferredStatusBarStyle
sebenarnya akan dipanggil pada pengontrol tampilan anak jika Anda menyembunyikan bilah navigasi (disetelnavigationBarHidden
keYES
), tepat sesuai kebutuhan.[[UINavigationBar appearance] setBarStyle:UIBarStyleBlack]
navigationBarHidden
set keYES
akan benar-benar telahpreferredStatusBarStyle
memanggil, dan peringatan bagi mereka yang mungkin tersandung pada ini: itu bekerja dengannavigationBarHidden
, tetapi tidak dengannavigationBar.hidden
!Jadi saya benar-benar menambahkan kategori ke UINavigationController tetapi menggunakan metode:
dan meminta mereka mengembalikan UIViewController yang terlihat saat ini. Itu memungkinkan pengontrol tampilan yang terlihat saat ini mengatur gaya / visibilitas yang diinginkan.
Berikut cuplikan kode lengkap untuknya:
Dalam Swift:
Dalam Objective-C:
Dan untuk ukuran yang baik, inilah cara penerapannya di UIViewController:
Dalam Swift
Dalam Objective-C
Terakhir, pastikan daftar aplikasi Anda TIDAK memiliki "Tampilan bilah status berbasis pengontrol" yang disetel ke NO. Hapus baris itu atau setel ke YA (yang saya percaya adalah default sekarang untuk iOS 7?)
sumber
return self.topViewController;
bekerja untuk saya, tetapireturn self.visibleViewController;
- tidaksuper
metode ini dan Anda benar-benar ingin mengubah perilaku semua pengontrol jenis iniBagi siapa pun yang masih berjuang dengan ini, ekstensi sederhana ini dengan cepat harus memperbaiki masalah untuk Anda.
sumber
Aplikasi saya menggunakan semua tiga:
UINavigationController
,UISplitViewController
,UITabBarController
, sehingga ini semua tampaknya mengambil kendali atas status bar dan akan menyebabkanpreferedStatusBarStyle
tidak dipanggil untuk anak-anak mereka. Untuk mengesampingkan perilaku ini, Anda dapat membuat ekstensi seperti sisa jawaban yang telah disebutkan. Ini adalah ekstensi untuk ketiganya, di Swift 4. Wish Apple lebih jelas tentang hal-hal semacam ini.Sunting: Perbarui untuk perubahan API Swift 4.2
sumber
Jawaban Tyson benar untuk mengubah warna bilah status menjadi putih
UINavigationController
.Jika ada yang ingin mencapai hasil yang sama dengan menulis kode di
AppDelegate
kemudian gunakan kode di bawah ini dan tulis di dalamAppDelegate's
didFinishLaunchingWithOptions
metode.Dan jangan lupa untuk mengatur
UIViewControllerBasedStatusBarAppearance
keYES
dalam file .plist, kalau tidak perubahan tidak akan mencerminkan.Kode
sumber
Pada UINavigationController,
preferredStatusBarStyle
tidak dipanggil karenatopViewController
lebih disukaiself
. Jadi, untukpreferredStatusBarStyle
dipanggil pada UINavigationController, Anda perlu mengubahnyachildViewControllerForStatusBarStyle
.Rekomendasi
Override UINavigationController Anda di kelas Anda:
Alternatif yang tidak direkomendasikan
Untuk melakukannya untuk semua UINavigationController, Anda bisa mengganti dalam ekstensi (peringatan: itu mempengaruhi UIDocumentPickerViewController, UIImagePickerController, dll.), Tetapi Anda mungkin tidak boleh melakukannya sesuai dengan dokumentasi Swift :
sumber
Selain jawaban Serenn, jika Anda menghadirkan view controller dengan
modalPresentationStyle
(misalnya.overCurrentContext
), Anda juga harus menyebutnya pada controller tampilan yang baru disajikan:Jangan lupa juga menimpa
preferredStatusBarStyle
pengontrol tampilan yang disajikan.sumber
Tambahan untuk jawaban Hippo: jika Anda menggunakan UINavigationController, maka mungkin lebih baik untuk menambahkan kategori:
Solusi itu mungkin lebih baik daripada beralih ke perilaku yang akan segera ditinggalkan.
sumber
preferredStatusBarStyle
dan melakukan logika spesifik UINavigationController. Saat ini logika ini didasarkan padanavigationBar.barStyle
tetapi saya dapat melihat pemeriksaan tambahan sedang ditambahkan (misalnyaUISearchDisplayController
pindah ke menyembunyikan mode navbar). Dengan mengganti logika default, Anda kehilangan semua fungsi ini dan membiarkan diri Anda terbuka untuk momen 'wtf' yang mengganggu di masa depan. Lihat jawaban saya di atas untuk cara yang benar untuk melakukan ini sementara masih mendukung perilaku kontroler nav built-in.Cepat 4.2 dan lebih tinggi
Seperti disebutkan dalam jawaban yang dipilih , root menyebabkan untuk memeriksa objek pengontrol tampilan root window Anda.
Kemungkinan kasus struktur aliran Anda
Anda adalah objek UIViewController dan selanjutnya menambah atau menghapus pengontrol navigasi atau tabController berdasarkan aliran aplikasi Anda.
Aliran jenis ini biasanya digunakan jika aplikasi Anda memiliki aliran pra masuk pada tumpukan navigasi tanpa tab dan mengirim aliran masuk dengan tab dan mungkin setiap tab selanjutnya memegang pengendali navigasi.
Ini adalah aliran di mana pengontrol tampilan root jendela adalah tabBarController mungkin setiap tab selanjutnya memegang pengontrol navigasi.
Ini adalah aliran di mana pengontrol tampilan root jendela adalah navigationController.
Saya tidak yakin apakah ada kemungkinan untuk menambahkan pengontrol tab bar atau pengontrol navigasi baru di pengontrol navigasi yang ada. Tetapi jika ada kasus seperti itu, kita perlu meneruskan kontrol gaya bilah status ke wadah berikutnya. Jadi, saya menambahkan cek yang sama di ekstensi UINavigationController untuk menemukan
childForStatusBarStyle
Gunakan ekstensi berikut, ini menangani semua skenario di atas -
UIViewControllerBasedStatusBarAppearance
kunci dalaminfo.plist
karena benar secara defaultPoin yang perlu dipertimbangkan untuk aliran yang lebih kompleks
Jika Anda menyajikan aliran baru secara modalnya, aliran ini terlepas dari aliran gaya bilah status yang ada. Jadi, misalkan Anda sedang mempresentasikan
NewFlowUIViewController
dan kemudian menambahkan navigasi baru atau pengontrol tabBarNewFlowUIViewController
, kemudian menambahkan ekstensiNewFlowUIViewController
juga untuk mengelola gaya bilah status pengontrol tampilan lebih lanjut.Jika Anda mengatur modalPresentationStyle selain
fullScreen
saat mempresentasikan secara modalnya, Anda harus mengaturmodalPresentationCapturesStatusBarAppearance
ke true sehingga pengontrol tampilan yang disajikan harus menerima kontrol tampilan bilah status.sumber
Solusi iOS 13
UINavigationController
adalah subkelas dariUIViewController
(yang tahu 🙃)!Karenanya, saat menghadirkan pengontrol tampilan yang tertanam di pengontrol navigasi, Anda tidak benar-benar menghadirkan pengontrol tampilan yang tertanam; Anda sedang menghadirkan pengontrol navigasi!
UINavigationController
, sebagai subkelas dariUIViewController
, mewarisipreferredStatusBarStyle
danchildForStatusBarStyle
, yang dapat Anda atur sesuai keinginan.Salah satu dari metode berikut harus bekerja:
info.plist
, tambahkan properti berikut:UIUserInterfaceStyle
(alias. "Gaya Antarmuka Pengguna")Timpa
preferredStatusBarStyle
dalamUINavigationController
preferredStatusBarStyle
( doc ) - Gaya bilah status yang disukai untuk pengontrol tampilanSubkelas atau luas
UINavigationController
ATAU
Timpa
childForStatusBarStyle
dalamUINavigationController
childForStatusBarStyle
( doc ) - Dipanggil ketika sistem membutuhkan pengontrol tampilan untuk digunakan untuk menentukan gaya status barSubkelas atau luas
UINavigationController
ATAU
Anda dapat mengembalikan pengontrol tampilan yang Anda inginkan di atas. Saya merekomendasikan salah satu dari yang berikut:
topViewController
(ofUINavigationController
) ( doc ) - Pengontrol tampilan di bagian atas tumpukan navigasivisibleViewController
(ofUINavigationController
) ( doc ) - Pengontrol tampilan yang terkait dengan tampilan yang saat ini terlihat di antarmuka navigasi (petunjuk: ini dapat mencakup "pengontrol tampilan yang disajikan secara modalnya di atas pengontrol navigasi itu sendiri")Catatan: Jika Anda memutuskan untuk subkelas
UINavigationController
, ingatlah untuk menerapkan kelas itu ke pengontrol nav Anda melalui inspektur identitas di IB.PS Kode saya menggunakan sintaks Swift 5.1 😎
sumber
@ serenn jawaban di atas masih bagus untuk kasus UINavigationControllers. Namun, untuk swift 3 fungsi childViewController telah diubah menjadi
vars
. JadiUINavigationController
kode ekstensi harus:Dan kemudian di view controller yang akan menentukan gaya status bar:
sumber
Jika viewController Anda berada di bawah UINavigationController.
Subkelas UINavigationController dan tambahkan
ViewController's
preferredStatusBarStyle
akan dipanggil.sumber
UIStatusBarStyle di iOS 7
Bilah status di iOS 7 transparan, tampilan di belakangnya terlihat.
Gaya bilah status mengacu pada penampilan kontennya. Di iOS 7, konten bilah status berwarna gelap (
UIStatusBarStyleDefault
) atau terang (UIStatusBarStyleLightContent
). KeduanyaUIStatusBarStyleBlackTranslucent
danUIStatusBarStyleBlackOpaque
sudah usang di iOS 7.0. GunakanUIStatusBarStyleLightContent
sebagai gantinya.Bagaimana cara mengubahnya
UIStatusBarStyle
Jika di bawah bilah status adalah bilah navigasi, gaya bilah status akan disesuaikan agar sesuai dengan gaya bilah navigasi (
UINavigationBar.barStyle
):Khususnya, jika gaya bilah navigasi adalah UIBarStyleDefault, gaya bilah status akan
UIStatusBarStyleDefault
; jika gaya bilah navigasi adalahUIBarStyleBlack
, gaya bilah status akanUIStatusBarStyleLightContent
.Jika tidak ada bilah navigasi di bawah bilah status, gaya bilah status dapat dikontrol dan diubah oleh pengontrol tampilan individual saat aplikasi berjalan.
-
[UIViewController preferredStatusBarStyle]
adalah metode baru yang ditambahkan di iOS 7. Dapat diganti untuk mengembalikan gaya bilah status yang disukai:Jika gaya bilah status harus dikontrol oleh pengontrol tampilan anak alih-alih mandiri, ganti
-[UIViewController childViewControllerForStatusBarStyle]
untuk mengembalikan pengontrol tampilan anak itu.Jika Anda memilih untuk keluar dari perilaku ini dan mengatur gaya bilah status dengan menggunakan
-[UIApplication statusBarStyle]
metode ini, tambahkanUIViewControllerBasedStatusBarAppearance
kunci keInfo.plist
file aplikasi dan berikan nilai NO.sumber
Jika ada yang menggunakan Pengontrol Navigasi dan ingin semua pengontrol navigasi mereka memiliki gaya hitam, Anda dapat menulis ekstensi ke UINavigationController seperti ini di Swift 3 dan itu akan berlaku untuk semua pengontrol navigasi (alih-alih menugaskannya ke satu pengontrol di sebuah waktu).
sumber
Dalam Swift untuk segala jenis UIViewController:
Di
AppDelegate
set Anda :myRootController
dapat berupa apa sajaUIViewController
, misalnyaUITabBarController
atauUINavigationController
.Kemudian, timpa pengontrol root ini seperti ini:
Ini akan mengubah tampilan bilah status di seluruh aplikasi Anda, karena pengontrol root bertanggung jawab penuh atas tampilan bilah status.
Ingatlah untuk mengatur properti
View controller-based status bar appearance
ke YA di AndaInfo.plist
untuk membuat ini berfungsi (yang merupakan default).sumber
Solusi Swift 3 iOS 10:
sumber
Sebagian besar jawaban tidak termasuk implementasi
childViewControllerForStatusBarStyle
metode yang baik untukUINavigationController
. Menurut pengalaman saya, Anda harus menangani kasus seperti ketika pengontrol tampilan transparan disajikan di atas pengontrol navigasi. Dalam kasus ini Anda harus memberikan kontrol ke modal controller Anda (visibleViewController
), tetapi tidak ketika itu hilang.sumber
Dalam kasus saya, saya tidak sengaja menampilkan View / Navigation Controller sebagai
UIModalPresentationStyle.overFullScreen
, yang menyebabkanpreferredStatusBarStyle
tidak dipanggil. Setelah beralih kembali keUIModalPresentationStyle.fullScreen
, semuanya berfungsi.sumber
Sedangkan untuk iOS 13.4
preferredStatusBarStyle
metode dalamUINavigationController
kategori tidak akan dipanggil, swizzling tampaknya menjadi satu-satunya pilihan tanpa perlu menggunakan subkelas.Contoh:
Header kategori:
Penerapan:
Penggunaan di AppDelegate.h:
sumber
Inilah metode saya untuk menyelesaikan ini.
Tetapkan protokol yang disebut AGViewControllerAppearance .
AGViewControllerAppearance.h
Tentukan kategori pada UIViewController yang disebut Peningkatan .
UIViewController + Upgrade.h
UIViewController + Upgrade.m
Sekarang, saatnya untuk mengatakan bahwa Anda melihat pengontrol sedang mengimplementasikan AGViewControllerAppearance protokol .
Contoh:
Tentu saja, Anda dapat menerapkan sisa metode ( showsStatusBar , animatesStatusBarVisibility , prefferedStatusBarAnimation ) dari protokol dan UIViewController + upgrade akan melakukan kustomisasi yang tepat berdasarkan nilai-nilai yang disediakan oleh mereka.
sumber
Jika seseorang mengalami masalah ini dengan UISearchController. Cukup buat subkelas baru dari UISearchController, dan kemudian tambahkan kode di bawah ini ke dalam kelas itu:
sumber
Perhatikan bahwa saat menggunakan
self.navigationController.navigationBar.barStyle = UIBarStyleBlack;
solusipastikan untuk pergi ke plist Anda dan atur "Lihat tampilan bilah status berbasis pengontrol" ke YES. Jika TIDAK, itu tidak akan berhasil.
sumber
Sejak Xcode 11.4, menimpa
preferredStatusBarStyle
properti di ekstensi UINavigationController tidak lagi berfungsi karena tidak akan dipanggil.Mengatur
barStyle
darinavigationBar
untuk.black
karya memang tapi ini akan menambah efek samping yang tidak diinginkan jika Anda menambahkan subviews ke navigationbar yang mungkin memiliki penampilan yang berbeda untuk mode terang dan gelap. Karena dengan menyetelbarStyle
ke hitam,userInterfaceStyle
tampilan yang tertanam di navigationBar akan selalu memilikiuserInterfaceStyle.dark
terlepas dariuserInterfaceStyle
aplikasi.Solusi tepat yang saya temukan adalah dengan menambahkan subkelas
UINavigationController
dan menimpa dipreferredStatusBarStyle
sana. Jika Anda kemudian menggunakan UINavigationController khusus ini untuk semua tampilan Anda, Anda akan berada di sisi penyimpanan.sumber
NavigationController atau TabBarController adalah yang perlu menyediakan gaya. Inilah cara saya memecahkan: https://stackoverflow.com/a/39072526/242769
sumber