नवीनतम अपडेट (Xcode 10+ / स्विफ्ट 4.2+)
यह लेख पिछले कई वर्षों से मौजूद विभिन्न दृष्टिकोणों के पीछे के तर्क को समझने के इच्छुक किसी भी व्यक्ति के लिए बरकरार है। इस बीच, Xcode 10 के रूप में , स्विफ्ट 4.2 का पहला दृष्टिकोण पदावनत है और अब समर्थित नहीं है (अर्थात यदि आप इसे नियोजित करने की कोशिश करेंगे तो प्रभावी नहीं होंगे )। Plist.info
ध्वज और कस्टमाइज़िंग अभ्यास के पीछे के तर्क को बेहतर ढंग से समझने के लिए आपकी जानकारी के लिए यह अभी भी संदर्भित है ।
महत्वपूर्ण स्पष्टीकरण
स्टेटस बार उपस्थिति को अनुकूलित करने के लिए दो दृष्टिकोणों को समझना बहुत महत्वपूर्ण है। वे अलग हैं और मिश्रित नहीं होना चाहिए।
पहला दृष्टिकोण - पूरे ऐप के लिए एक रंग (iOS7 से हटा दिया गया)
Info.plist में आप एक कुंजी को ढूंढते हैं या बनाते हैं
View controller-based status bar appearance
और इसे NO पर सेट करें ।
यह क्या करता है? यह अनिवार्य रूप से एक सेटिंग स्थापित करता है जो कहता है कि आपके आवेदन में, स्थिति बार उपस्थिति को प्रत्येक दृश्य नियंत्रक द्वारा व्यक्तिगत रूप से परिभाषित नहीं किया गया है । यह समझने के लिए सुपर महत्वपूर्ण है। इसका मतलब है कि आपके पास सभी स्क्रीन के लिए पूरे ऐप के लिए एकसमान सेटिंग है। दो सेटिंग्स हैं: default
जो सफेद पृष्ठभूमि पर काला पाठ है, या lightContent
जो काली पृष्ठभूमि पर सफेद पाठ है।
इनमें से एक को सेट करने के लिए ( सभी स्क्रीन के लिए एक सेटिंग ):
func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {
application.statusBarStyle = .lightContent // .default
return true
}
इस तरह आपको प्रत्येक दृश्य नियंत्रक पर इस सेटिंग को फिर से स्थापित करने की आवश्यकता नहीं होगी। हालाँकि, आप हमेशा स्वेच्छा से उपस्थिति बदलने के लिए इस पद्धति का सहारा ले सकते हैं।
दूसरा दृष्टिकोण - प्रत्येक दृश्य नियंत्रक के लिए अलग-अलग रंग
यह विपरीत है। इसे काम करने के लिए, info.plist पर आगे बढ़ें और सेट करें
View controller-based status bar appearance
, हाँ
इस तरह, जब भी कोई नया व्यू कंट्रोलर ओपन होता है, तो स्टेटस बार स्टाइल को व्यक्तिगत रूप से सेट किया जाता है यदि आप इस कार्यान्वयन को उस प्रत्येक UIViewController
उदाहरण में सम्मिलित करते हैं जिसकी आपको आवश्यकता है:
override var preferredStatusBarStyle: UIStatusBarStyle {
return .lightContent // .default
}
आपके पास पहले जैसा ही है, स्टेटसबार के लिए या तो डार्क या लाइट स्टाइल, प्रत्येक व्यू कंट्रोलर के लिए अलग-अलग सेट करें।
यह संपत्ति UIKit द्वारा दो परिदृश्यों में प्राप्त की गई है:
- स्क्रीन के आरंभीकरण पर, जब UI तैयार किया जा रहा हो।
setNeedsStatusBarAppearanceUpdate()
कोड में कॉल करने पर ।
बाद के मामले में, आप निम्न कोड द्वारा स्टेटबार उपस्थिति में हेरफेर करने के लिए पात्र हैं:
var isDark = false {
didSet {
setNeedsStatusBarAppearanceUpdate()
}
}
override var preferredStatusBarStyle: UIStatusBarStyle {
return isDark ? .lightContent : .default
}
func toggleAppearance() {
isDark.toggle()
}
फिर, जब भी बुलाओगे toggleAppearance()
, स्टेटसबार शैली परिवर्तन शुरू हो जाएगा।
तीसरा दृष्टिकोण - हैक!
एक हैक है जो सीधे स्थिति पट्टी तक पहुँचने की अनुमति देता है:
func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {
if let statusBar = UIApplication.shared.value(forKey: "statusBar") as? UIView {
statusBar.backgroundColor = UIColor.blue
}
return true
}
हैक क्यों? अगर आपको ब्लैक या व्हाइट के अलावा स्टेटस बार कलर की जरूरत है, तो आप अनडिमेंटेड एपीआई का इस्तेमाल करते हैं। आप statusBar
केवीसी का उपयोग करके ऑब्जेक्ट प्राप्त करते हैं और इसकी पृष्ठभूमि का रंग सेट करते हैं। ऑब्जेक्ट आपको इस तरह से मिलता है UIStatusBar
, जो कि प्राप्त होता है UIView
और इस प्रकार स्वाभाविक रूप से backgroundColor
संपत्ति का समर्थन करता है। यह गंदा है, कानूनी तरीका नहीं है, लेकिन अभी तक यह स्टेटसबार के लिए कस्टम रंग स्थापित करने (खाते में नहीं लेने) का एकमात्र तरीका हैUINavigationBar
दृष्टिकोण , जो पूरी तरह से नेवबार + स्टेटसबार उपस्थिति को अनुकूलित करने की अनुमति देता है)। यह आपके ऐप को अस्वीकार कर दिया जा सकता है। लेकिन शायद आप भाग्यशाली हैं। और अगर आप कुछ जटिल परिस्थितियों (जैसे नेस्टेड, चाइल्ड नेविगेशन और व्यू कंट्रोलर्स की पदानुक्रम) में हैं, तो यह बहुत ही एकमात्र हो सकता है, या कम से कम कम परेशानी वाला तरीका है जो स्टेटसबार उपस्थिति को अनुकूलित कर सकता है (उदाहरण के लिए, इसे पारदर्शी बनाने के लिए)
Xcode 10+, स्विफ्ट 4.2
कोई और विकल्प नहीं हैं: डेवलपर को प्रत्येक दृश्य नियंत्रक को स्टेटसबार उपस्थिति को परिभाषित करने की अनुमति देनी चाहिए , ध्वज को YES को सेट करना चाहिए (या इस क्रिया को छोड़ना चाहिए, क्योंकि यह डिफ़ॉल्ट रूप से YES है) और उपरोक्त निर्देशों का पालन करें।
बक्शीश
हैक-आधारित समाधान आप (हालांकि प्रोत्साहित नहीं किया गया है) किसी भी स्तर पर स्वेच्छा से स्थिति बदलने के लिए जटिल परिस्थितियों में उपयोग कर सकते हैं। रंग-वार, निम्नलिखित विस्तार विधि वही करती है जो आप नियमित दृष्टिकोण के साथ कर सकते थे। आप इसे अपनी आवश्यकताओं के अनुसार समायोजित कर सकते हैं।
extension UIViewController {
func setStatusBarStyle(_ style: UIStatusBarStyle) {
if let statusBar = UIApplication.shared.value(forKey: "statusBar") as? UIView {
statusBar.backgroundColor = style == .lightContent ? UIColor.black : .white
statusBar.setValue(style == .lightContent ? UIColor.white : .black, forKey: "foregroundColor")
}
}
}