Geçersiz kılmak için bu iş parçacığını izledim -preferredStatusBarStyle
, ancak çağrılmıyor. Etkinleştirmek için değiştirebileceğim herhangi bir seçenek var mı? (Projemde XIB kullanıyorum.)
Geçersiz kılmak için bu iş parçacığını izledim -preferredStatusBarStyle
, ancak çağrılmıyor. Etkinleştirmek için değiştirebileceğim herhangi bir seçenek var mı? (Projemde XIB kullanıyorum.)
Yanıtlar:
Aynı sorunu yaşadım ve uygulama penceremde kök görünüm denetleyicisini ayarlamadığım için bunun olduğunu anladım.
UIViewController
Ben hayata geçirdiklerini ettiği preferredStatusBarStyle
bir kullanılmıştır UITabBarController
ekranda görüşleri görünümünü kontrol, hangi.
Kök görünüm denetleyicisini buna işaret edecek şekilde ayarladığımda, UITabBarController
durum çubuğu değişiklikleri beklendiği gibi düzgün çalışmaya başladı (ve preferredStatusBarStyle
yöntem çağrıldı).
(BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
... // other view controller loading/setup code
self.window.rootViewController = rootTabBarController;
[self.window makeKeyAndVisible];
return YES;
}
Alternatif olarak, arka plan rengine bağlı olarak, kullanmak yerine, görünüm denetleyicilerinizin her birinde aşağıdaki yöntemlerden birini uygun şekilde çağırabilirsiniz setNeedsStatusBarAppearanceUpdate
:
[[UIApplication sharedApplication] setStatusBarStyle:UIStatusBarStyleLightContent];
veya
[[UIApplication sharedApplication] setStatusBarStyle:UIStatusBarStyleDefault];
Ayrıca sette gerekeceğini Not UIViewControllerBasedStatusBarAppearance
için NO
bu yöntemi kullanırsanız plist dosyasında.
setNeedsStatusBarAppearanceUpdate
şüphelendim - bu değişikliği yaptığımda şüphelerim doğrulandı.
UINavigationController kullanan herkes için:
Bu UINavigationController
, preferredStatusBarStyle
çağrıları alt görünüm denetleyicilerine iletmez . Bunun yerine kendi durumunu yönetir - olması gerektiği gibi, ekranın üst kısmında durum çubuğunun yaşadığı ve bu nedenle bundan sorumlu olması gereken çizimi çizer. Bunun içinpreferredStatusBarStyle
VC'lerinizde bir nav denetleyicisi içinde yapmak hiçbir şey yapmaz - bunlar asla çağrılmaz.
Hüner nedir UINavigationController
için dönmeye karar için kullandığı UIStatusBarStyleDefault
ya UIStatusBarStyleLightContent
. Bunu dayandırıyor UINavigationBar.barStyle
. Varsayılan ( UIBarStyleDefault
), karanlık ön plan UIStatusBarStyleDefault
durum çubuğuyla sonuçlanır . Ve UIBarStyleBlack
birUIStatusBarStyleLightContent
durum çubuğu .
TL; DR:
UIStatusBarStyleLightContent
Bir UINavigationController
kullanım istiyorsanız :
self.navigationController.navigationBar.barStyle = UIBarStyleBlack;
preferredStatusBarStyle
Eğer (set gezinti çubuğunu gizlemek durumunda aslında irade çocuk görünümü denetleyicisinde denilen olsun navigationBarHidden
için YES
) tam uygun olarak,.
[[UINavigationBar appearance] setBarStyle:UIBarStyleBlack]
navigationBarHidden
seti için YES
aslında olacaktır preferredStatusBarStyle
denir ve bu rastlamak ihtimali olanlarla bir uyarı: Bu çalışır navigationBarHidden
, ancak birlikte navigationBar.hidden
!
Bu yüzden aslında UINavigationController için bir kategori ekledim ama yöntemleri kullandım:
-(UIViewController *)childViewControllerForStatusBarStyle;
-(UIViewController *)childViewControllerForStatusBarHidden;
ve mevcut görünür UIViewController'ı döndürdü. Bu, mevcut görünür görünüm denetleyicisinin kendi tercih ettiği stili / görünürlüğü ayarlamasını sağlar.
İşte bunun için tam bir kod snippet'i:
Swift'te:
extension UINavigationController {
public override func childViewControllerForStatusBarHidden() -> UIViewController? {
return self.topViewController
}
public override func childViewControllerForStatusBarStyle() -> UIViewController? {
return self.topViewController
}
}
Hedef-C'de:
@interface UINavigationController (StatusBarStyle)
@end
@implementation UINavigationController (StatusBarStyle)
-(UIViewController *)childViewControllerForStatusBarStyle {
return self.topViewController;
}
-(UIViewController *)childViewControllerForStatusBarHidden {
return self.topViewController;
}
@end
Ve iyi bir ölçü için, bir UIViewController'da nasıl uygulandığı aşağıda açıklanmıştır:
Swift'te
override public func preferredStatusBarStyle() -> UIStatusBarStyle {
return .LightContent
}
override func prefersStatusBarHidden() -> Bool {
return false
}
Hedef-C'de
-(UIStatusBarStyle)preferredStatusBarStyle {
return UIStatusBarStyleLightContent; // your own style
}
- (BOOL)prefersStatusBarHidden {
return NO; // your own visibility code
}
Son olarak, emin olun uygulama Plist gelmez DEĞİL NO "Görünüm denetketiyicili durum çubuğu görünümü" set var. Ya bu satırı silin ya da EVET olarak ayarlayın (ki şimdi iOS 7 için varsayılan olduğuna inanıyorum?)
return self.topViewController;
Benim için çalışıyor gibi görünüyor , ama return self.visibleViewController;
- değil
super
Bu yöntemi çağırmanız gerekmez ve aslında bu tür tüm denetleyicilerin davranışlarını değiştirmek istersiniz
Hala bununla mücadele eden herkes için, hızlı bir şekilde bu basit uzantı sizin için sorunu çözmelidir.
extension UINavigationController {
override open var childForStatusBarStyle: UIViewController? {
return self.topViewController
}
}
Benim app her üç kullandı: UINavigationController
, UISplitViewController
, UITabBarController
, böylece bunların hepsi durum çubuğunun üzerine kontrol altına almak gibi görünüyor ve neden olacaktır preferedStatusBarStyle
çocukları için çağrılacak değil. Bu davranışı geçersiz kılmak için, yanıtların geri kalanı gibi bir uzantı oluşturabilirsiniz. İşte Swift 4'te her üçü için bir uzantı. Apple bu tür şeyler hakkında daha açık olsaydı.
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
}
}
Düzenleme: Swift 4.2 API değişiklikleri için güncelleme
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
}
}
Durum çubuğu rengini beyaz olarak değiştirmek için Tyson'ın yanıtı doğrudurUINavigationController
.
Herkes kodunu yazarak aynı sonucu elde etmek istiyorsa, AppDelegate
aşağıdaki kodu kullanın ve AppDelegate's
didFinishLaunchingWithOptions
yöntemi içine yazın .
Ve ayarlamak unutmayın UIViewControllerBasedStatusBarAppearance
için YES
başka değişiklik yansıtmaz, .plist dosyada.
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
// status bar appearance code
[[UINavigationBar appearance] setBarStyle:UIBarStyleBlack];
return YES;
}
Bir UINavigationController üzerinde preferredStatusBarStyle
çağrılmaz çünkü topViewController
tercih edilir self
. Yani, preferredStatusBarStyle
bir UINavigationController çağırmak için, değiştirmeniz gerekir childViewControllerForStatusBarStyle
.
Sınıfınızdaki UINavigationController'ınızı geçersiz kılın:
class MyRootNavigationController: UINavigationController {
override var preferredStatusBarStyle: UIStatusBarStyle {
return .lightContent
}
override var childViewControllerForStatusBarStyle: UIViewController? {
return nil
}
}
Tüm UINavigationController için bunu yapmak için bir uzantıda geçersiz kılabilirsiniz (uyarı: UIDocumentPickerViewController, UIImagePickerController, vb. Etkiler), ancak muhtemelen Swift belgelerine göre yapmamalısınız :
extension UINavigationController {
open override var preferredStatusBarStyle: UIStatusBarStyle {
return .lightContent
}
open override var childViewControllerForStatusBarStyle: UIViewController? {
return nil
}
}
Serenn'in cevabına ek olarak, modalPresentationStyle
(örneğin .overCurrentContext
) bir görünüm kontrolörü sunuyorsanız , bunu yeni sunulan görünüm kontrol cihazında da çağırmalısınız:
presentedViewController.modalPresentationCapturesStatusBarAppearance = true
preferredStatusBarStyle
Sunulan görünüm denetleyicisinde de geçersiz kılmayı unutmayın .
Hippo'nun cevabına ek olarak: bir UINavigationController kullanıyorsanız, bir kategori eklemek muhtemelen daha iyidir:
// 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
Bu çözüm, yakında kullanımdan kaldırılacak davranışa geçmekten daha iyidir.
preferredStatusBarStyle
ve UINavigationController'a özgü mantık yapar. Şu anda bu mantık dayanmaktadır, navigationBar.barStyle
ancak ek kontroller ekleniyor görebilirsiniz (örneğin UISearchDisplayController
navbar modunu gizlemek için hareket). Varsayılan mantığı geçersiz kılarak, tüm bu işlevleri kaybedersiniz ve kendinizi gelecekte can sıkıcı 'wtf' anlarına açık bırakırsınız. Dahili gezinme denetleyicisi davranışını desteklemeye devam ederken, bunu yapmanın doğru yolu için yukarıdaki cevabıma bakın.
Seçilen yanıtta belirtildiği gibi , temel neden pencere kök görünümü denetleyici nesnesini kontrol etmektir.
childForStatusBarStyle
Aşağıdaki uzantıları kullanın, yukarıdaki senaryoların tümünü işler -
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
anahtar girmenize gerek yokturinfo.plist
Modal olarak yeni akış sunmanız durumunda, mevcut durum çubuğu stil akışından ayrılır. Bu nedenle, bir NewFlowUIViewController
navigasyon cihazı sunduğunuzu varsayalım ve ardından yeni gezinme veya tabBar denetleyicisi NewFlowUIViewController
ekledikten sonra NewFlowUIViewController
daha fazla görünüm denetleyicisinin durum çubuğu stilini yönetmek için de uzantı ekleyin .
Eğer set modalPresentationStyle dışındaki fullScreen
modally sunarken, ayarlamanız gerekir modalPresentationCapturesStatusBarAppearance
bu sunulan görünüm denetleyicisi durum çubuğu görünümü kontrolünü almalıdır böylece true.
UINavigationController
bir alt sınıfıdır UIViewController
(kim bilir sub) sınıftır!
Bu nedenle, gezinme denetleyicilerine katıştırılmış görünüm denetleyicilerini sunarken, katıştırılmış görünüm denetleyicilerini gerçekten sunmuyorsunuz; navigasyon denetleyicilerini sunuyorsunuz! UINavigationController
, alt sınıfı olarak UIViewController
, devralınır preferredStatusBarStyle
vechildForStatusBarStyle
istediğiniz şekilde ayarlayabilirsiniz.
Aşağıdaki yöntemlerden herhangi biri çalışmalıdır:
info.plist
şu mülkü ekleyin:
UIUserInterfaceStyle
(diğer adıyla "Kullanıcı Arayüzü Stili")preferredStatusBarStyle
Içinde geçersiz kılUINavigationController
preferredStatusBarStyle
( doc ) - Görünüm denetleyicisi için tercih edilen durum çubuğu stiliAlt sınıf veya genişletme UINavigationController
class MyNavigationController: UINavigationController {
override var preferredStatusBarStyle: UIStatusBarStyle {
.lightContent
}
}
VEYA
extension UINavigationController {
open override var preferredStatusBarStyle: UIStatusBarStyle {
.lightContent
}
}
childForStatusBarStyle
Içinde geçersiz kılUINavigationController
childForStatusBarStyle
( doc ) - Sistemin durum çubuğu stilini belirlemek için görünüm denetleyicisine ihtiyacı olduğunda çağrılır"Kapsayıcı görünüm denetleyiciniz durum çubuğu stilini alt görünüm denetleyicilerinden birinden alıyorsa, [bu özelliği geçersiz kıl] ve bu alt görünüm denetleyicisini döndürür. Nil döndürürseniz veya bu yöntemi geçersiz kılmazsanız, kendi kendine ilişkin durum çubuğu stili kullanılır Bu yöntemden döndürülen değer değişirse, setNeedsStatusBarAppearanceUpdate () yöntemini çağırın. "
Alt sınıf veya genişletme UINavigationController
class MyNavigationController: UINavigationController {
override var childForStatusBarStyle: UIViewController? {
topViewController
}
}
VEYA
extension UINavigationController {
open override var childForStatusBarStyle: UIViewController? {
topViewController
}
}
Yukarıda istediğiniz herhangi bir görünüm denetleyicisini iade edebilirsiniz. Aşağıdakilerden birini öneririm:
topViewController
(of UINavigationController
) ( doc ) - Gezinme yığınının üst kısmındaki görünüm denetleyicisivisibleViewController
(of UINavigationController
) ( doc ) - Gezinme arayüzünde o anda görülebilen görünümle ilişkilendirilmiş görünüm denetleyicisi (ipucu: bu, "gezinme denetleyicisinin üzerinde kalıcı olarak sunulan bir görünüm denetleyicisini" içerebilir)Not: Alt sınıfa karar verirseniz UINavigationController
, IB'deki kimlik denetçisi aracılığıyla bu sınıfı nav denetleyicilerinize uygulamayı unutmayın.
PS Kodum Swift 5.1 sözdizimini kullanıyor 😎
@ serenn'in yukarıdaki cevabı hala UINavigationControllers için harika bir cevap. Ancak, hızlı 3 için childViewController işlevleri olarak değiştirildi vars
. Dolayısıyla UINavigationController
uzantı kodu şöyle olmalıdır:
override open var childViewControllerForStatusBarStyle: UIViewController? {
return topViewController
}
override open var childViewControllerForStatusBarHidden: UIViewController? {
return topViewController
}
Ve sonra durum denetleyicisi stilini dikte etmesi gereken görünüm denetleyicisinde:
override var preferredStatusBarStyle: UIStatusBarStyle {
return .lightContent
}
ViewController cihazınız UINavigationController altındaysa.
UINavigationController alt sınıfı ve ekleme
override var preferredStatusBarStyle: UIStatusBarStyle {
return topViewController?.preferredStatusBarStyle ?? .default
}
ViewController preferredStatusBarStyle
çağrılacaktır.
İOS 7'de UIStatusBarStyle
İOS 7'deki durum çubuğu şeffaftır, arkasındaki görünüm gösterilir.
Durum çubuğunun stili, içeriğinin görünümüne atıfta bulunur. İOS 7'de durum çubuğu içeriği karanlık ( UIStatusBarStyleDefault
) veya açık ( UIStatusBarStyleLightContent
). Hem UIStatusBarStyleBlackTranslucent
ve UIStatusBarStyleBlackOpaque
iOS 7.0 kaldırılıyor. UIStatusBarStyleLightContent
Bunun yerine kullanın .
Nasıl değiştirilir UIStatusBarStyle
Durum çubuğunun altında bir gezinme çubuğu varsa, durum çubuğu stili gezinme çubuğu stiline uyacak şekilde ayarlanır ( UINavigationBar.barStyle
):
Özellikle, gezinme çubuğu stili UIBarStyleDefault ise, durum çubuğu stili UIStatusBarStyleDefault
; gezinme çubuğu stili ise UIBarStyleBlack
, durum çubuğu stiliUIStatusBarStyleLightContent
.
Durum çubuğunun altında gezinme çubuğu yoksa, durum çubuğu stili uygulama çalışırken ayrı bir görünüm denetleyicisi tarafından kontrol edilebilir ve değiştirilebilir.
- [UIViewController preferredStatusBarStyle]
iOS 7'de eklenen yeni bir yöntemdir. Tercih edilen durum çubuğu stilini döndürmek için geçersiz kılınabilir:
- (UIStatusBarStyle)preferredStatusBarStyle
{
return UIStatusBarStyleLightContent;
}
Durum çubuğu stilinin kendinden ziyade bir alt görünüm denetleyicisi tarafından denetlenmesi gerekiyorsa, geçersiz kılma -[UIViewController childViewControllerForStatusBarStyle]
o çocuk görüntüleme denetleyicisini döndürmek için .
Bu davranışı devre dışı bırakmak ve -[UIApplication statusBarStyle]
yöntemi kullanarak durum çubuğu stilini ayarlamak isterseniz , UIViewControllerBasedStatusBarAppearance
anahtarı bir uygulamanın Info.plist
dosyasına ekleyin ve ona NO değeri verin.
Birisi bir Gezinti Denetleyicisi kullanıyorsa ve tüm gezinme denetleyicilerinin siyah stile sahip olmasını istiyorsa, Swift 3'te UINavigationController'a böyle bir uzantı yazabilirsiniz ve tüm gezinme denetleyicilerine uygulanır ( zaman).
extension UINavigationController {
override open func viewDidLoad() {
super.viewDidLoad()
self.navigationBar.barStyle = UIBarStyle.black
}
}
Swift'te her türlü UIViewController için:
Senin içinde AppDelegate
sette:
func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool {
window!.rootViewController = myRootController
return true
}
myRootController
herhangi bir tür olabilir UIViewController
, örneğin UITabBarController
veya UINavigationController
.
Ardından, bu kök denetleyiciyi şu şekilde geçersiz kılın:
class RootController: UIViewController {
override func preferredStatusBarStyle() -> UIStatusBarStyle {
return .LightContent
}
}
Kök denetleyici durum çubuğu görünümünden yalnızca sorumlu olduğu için bu, uygulamanızdaki durum çubuğunun görünümünü değiştirir.
Bu işi yapmak için özelliği varsayılan View controller-based status bar appearance
olarak EVET olarak ayarlamayı unutmayın Info.plist
.
Cevapların çoğu, childViewControllerForStatusBarStyle
yöntemin iyi uygulanmasını içermez UINavigationController
. Deneyimlerime göre, navigasyon denetleyicisi üzerinden şeffaf görünüm denetleyicisinin sunulduğu durumları ele almalısınız. Bu durumlarda kontrolü modal kontrolörünüze ( visibleViewController
) geçirmelisiniz , ancak kaybolduğunda değil.
override var childViewControllerForStatusBarStyle: UIViewController? {
var childViewController = visibleViewController
if let controller = childViewController, controller.isBeingDismissed {
childViewController = topViewController
}
return childViewController?.childViewControllerForStatusBarStyle ?? childViewController
}
İOS 13.4'te olduğu preferredStatusBarStyle
gibiUINavigationController
İOS kategorideki çağrılmayacak, alt sınıf kullanmaya gerek kalmadan swizzling tek seçenek gibi görünüyor.
Misal:
Kategori başlığı:
@interface UINavigationController (StatusBarStyle)
+ (void)setUseLightStatusBarStyle;
@end
Uygulama:
#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
AppDelegate.h dosyasında kullanım:
#import "UINavigationController+StatusBarStyle.h"
[UINavigationController setUseLightStatusBarStyle];
İşte bunu çözme yöntemim.
AGViewControllerAppearance adlı bir protokol tanımlayın .
AGViewControllerAppearance.h
#import <Foundation/Foundation.h>
@protocol AGViewControllerAppearance <NSObject>
@optional
- (BOOL)showsStatusBar;
- (BOOL)animatesStatusBarVisibility;
- (UIStatusBarStyle)preferredStatusBarStyle;
- (UIStatusBarAnimation)prefferedStatusBarAnimation;
@end
UIViewController'da Upgrade adlı bir kategori tanımlayın .
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
Şimdi, görünüm denetleyicinizin AGViewControllerAppearance uygulamasını uyguladığını söylemenin zamanı geldi protokolünü .
Misal:
@interface XYSampleViewController () <AGViewControllerAppearance>
... the rest of the interface
@end
Tabii ki, yöntemlerin (kalanını uygulayabilirsiniz showsStatusBar , animatesStatusBarVisibility , prefferedStatusBarAnimation protokolü ve itibaren) UIViewController + Yükseltme onlar tarafından sağlanan değerlere dayalı uygun özelleştirme yapacağız.
Unutmayın ki self.navigationController.navigationBar.barStyle = UIBarStyleBlack;
Çözümü
plist'inize gidip "Denetleyici tabanlı durum çubuğu görünümünü görüntüle" seçeneğini EVET olarak ayarladığınızdan emin olun. HAYIR ise işe yaramaz.
Xcode 11.4'ten bu yana, preferredStatusBarStyle
11.4'ten beri, bir UINavigationController uzantısında özelliğin kılınması, çağrılmayacağından artık çalışmıyor.
Ayar barStyle
ait navigationBar
için .black
gerçekten işlerin ancak hafif ve karanlık modu için değişik görünüm NavigationBar için subviews eklerseniz bu istenmeyen yan etkileri ekleyecektir. Çünkü barStyle
siyah olarak ayarlandığında, userInterfaceStyle
navigationBar içine gömülmüş bir görünümün uygulaması, uygulamadan userInterfaceStyle.dark
bağımsız olarak her zaman olacaktır userInterfaceStyle
.
Ortaya koyduğum uygun çözüm, bir alt sınıf ekleyip oraya UINavigationController
geçersiz preferredStatusBarStyle
kılmaktır. Daha sonra tüm görünümleriniz için bu özel UINavigationController'ı kullanırsanız, kayıt tarafında olacaksınız.
NavigationController veya TabBarController, stili sağlaması gerekenlerdir. İşte nasıl çözdüğüm: https://stackoverflow.com/a/39072526/242769