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.)
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.)
Jawaban:
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 menerapkan preferredStatusBarStyle
itu digunakan dalam UITabBarController
, 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 (dan preferredStatusBarStyle
metode dipanggil).
(BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
... // other view controller loading/setup code
self.window.rootViewController = rootTabBarController;
[self.window makeKeyAndVisible];
return YES;
}
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
:
[[UIApplication sharedApplication] setStatusBarStyle:UIStatusBarStyleLightContent];
atau
[[UIApplication sharedApplication] setStatusBarStyle:UIStatusBarStyleDefault];
Perhatikan bahwa Anda juga perlu mengatur UIViewControllerBasedStatusBarAppearance
ke NO
dalam file plist jika Anda menggunakan metode ini.
setNeedsStatusBarAppearanceUpdate
- kecurigaan saya dikonfirmasi ketika saya melakukan perubahan ini.
Bagi siapa pun yang menggunakan UINavigationController:
The UINavigationController
tidak meneruskan preferredStatusBarStyle
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 menerapkan preferredStatusBarStyle
VC Anda dalam kontroler nav tidak akan melakukan apa pun - mereka tidak akan pernah dipanggil.
Kuncinya adalah apa UINavigationController
gunanya memutuskan apa yang akan kembali UIStatusBarStyleDefault
atau UIStatusBarStyleLightContent
. Ini mendasarkan ini pada UINavigationBar.barStyle
. Default ( UIBarStyleDefault
) menghasilkan UIStatusBarStyleDefault
bilah status latar depan gelap . Dan UIBarStyleBlack
akan memberikan UIStatusBarStyleLightContent
status bar.
TL; DR:
Jika Anda ingin UIStatusBarStyleLightContent
pada UINavigationController
penggunaan:
self.navigationController.navigationBar.barStyle = UIBarStyleBlack;
preferredStatusBarStyle
sebenarnya akan dipanggil pada pengontrol tampilan anak jika Anda menyembunyikan bilah navigasi (disetel navigationBarHidden
ke YES
), tepat sesuai kebutuhan.
[[UINavigationBar appearance] setBarStyle:UIBarStyleBlack]
navigationBarHidden
set ke YES
akan benar-benar telah preferredStatusBarStyle
memanggil, dan peringatan bagi mereka yang mungkin tersandung pada ini: itu bekerja dengan navigationBarHidden
, tetapi tidak dengan navigationBar.hidden
!
Jadi saya benar-benar menambahkan kategori ke UINavigationController tetapi menggunakan metode:
-(UIViewController *)childViewControllerForStatusBarStyle;
-(UIViewController *)childViewControllerForStatusBarHidden;
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:
extension UINavigationController {
public override func childViewControllerForStatusBarHidden() -> UIViewController? {
return self.topViewController
}
public override func childViewControllerForStatusBarStyle() -> UIViewController? {
return self.topViewController
}
}
Dalam Objective-C:
@interface UINavigationController (StatusBarStyle)
@end
@implementation UINavigationController (StatusBarStyle)
-(UIViewController *)childViewControllerForStatusBarStyle {
return self.topViewController;
}
-(UIViewController *)childViewControllerForStatusBarHidden {
return self.topViewController;
}
@end
Dan untuk ukuran yang baik, inilah cara penerapannya di UIViewController:
Dalam Swift
override public func preferredStatusBarStyle() -> UIStatusBarStyle {
return .LightContent
}
override func prefersStatusBarHidden() -> Bool {
return false
}
Dalam Objective-C
-(UIStatusBarStyle)preferredStatusBarStyle {
return UIStatusBarStyleLightContent; // your own style
}
- (BOOL)prefersStatusBarHidden {
return NO; // your own visibility code
}
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?)
return self.topViewController;
bekerja untuk saya, tetapi return self.visibleViewController;
- tidak
super
metode ini dan Anda benar-benar ingin mengubah perilaku semua pengontrol jenis ini
Bagi siapa pun yang masih berjuang dengan ini, ekstensi sederhana ini dengan cepat harus memperbaiki masalah untuk Anda.
extension UINavigationController {
override open var childForStatusBarStyle: UIViewController? {
return self.topViewController
}
}
Aplikasi saya menggunakan semua tiga: UINavigationController
, UISplitViewController
, UITabBarController
, sehingga ini semua tampaknya mengambil kendali atas status bar dan akan menyebabkan preferedStatusBarStyle
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.
extension UINavigationController {
open override var childViewControllerForStatusBarStyle: UIViewController? {
return self.topViewController
}
open override var childViewControllerForStatusBarHidden: UIViewController? {
return self.topViewController
}
}
extension UITabBarController {
open override var childViewControllerForStatusBarStyle: UIViewController? {
return self.childViewControllers.first
}
open override var childViewControllerForStatusBarHidden: UIViewController? {
return self.childViewControllers.first
}
}
extension UISplitViewController {
open override var childViewControllerForStatusBarStyle: UIViewController? {
return self.childViewControllers.first
}
open override var childViewControllerForStatusBarHidden: UIViewController? {
return self.childViewControllers.first
}
}
Sunting: Perbarui untuk perubahan API Swift 4.2
extension UINavigationController {
open override var childForStatusBarStyle: UIViewController? {
return self.topViewController
}
open override var childForStatusBarHidden: UIViewController? {
return self.topViewController
}
}
extension UITabBarController {
open override var childForStatusBarStyle: UIViewController? {
return self.children.first
}
open override var childForStatusBarHidden: UIViewController? {
return self.children.first
}
}
extension UISplitViewController {
open override var childForStatusBarStyle: UIViewController? {
return self.children.first
}
open override var childForStatusBarHidden: UIViewController? {
return self.children.first
}
}
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 dalam AppDelegate's
didFinishLaunchingWithOptions
metode.
Dan jangan lupa untuk mengatur UIViewControllerBasedStatusBarAppearance
ke YES
dalam file .plist, kalau tidak perubahan tidak akan mencerminkan.
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
// status bar appearance code
[[UINavigationBar appearance] setBarStyle:UIBarStyleBlack];
return YES;
}
Pada UINavigationController, preferredStatusBarStyle
tidak dipanggil karena topViewController
lebih disukai self
. Jadi, untuk preferredStatusBarStyle
dipanggil pada UINavigationController, Anda perlu mengubahnya childViewControllerForStatusBarStyle
.
Override UINavigationController Anda di kelas Anda:
class MyRootNavigationController: UINavigationController {
override var preferredStatusBarStyle: UIStatusBarStyle {
return .lightContent
}
override var childViewControllerForStatusBarStyle: UIViewController? {
return nil
}
}
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 :
extension UINavigationController {
open override var preferredStatusBarStyle: UIStatusBarStyle {
return .lightContent
}
open override var childViewControllerForStatusBarStyle: UIViewController? {
return nil
}
}
Selain jawaban Serenn, jika Anda menghadirkan view controller dengan modalPresentationStyle
(misalnya .overCurrentContext
), Anda juga harus menyebutnya pada controller tampilan yang baru disajikan:
presentedViewController.modalPresentationCapturesStatusBarAppearance = true
Jangan lupa juga menimpa preferredStatusBarStyle
pengontrol tampilan yang disajikan.
Tambahan untuk jawaban Hippo: jika Anda menggunakan UINavigationController, maka mungkin lebih baik untuk menambahkan kategori:
// UINavigationController+StatusBarStyle.h:
@interface UINavigationController (StatusBarStyle)
@end
// UINavigationController+StatusBarStyle.m:
@implementation UINavigationController (StatusBarStyle)
- (UIStatusBarStyle)preferredStatusBarStyle
{
//also you may add any fancy condition-based code here
return UIStatusBarStyleLightContent;
}
@end
Solusi itu mungkin lebih baik daripada beralih ke perilaku yang akan segera ditinggalkan.
preferredStatusBarStyle
dan melakukan logika spesifik UINavigationController. Saat ini logika ini didasarkan pada navigationBar.barStyle
tetapi saya dapat melihat pemeriksaan tambahan sedang ditambahkan (misalnya UISearchDisplayController
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.
Seperti disebutkan dalam jawaban yang dipilih , root menyebabkan untuk memeriksa objek pengontrol tampilan root window Anda.
childForStatusBarStyle
Gunakan ekstensi berikut, ini menangani semua skenario di atas -
extension UITabBarController {
open override var childForStatusBarStyle: UIViewController? {
return selectedViewController?.childForStatusBarStyle ?? selectedViewController
}
}
extension UINavigationController {
open override var childForStatusBarStyle: UIViewController? {
return topViewController?.childForStatusBarStyle ?? topViewController
}
}
extension AppRootViewController {
open override var preferredStatusBarStyle: UIStatusBarStyle {
return children.first { $0.childForStatusBarStyle != nil }?.childForStatusBarStyle?.preferredStatusBarStyle ?? .default
}
}
UIViewControllerBasedStatusBarAppearance
kunci dalam info.plist
karena benar secara defaultJika 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 tabBar NewFlowUIViewController
, kemudian menambahkan ekstensi NewFlowUIViewController
juga untuk mengelola gaya bilah status pengontrol tampilan lebih lanjut.
Jika Anda mengatur modalPresentationStyle selain fullScreen
saat mempresentasikan secara modalnya, Anda harus mengatur modalPresentationCapturesStatusBarAppearance
ke true sehingga pengontrol tampilan yang disajikan harus menerima kontrol tampilan bilah status.
UINavigationController
adalah subkelas dari UIViewController
(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 dari UIViewController
, mewarisi preferredStatusBarStyle
dan childForStatusBarStyle
, 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
class MyNavigationController: UINavigationController {
override var preferredStatusBarStyle: UIStatusBarStyle {
.lightContent
}
}
ATAU
extension UINavigationController {
open override var preferredStatusBarStyle: UIStatusBarStyle {
.lightContent
}
}
Timpa childForStatusBarStyle
dalamUINavigationController
childForStatusBarStyle
( doc ) - Dipanggil ketika sistem membutuhkan pengontrol tampilan untuk digunakan untuk menentukan gaya status bar"Jika pengontrol tampilan wadah Anda memperoleh gaya bilah statusnya dari salah satu pengontrol tampilan anak-nya, [ganti properti ini] dan kembalikan pengontrol tampilan anak itu. Jika Anda mengembalikan nil atau tidak mengesampingkan metode ini, gaya bilah status untuk diri sendiri digunakan Jika nilai balik dari metode ini berubah, panggil metode setNeedsStatusBarAppearanceUpdate (). "
Subkelas atau luas UINavigationController
class MyNavigationController: UINavigationController {
override var childForStatusBarStyle: UIViewController? {
topViewController
}
}
ATAU
extension UINavigationController {
open override var childForStatusBarStyle: UIViewController? {
topViewController
}
}
Anda dapat mengembalikan pengontrol tampilan yang Anda inginkan di atas. Saya merekomendasikan salah satu dari yang berikut:
topViewController
(of UINavigationController
) ( doc ) - Pengontrol tampilan di bagian atas tumpukan navigasivisibleViewController
(of UINavigationController
) ( 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 😎
@ serenn jawaban di atas masih bagus untuk kasus UINavigationControllers. Namun, untuk swift 3 fungsi childViewController telah diubah menjadi vars
. Jadi UINavigationController
kode ekstensi harus:
override open var childViewControllerForStatusBarStyle: UIViewController? {
return topViewController
}
override open var childViewControllerForStatusBarHidden: UIViewController? {
return topViewController
}
Dan kemudian di view controller yang akan menentukan gaya status bar:
override var preferredStatusBarStyle: UIStatusBarStyle {
return .lightContent
}
Jika viewController Anda berada di bawah UINavigationController.
Subkelas UINavigationController dan tambahkan
override var preferredStatusBarStyle: UIStatusBarStyle {
return topViewController?.preferredStatusBarStyle ?? .default
}
ViewController's preferredStatusBarStyle
akan dipanggil.
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
). Keduanya UIStatusBarStyleBlackTranslucent
dan UIStatusBarStyleBlackOpaque
sudah usang di iOS 7.0. Gunakan UIStatusBarStyleLightContent
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 adalah UIBarStyleBlack
, gaya bilah status akan UIStatusBarStyleLightContent
.
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:
- (UIStatusBarStyle)preferredStatusBarStyle
{
return UIStatusBarStyleLightContent;
}
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, tambahkan UIViewControllerBasedStatusBarAppearance
kunci ke Info.plist
file aplikasi dan berikan nilai NO.
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).
extension UINavigationController {
override open func viewDidLoad() {
super.viewDidLoad()
self.navigationBar.barStyle = UIBarStyle.black
}
}
Dalam Swift untuk segala jenis UIViewController:
Di AppDelegate
set Anda :
func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool {
window!.rootViewController = myRootController
return true
}
myRootController
dapat berupa apa saja UIViewController
, misalnya UITabBarController
atau UINavigationController
.
Kemudian, timpa pengontrol root ini seperti ini:
class RootController: UIViewController {
override func preferredStatusBarStyle() -> UIStatusBarStyle {
return .LightContent
}
}
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 Anda Info.plist
untuk membuat ini berfungsi (yang merupakan default).
Sebagian besar jawaban tidak termasuk implementasi childViewControllerForStatusBarStyle
metode yang baik untuk UINavigationController
. 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.
override var childViewControllerForStatusBarStyle: UIViewController? {
var childViewController = visibleViewController
if let controller = childViewController, controller.isBeingDismissed {
childViewController = topViewController
}
return childViewController?.childViewControllerForStatusBarStyle ?? childViewController
}
Sedangkan untuk iOS 13.4 preferredStatusBarStyle
metode dalam UINavigationController
kategori tidak akan dipanggil, swizzling tampaknya menjadi satu-satunya pilihan tanpa perlu menggunakan subkelas.
Contoh:
Header kategori:
@interface UINavigationController (StatusBarStyle)
+ (void)setUseLightStatusBarStyle;
@end
Penerapan:
#import "UINavigationController+StatusBarStyle.h"
#import <objc/runtime.h>
@implementation UINavigationController (StatusBarStyle)
void (^swizzle)(Class, SEL, SEL) = ^(Class c, SEL orig, SEL new){
Method origMethod = class_getInstanceMethod(c, orig);
Method newMethod = class_getInstanceMethod(c, new);
if(class_addMethod(c, orig, method_getImplementation(newMethod), method_getTypeEncoding(newMethod)))
class_replaceMethod(c, new, method_getImplementation(origMethod), method_getTypeEncoding(origMethod));
else
method_exchangeImplementations(origMethod, newMethod);
};
+ (void)setUseLightStatusBarStyle {
swizzle(self.class, @selector(preferredStatusBarStyle), @selector(_light_preferredStatusBarStyle));
}
- (UIStatusBarStyle)_light_preferredStatusBarStyle {
return UIStatusBarStyleLightContent;
}
@end
Penggunaan di AppDelegate.h:
#import "UINavigationController+StatusBarStyle.h"
[UINavigationController setUseLightStatusBarStyle];
Inilah metode saya untuk menyelesaikan ini.
Tetapkan protokol yang disebut AGViewControllerAppearance .
AGViewControllerAppearance.h
#import <Foundation/Foundation.h>
@protocol AGViewControllerAppearance <NSObject>
@optional
- (BOOL)showsStatusBar;
- (BOOL)animatesStatusBarVisibility;
- (UIStatusBarStyle)preferredStatusBarStyle;
- (UIStatusBarAnimation)prefferedStatusBarAnimation;
@end
Tentukan kategori pada UIViewController yang disebut Peningkatan .
UIViewController + Upgrade.h
#import <UIKit/UIKit.h>
@interface UIViewController (Upgrade)
//
// Replacements
//
- (void)upgradedViewWillAppear:(BOOL)animated;
@end
UIViewController + Upgrade.m
#import "UIViewController+Upgrade.h"
#import <objc/runtime.h>
#import "AGViewControllerAppearance.h" // This is the appearance protocol
@implementation UIViewController (Upgrade)
+ (void)load
{
#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Wselector"
Method viewWillAppear = class_getInstanceMethod(self, @selector(viewWillAppear:));
#pragma clang diagnostic pop
Method upgradedViewWillAppear = class_getInstanceMethod(self, @selector(upgradedViewWillAppear:));
method_exchangeImplementations(viewWillAppear, upgradedViewWillAppear);
}
#pragma mark - Implementation
- (void)upgradedViewWillAppear:(BOOL)animated
{
//
// Call the original message (it may be a little confusing that we're
// calling the 'same' method, but we're actually calling the original one :) )
//
[self upgradedViewWillAppear:animated];
//
// Implementation
//
if ([self conformsToProtocol:@protocol(AGViewControllerAppearance)])
{
UIViewController <AGViewControllerAppearance> *viewControllerConformingToAppearance =
(UIViewController <AGViewControllerAppearance> *)self;
//
// Status bar
//
if ([viewControllerConformingToAppearance respondsToSelector:@selector(preferredStatusBarStyle)])
{
BOOL shouldAnimate = YES;
if ([viewControllerConformingToAppearance respondsToSelector:@selector(animatesStatusBarVisibility)])
{
shouldAnimate = [viewControllerConformingToAppearance animatesStatusBarVisibility];
}
[[UIApplication sharedApplication] setStatusBarStyle:[viewControllerConformingToAppearance preferredStatusBarStyle]
animated:shouldAnimate];
}
if ([viewControllerConformingToAppearance respondsToSelector:@selector(showsStatusBar)])
{
UIStatusBarAnimation animation = UIStatusBarAnimationSlide;
if ([viewControllerConformingToAppearance respondsToSelector:@selector(prefferedStatusBarAnimation)])
{
animation = [viewControllerConformingToAppearance prefferedStatusBarAnimation];
}
[[UIApplication sharedApplication] setStatusBarHidden:(! [viewControllerConformingToAppearance showsStatusBar])
withAnimation:animation];
}
}
}
@end
Sekarang, saatnya untuk mengatakan bahwa Anda melihat pengontrol sedang mengimplementasikan AGViewControllerAppearance protokol .
Contoh:
@interface XYSampleViewController () <AGViewControllerAppearance>
... the rest of the interface
@end
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.
Perhatikan bahwa saat menggunakan self.navigationController.navigationBar.barStyle = UIBarStyleBlack;
solusi
pastikan untuk pergi ke plist Anda dan atur "Lihat tampilan bilah status berbasis pengontrol" ke YES. Jika TIDAK, itu tidak akan berhasil.
Sejak Xcode 11.4, menimpa preferredStatusBarStyle
properti di ekstensi UINavigationController tidak lagi berfungsi karena tidak akan dipanggil.
Mengatur barStyle
dari navigationBar
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 menyetel barStyle
ke hitam, userInterfaceStyle
tampilan yang tertanam di navigationBar akan selalu memiliki userInterfaceStyle.dark
terlepas dari userInterfaceStyle
aplikasi.
Solusi tepat yang saya temukan adalah dengan menambahkan subkelas UINavigationController
dan menimpa di preferredStatusBarStyle
sana. Jika Anda kemudian menggunakan UINavigationController khusus ini untuk semua tampilan Anda, Anda akan berada di sisi penyimpanan.
NavigationController atau TabBarController adalah yang perlu menyediakan gaya. Inilah cara saya memecahkan: https://stackoverflow.com/a/39072526/242769