दिलचस्प पोस्ट
मैं एंड्रॉइड के सिस्टम संस्करण को कैसे देख सकता हूं? ओरेकल एसक्यूएल डेवलपर में मैं चर का उपयोग कैसे करूं? मैं कैसे पता लगा सकता है कि किस DOM तत्व का ध्यान केंद्रित है? एमएसबिल्ड के साथ वेब कैसे प्रकाशित करें? क्या आकार और द्रव्यमान के मामले में यथार्थवादी एन-बॉडी सौर प्रणाली सिमुलेशन करना संभव है? JAXB: मार्शल कैसे <key> मान </ key> में मैप करें जावा में ग्रेगोरी कैलेंडर की तारीख के साथ तुलना करने के लिए मुझे जावा दिनांक से वर्ष, महीना, दिन आदि प्राप्त करना है। क्या यह संभव है? PHP में एसिंक्रोनस शैल एप यह रीजेक्स कैरेट की अनुमति क्यों दे रहा है? PHP में, आप एक सरणी तत्व की कुंजी कैसे बदलते हैं? मैं इस asp.net MVC SelectList को कैसे काम कर सकता हूं? एंड्रॉइड में Google मानचित्र वी 2 में मुफ्त हाथ बहुभुज कैसे आकर्षित करें? फॉर्म सबमिट होने के बाद मैं पृष्ठभूमि में PHP स्क्रिप्ट कैसे चला सकता हूं? JQuery के सत्यापन प्लगइन के साथ बूटस्ट्रैप 3 मैं सी में base64 सांकेतिक शब्दों में बदलना (डीकोड) कैसे करूँ?

पसंदीदा स्टैटस बार्स स्टाइल को नहीं कहा जाता है

मैं ओवरराइड करने के लिए इस धागे का पीछा किया -preferredStatusBarStyle , लेकिन यह नहीं कहा जाता है। क्या कोई विकल्प है जो मैं इसे सक्षम करने के लिए बदल सकता हूँ? (मैं अपने प्रोजेक्ट में XIB का उपयोग कर रहा हूं।)

वेब के समाधान से एकत्रित समाधान "पसंदीदा स्टैटस बार्स स्टाइल को नहीं कहा जाता है"

संभव मूल कारण

मुझे एक ही समस्या थी, और यह पता लगा कि यह हो रहा था क्योंकि मैं अपने अनुप्रयोग विंडो में रूट व्यू नियंत्रक सेट नहीं कर रहा था।

UIViewController जिसमें मैंने preferredStatusBarStyle UIViewController को कार्यान्वित किया था UITabBarController में उपयोग किया गया था, जो कि स्क्रीन पर दृश्यों के दृश्य को नियंत्रित करता था।

जब मैं रूट व्यू नियंत्रक को इस UITabBarController को इंगित करने के लिए सेट किया है, तो स्थिति पट्टी में परिवर्तन सही ढंग से काम करना शुरू हो गया है, जैसा कि अपेक्षित (और preferredStatusBarStyle विधि कहला रही थी)।

 (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { ... // other view controller loading/setup code self.window.rootViewController = rootTabBarController; [self.window makeKeyAndVisible]; return YES; } 

वैकल्पिक विधि (आईओएस 9 में पदावनत)

वैकल्पिक रूप से, आप setNeedsStatusBarAppearanceUpdate का उपयोग करने के बजाय, अपने प्रत्येक दृश्य नियंत्रकों में, अपने पृष्ठभूमि रंग के आधार पर, निम्न विधियों में से एक को कॉल कर सकते हैं:

 [[UIApplication sharedApplication] setStatusBarStyle:UIStatusBarStyleLightContent]; 

या

 [[UIApplication sharedApplication] setStatusBarStyle:UIStatusBarStyleDefault]; 

ध्यान दें कि यदि आप इस पद्धति का उपयोग करते हैं तो आपको प्लिस्ट फ़ाइल में किसी भी को UIViewControllerBasedStatusBarAppearance सेट करना होगा।

UINavigationController का उपयोग करने वाले किसी के लिए:

UINavigationController अपने बच्चे को देखने नियंत्रकों को preferredStatusBarStyle पर क्लिक नहीं करता है। इसके बजाए यह अपने स्वयं के राज्य का प्रबंधन करता है – जैसा कि यह चाहिए, यह स्क्रीन के ऊपर स्थित है जहां स्टेटस बार रहता है और इसके लिए जिम्मेदार होना चाहिए। इसके लिए एक नव नियंत्रक के भीतर अपने वीसी में preferredStatusBarStyle स्टैटस बार्स स्टाइल को कार्यान्वित करने के लिए कुछ भी नहीं होगा – उन्हें कभी भी फोन नहीं किया जाएगा।

यह चाल यही है कि UINavigationController UIStatusBarStyleDefault या UIStatusBarStyleLightContent लिए क्या वापस लौटाएगा यह निर्णय लेने के लिए उपयोग करता है। यह इस पर UINavigationBar.barStyle का आधार है। डिफ़ॉल्ट ( UIBarStyleDefault ) का परिणाम अंधेरे अग्रभूमि UIStatusBarStyleDefault स्थिति बार में होता है। और UIBarStyleBlack एक UIStatusBarStyleLightContent स्टेटस बार देगा।

टी एल; डॉ:

यदि आप UIStatusBarStyleLightContent को UINavigationController उपयोग करना चाहते हैं:

 self.navigationController.navigationBar.barStyle = UIBarStyleBlack; 

इसलिए मैंने वास्तव में यूआईएनवीगेशन नियंत्रक के लिए एक श्रेणी जोड़ा लेकिन तरीकों का इस्तेमाल किया:

 -(UIViewController *)childViewControllerForStatusBarStyle; -(UIViewController *)childViewControllerForStatusBarHidden; 

और वे वर्तमान दृश्यमान UIViewController को वापस आते थे इससे मौजूदा दृश्यमान दृश्य नियंत्रक अपनी पसंदीदा शैली / दृश्यता सेट कर देता है।

इसके लिए यहां एक पूर्ण कोड स्निपेट है:

स्विफ्ट में:

 extension UINavigationController { public override func childViewControllerForStatusBarHidden() -> UIViewController? { return self.topViewController } public override func childViewControllerForStatusBarStyle() -> UIViewController? { return self.topViewController } } 

उद्देश्य-सी में:

 @interface UINavigationController (StatusBarStyle) @end @implementation UINavigationController (StatusBarStyle) -(UIViewController *)childViewControllerForStatusBarStyle { return self.topViewController; } -(UIViewController *)childViewControllerForStatusBarHidden { return self.topViewController; } @end 

और अच्छे उपाय के लिए, यहां एक UIViewController में यह कार्यान्वित किया गया है:

स्विफ्ट में

 override public func preferredStatusBarStyle() -> UIStatusBarStyle { return .LightContent } override func prefersStatusBarHidden() -> Bool { return false } 

उद्देश्य-सी में

 -(UIStatusBarStyle)preferredStatusBarStyle { return UIStatusBarStyleLightContent; // your own style } - (BOOL)prefersStatusBarHidden { return NO; // your own visibility code } 

अंत में, सुनिश्चित करें कि आपका ऐप प्लिस्ट में "नियंत्रक आधारित स्थिति बार उपस्थिति देखें" सेट नहीं होता है या तो उस पंक्ति को हटाएं या इसे YES पर सेट करें (जो मुझे विश्वास है कि आईओएस 7 के लिए अब डिफ़ॉल्ट है?)

अभी भी इस के साथ संघर्ष करने वाले किसी भी व्यक्ति के लिए, इस सरल विस्तार में तेजी से आपके लिए समस्या को हल करना चाहिए

 extension UINavigationController { override open var childViewControllerForStatusBarStyle: UIViewController? { return self.topViewController } } 

UINavigationController में स्टेटस बार रंग को सफेद करने के लिए टायसन का उत्तर सही है।

अगर किसी को AppDelegate में कोड लिखकर एक ही परिणाम हासिल करना है तो कोड का उपयोग करें और उसे AppDelegate's didFinishLaunchingWithOptions पद्धति AppDelegate's अंदर लिखें।

और। Plist फ़ाइल में YES UIViewControllerBasedStatusBarAppearance सेट करने के लिए मत भूलना, अन्यथा परिवर्तन प्रतिबिंबित नहीं होगा

कोड

 - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { // status bar appearance code [[UINavigationBar appearance] setBarStyle:UIBarStyleBlack]; return YES; } 

हिप्पो के उत्तर के लिए एक अतिरिक्त: यदि आप एक UINavigationController का उपयोग कर रहे हैं, तो यह एक श्रेणी को जोड़ने के लिए शायद बेहतर है:

 // 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 

यह समाधान संभवतया जल्द-से-अधिक पदावनत व्यवहार पर स्विच करने से बेहतर होता है।

यदि आपका व्यू नियंत्रक UINavigationController के अंतर्गत है

उपवर्ग UINavigationController और जोड़ें

 override var preferredStatusBarStyle: UIStatusBarStyle { return topViewController?.preferredStatusBarStyle ?? .default } 

ViewController की preferredStatusBarStyle StatusBarStyle कहा जाएगा।

आईओएस 7 में यूआईटीटसबारस्टाइल

आईओएस 7 में स्टेटस पट्टी पारदर्शी है, इसके पीछे का दृश्य दिखाता है।

स्टेटस बार की शैली इसकी सामग्री के दिखावे को संदर्भित करती है। IOS 7 में, स्थिति पट्टी सामग्री या तो अंधेरे ( UIStatusBarStyleDefault ) या प्रकाश ( UIStatusBarStyleLightContent ) है दोनों UIStatusBarStyleBlackTranslucent और UIStatusBarStyleBlackOpaque IOS 7.0 में पदावनत कर रहे हैं। इसके बजाय UIStatusBarStyleLightContent उपयोग करें

UIStatusBarStyle कैसे बदलें

यदि स्थिति पट्टी के नीचे एक नेविगेशन बार है, तो स्थिति पट्टी शैली को नेविगेशन बार शैली ( UINavigationBar.barStyle ) से मिलान करने के लिए समायोजित किया जाएगा:

विशेष रूप से, यदि नेविगेशन बार शैली UIBarStyleDefault है, तो स्टेटस बार शैली UIStatusBarStyleDefault होगी; यदि नेविगेशन बार शैली UIBarStyleBlack , तो स्टेटस बार शैली UIStatusBarStyleLightContent होगी

अगर स्थिति पट्टी के नीचे कोई नेविगेशन बार नहीं है, तो स्थिति पट्टी शैली को नियंत्रित किया जा सकता है और ऐप चलाता है, जबकि एक व्यक्तिगत दृश्य नियंत्रक द्वारा बदल दिया।

[UIViewController preferredStatusBarStyle] IOS में जोड़ा गया एक नई विधि है 7. यह पसंदीदा स्थिति पट्टी शैली वापस लौटने के लिए ओवरराइड किया जा सकता है:

 - (UIStatusBarStyle)preferredStatusBarStyle { return UIStatusBarStyleLightContent; } 

यदि स्टेटस बार शैली को स्वयं के बजाय एक बच्चे को देखने नियंत्रक द्वारा नियंत्रित किया जाना चाहिए, ओवरराइड -[UIViewController childViewControllerForStatusBarStyle] उस बच्चे को देखने नियंत्रक को वापस करने के लिए

यदि आप इस व्यवहार से ऑप्ट आउट करना पसंद करते हैं और -[UIApplication statusBarStyle] विधि का उपयोग करके स्थिति पट्टी शैली सेट करना पसंद करते हैं, तो ऐप की Info.plist फ़ाइल में UIViewControllerBasedStatusBarAppearance कुंजी को जोड़ें और इसे मान NO प्रदान करें।

@ सेरेन के उत्तर अभी भी यूआईनाविगेशन नियंत्रकों के मामले में एक महान है। हालांकि, तेज 3 के लिए बाल वीयूआईसी नियंत्रक फ़ंक्शंस को बदला गया है। तो UINavigationController एक्सटेंशन कोड होना चाहिए:

 override open var childViewControllerForStatusBarStyle: UIViewController? { return topViewController } override open var childViewControllerForStatusBarHidden: UIViewController? { return topViewController } 

और फिर दृश्य नियंत्रक को उस स्थिति बार शैली को नियंत्रित करना चाहिए:

 override var preferredStatusBarStyle: UIStatusBarStyle { return .lightContent } 

स्विफ्ट 3 आईओएस 10 समाधान:

 override var preferredStatusBarStyle: UIStatusBarStyle { return .lightContent } 

यदि कोई नेविगेशन नियंत्रक का उपयोग कर रहा है और अपने सभी नेविगेशन नियंत्रकों को ब्लैक स्टाइल चाहता है, तो आप इसे स्विफ्ट 3 में यूआईनेविगेशन नियंत्रक के लिए एक एक्सटेंशन लिख सकते हैं और यह सभी नेविगेशन नियंत्रकों पर लागू होगा (इसे एक नियंत्रक को निर्दिष्ट करने के बजाय पहर)।

 extension UINavigationController { override open func viewDidLoad() { super.viewDidLoad() self.navigationBar.barStyle = UIBarStyle.black } } 

इस को हल करने के लिए यहां मेरा तरीका है

AGViewControllerAppearance नामक प्रोटोकॉल को परिभाषित करें

AGViewControllerAppearance.h

 #import <Foundation/Foundation.h> @protocol AGViewControllerAppearance <NSObject> @optional - (BOOL)showsStatusBar; - (BOOL)animatesStatusBarVisibility; - (UIStatusBarStyle)preferredStatusBarStyle; - (UIStatusBarAnimation)prefferedStatusBarAnimation; @end 

अपग्रेड नामक UIViewController पर एक श्रेणी को परिभाषित करें।

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 

अब, यह कहने का समय है कि आप देख रहे हैं कि नियंत्रक एजीवीआईयूआईयूसीएल नियंत्रक एपपरेशन प्रोटोकॉल को लागू कर रहा है।

उदाहरण:

 @interface XYSampleViewController () <AGViewControllerAppearance> ... the rest of the interface @end 

बेशक, आप प्रोटोकॉल और UIViewController + अपग्रेड से शेष तरीकों ( शो स्टेथसबर , एनिमेटिवस्टासबारिविसिबिलिटी , प्रीफेडस्टैटसबरअनिमेशन ) को लागू कर सकते हैं उनके द्वारा प्रदान किए गए मानों के आधार पर उचित अनुकूलन करेंगे।

अगर कोई इस समस्या में UISearchController के साथ चला जाता है बस UISearchController का एक नया उप-वर्ग बनाएं, और उसके बाद उस वर्ग में नीचे कोड जोड़ें:

 override func preferredStatusBarStyle() -> UIStatusBarStyle { return .LightContent } 

स्विफ्ट में किसी भी प्रकार के UIViewController के लिए:

अपने AppDelegate सेट में:

 func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool { window!.rootViewController = myRootController return true } 

myRootController किसी भी प्रकार की UIViewController हो सकता है, जैसे UITabBarController या UINavigationController

उसके बाद, इस रूट नियंत्रक को इस तरह ओवरराइड करें:

 class RootController: UIViewController { override func preferredStatusBarStyle() -> UIStatusBarStyle { return .LightContent } } 

इससे आपके संपूर्ण ऐप में स्टेटस बार का रूप बदल जाएगा, क्योंकि रूट नियंत्रक स्थिति बार उपस्थिति के लिए पूरी तरह ज़िम्मेदार है।

संपत्ति को सेट करने के लिए याद रखें View controller-based status bar appearance लिए आपकी जानकारी। Info.plist में यह काम करें (जो कि डिफ़ॉल्ट है)।

UINavigationController पर, preferredStatusBarStyle topViewController को नहीं बुलाया जाता है क्योंकि इसके topViewController self को पसंद करते self इसलिए, preferredStatusBarStyle childViewControllerForStatusBarStyle को बुलाया जाने वाला स्थान प्राप्त करने के लिए, आपको अपने childViewControllerForStatusBarStyle को बदलना childViewControllerForStatusBarStyle

यह एक यूआईनेविगेशन नियंत्रक के लिए (मेरी सिफारिश):

 class MyRootNavigationController: UINavigationController { override func preferredStatusBarStyle() -> UIStatusBarStyle { return .LightContent } override func childViewControllerForStatusBarStyle() -> UIViewController? { return nil } } 

यह सभी UINAVigationController के लिए करने के लिए (चेतावनी: यह UIDocumentPickerViewController, UIImagePickerController, आदि को प्रभावित करता है):

 extension UINavigationController { public override func preferredStatusBarStyle() -> UIStatusBarStyle { return .LightContent } public override func childViewControllerForStatusBarStyle() -> UIViewController? { return nil } } 

नेविगेशन कंट्रोलर या टैबबेर कंट्रोलर हैं जिन्हें स्टाइल प्रदान करने की आवश्यकता होती है। यहां कैसे हल किया गया है: https://stackoverflow.com/a/39072526/242769

ध्यान दें कि self.navigationController.navigationBar.barStyle = UIBarStyleBlack; का उपयोग करते समय self.navigationController.navigationBar.barStyle = UIBarStyleBlack; उपाय

अपने प्लिस्ट पर जाएं और "नियंत्रक-आधारित स्थिति पट्टी उपस्थिति देखें" को हाँ पर सेट करें। यदि यह नहीं है तो यह काम नहीं करेगा।