क्या iOS 13 पर डार्क मोड से ऑप्ट-आउट करना संभव है?


297

मेरे ऐप के एक बड़े हिस्से में मूल कार्यान्वयन के माध्यम से अभी तक उपलब्ध कार्यक्षमता प्रदान करने के लिए वेब दृश्य नहीं हैं। वेबसाइट के लिए एक डार्क थीम को लागू करने के लिए वेब टीम की कोई योजना नहीं है। जैसे, मेरा ऐप iOS 13 पर डार्क मोड सपोर्ट के साथ थोड़ा आधा / आधा दिखेगा।

क्या डार्क मोड सपोर्ट से बाहर निकलना संभव है जैसे कि हमारा ऐप हमेशा वेबसाइट थीम से मेल खाने के लिए लाइट मोड दिखाता है?


71
सेट UIUserInterfaceStyleकरने के लिए Lightअपने Info.plist में। डेवलपर
।apple.com

1
पूछने के लिए धन्यवाद - हम सभी के लिए। बहुत सारे ऐप के माध्यम से जाना। टॉगल तैयार होने तक ऐप्स को काम करते रहने के लिए यह आवश्यक है।
user3741598

आयात फ़ाउंडेशन आयात UIKIT एक्सटेंशन UIViewController {ओवरराइड ओपन फ़ेक awakeFromNib () {super.awakeFromNib () अगर #available (iOS 13.0, *) {// हमेशा लाइट इंटरफ़ेस स्टाइल अपनाएं। overrideUserInterfaceStyle = .light}}}
मोहम्मद रजीपुर

1
बस plist में UIUserInterfaceStyle जोड़ें । यह इतना आसान है
फेटी

ऐप्पस्टोर में ऐप सबमिट करते समय लाइट मोड में UIUserInterfaceStyle के कारण ऐप्पल स्वीकार करते हैं।
किरन

जवाबों:


684

सबसे पहले, यहां Apple की प्रविष्टि डार्क मोड से बाहर निकलने से संबंधित है। इस लिंक की सामग्री Xcode 11 और iOS 13 के लिए लिखी गई है :

यह खंड Xcode 11 उपयोग पर लागू होता है


यदि आप अपने ENTIRE एप्लिकेशन को चुनना चाहते हैं

दृष्टिकोण # १

उपयोग अपनी जानकारी में निम्नलिखित कुंजी का फाइल फ़ाइल:

UIUserInterfaceStyle

और इसे मान दें Light

एक्सएमएल के लिए UIUserInterfaceStyleकाम:

<key>UIUserInterfaceStyle</key>
<string>Light</string>

दृष्टिकोण # 2

आप overrideUserInterfaceStyleऐप के खिलाफ सेट कर सकते हैंwindow वैरिएबल के ।

आपकी परियोजना कैसे बनाई गई थी, इस पर निर्भर करते हुए, यह AppDelegateफ़ाइल या में हो सकता है SceneDelegate

if #available(iOS 13.0, *) {
    window?.overrideUserInterfaceStyle = .light
}


यदि आप अलग-अलग आधार पर अपने UIViewController को चुनना चाहते हैं

override func viewDidLoad() {
    super.viewDidLoad()
    // overrideUserInterfaceStyle is available with iOS 13
    if #available(iOS 13.0, *) {
        // Always adopt a light interface style.
        overrideUserInterfaceStyle = .light
    }
}

OverrideUserInterfaceStyle के लिए Apple प्रलेखन

उपरोक्त कोड Xcode 11 में कैसे दिखेगा:

यहां छवि विवरण दर्ज करें

यह खंड Xcode 10.x उपयोग पर लागू होता है


यदि आप अपने सबमिशन के लिए Xcode 11 का उपयोग कर रहे हैं, तो आप इस पंक्ति के नीचे की सभी चीज़ों को सुरक्षित रूप से अनदेखा कर सकते हैं।

चूंकि प्रासंगिक API iOS 12 में मौजूद नहीं है, इसलिए आपको ऊपर दिए गए मूल्यों का उपयोग करने का प्रयास करते समय त्रुटियां मिलेंगी:

स्थापित करने के लिए overrideUserInterfaceStyleअपनीUIViewController

यहां छवि विवरण दर्ज करें

यदि आप अलग-अलग आधार पर अपने UIViewController को चुनना चाहते हैं

संकलक संस्करण और iOS संस्करण का परीक्षण करके इसे Xcode 10 में संभाला जा सकता है:

#if compiler(>=5.1)
if #available(iOS 13.0, *) {
    // Always adopt a light interface style.
    overrideUserInterfaceStyle = .light
}
#endif

यदि आप अपने ENTIRE एप्लिकेशन को चुनना चाहते हैं

आप अपनी AppDelegateफ़ाइल में निम्न कोड जोड़कर Xcode 10 के लिए पूरे एप्लिकेशन के खिलाफ काम करने के लिए उपरोक्त स्निपेट को संशोधित कर सकते हैं ।

#if compiler(>=5.1)
if #available(iOS 13.0, *) {
    // Always adopt a light interface style.
    window?.overrideUserInterfaceStyle = .light
}
#endif

हालाँकि, Xcode संस्करण 10.x का उपयोग करते समय प्लिस्ट सेटिंग विफल हो जाएगी:

यहां छवि विवरण दर्ज करें

अपनी प्रतिक्रिया के साथ इस उत्तर को बेहतर बनाने के लिए @Aron Nelson , @Raundundas Sakalauskas , @NSLeader और rammdy को श्रेय


2
अब आपके ऐप को अपडेट / अपलोड करते समय UIUserInterfaceStyle लाइट अवरुद्ध है। इसे अमान्य प्लिस्ट प्रविष्टि के रूप में चिह्नित किया जाता है। (अमान्य प्लिस्ट कुंजी)
एरन नेल्सन

2
यह iOS SDK 12 (वर्तमान में नवीनतम स्थिर SDK) के विरुद्ध संकलन नहीं करेगा। समाधान के लिए stackoverflow.com/a/57521901/2249485 देखें जो iOS 12 SDK के साथ भी काम करेगा।
रायमुंडस सकलौसक

यह इतना अनुचित है कि "मूल प्रश्न" की तुलना में बहुत अधिक विचार वाले प्रश्न उत्तर प्रदान करने के लिए बंद है। :(
रायमुंदस सकलाकस

7
इसके बजाय स्थापित करने की overrideUserInterfaceStyleमें viewDidLoadहर दृश्य नियंत्रक के लिए, आप इसे एक बार एप्लिकेशन की मुख्य विंडो पर सेट कर सकते हैं। इतना आसान अगर आप चाहते हैं कि पूरा ऐप एक तरह से व्यवहार करे।
रामादेवी

2
#if compiler(>=5.1)इसके बजाय का उपयोग करें responds(to:)औरsetValue
NSLeader

162

"IOS पर लागू डार्क मोड" (पर एप्पल के सत्र के अनुसार https://developer.apple.com/videos/play/wwdc2019/214/ 31:13 से शुरु करके) यह सेट के लिए संभव है overrideUserInterfaceStyleकरने के लिए UIUserInterfaceStyleLightया UIUserInterfaceStyleDarkकिसी भी दृश्य नियंत्रक या दृश्य पर , जिसका उपयोग traitCollectionकिसी भी सबव्यू या व्यू कंट्रोलर के लिए किया जाएगा।

पहले से ही SeanR से उल्लेख किया है, आप सेट कर सकते हैं UIUserInterfaceStyleकरने के लिए Lightया Darkअपने पूरे अनुप्रयोग के लिए इसे बदलने के लिए आपको अपने ऐप्लिकेशन की plist फ़ाइल में।


17
यदि आप UIUserInterfaceStyle कुंजी सेट करते हैं, तो आपके ऐप को ऐप स्टोर में अस्वीकार कर दिया जाएगा
सोनियस

2
Apple ने ITMS-90190 त्रुटि कोड मंचों के
thread/

11
अस्वीकृति सबसे अधिक होने की संभावना है क्योंकि iOS 13 एसडीके अभी तक बीटा से बाहर नहीं है। मुझे लगता है कि Xcode 11 GM के उपलब्ध होते ही यह काम करना चाहिए।
dorbeetle

2
@dorbeetle यह सच नहीं है, मैंने इस कुंजी के साथ अपने ऐप को सफलतापूर्वक 1 महीने पहले अपलोड कर दिया था जैसे कि Xcode 10. हाल ही में अस्वीकार। यह कुछ प्रकार की नई Apple रणनीति लगती है।
स्टीवन

1
अभी भी हो रहा है। Xcode GM2 ने एप्लिकेशन साइनिंग त्रुटि लौटा दी। Xcode 10.3 लौटा: "अमान्य Info.plist कुंजी। पेलोड / गैलीलियो.ऐपइन्फो .plist फ़ाइल में कुंजी 'UIUserInterfaceStyle' मान्य नहीं है।"
इवोर बोडुनोव

64

यदि आप Xcode 11 या बाद में (i, e iOS 13 या बाद में SDK) का उपयोग नहीं कर रहे हैं, तो आपके ऐप ने स्वचालित रूप से डार्क मोड को सपोर्ट करने का विकल्प नहीं चुना है। इसलिए, डार्क मोड से बाहर निकलने की आवश्यकता नहीं है।

यदि आप Xcode 11 या उसके बाद का उपयोग कर रहे हैं, तो सिस्टम ने स्वचालित रूप से आपके ऐप के लिए डार्क मोड सक्षम कर दिया है। आपकी प्राथमिकता के आधार पर अंधेरे मोड को अक्षम करने के लिए दो दृष्टिकोण हैं। आप इसे पूरी तरह से अक्षम कर सकते हैं या इसे किसी भी विशिष्ट विंडो, दृश्य या दृश्य नियंत्रक के लिए अक्षम कर सकते हैं।

अपने ऐप के लिए पूरी तरह से डार्क मोड को अक्षम करें

आप अपने ऐप के Info.plist फ़ाइल के UIUserInterfaceStyleमान के साथ कुंजी को शामिल करके डार्क मोड को अक्षम कर सकते हैं Light। यह उपयोगकर्ता की प्राथमिकता को अनदेखा करता है और हमेशा आपके ऐप पर एक हल्का रूप लागू करता है।
लाइट के रूप में UIUserInterfaceStyle

विंडो, व्यू या व्यू कंट्रोलर के लिए डार्क मोड को अक्षम करें

आप अपने इंटरफ़ेस को हमेशा overrideUserInterfaceStyleउपयुक्त विंडो, व्यू या व्यू कंट्रोलर की प्रॉपर्टी सेट करके हल्के या गहरे रंग की शैली में प्रदर्शित होने के लिए बाध्य कर सकते हैं ।

नियंत्रक देखें:

override func viewDidLoad() {
    super.viewDidLoad()
    /* view controller’s views and child view controllers 
     always adopt a light interface style. */
    overrideUserInterfaceStyle = .light
}

दृश्य:

// The view and all of its subviews always adopt light style.
youView.overrideUserInterfaceStyle = .light

खिड़की:

/* Everything in the window adopts the style, 
 including the root view controller and all presentation controllers that 
 display content in that window.*/
window.overrideUserInterfaceStyle = .light

नोट: ऐप्पल आपके ऐप में डार्क मोड का समर्थन करने के लिए दृढ़ता से प्रोत्साहित करता है। इसलिए, आप केवल डार्क मोड को अस्थायी रूप से अक्षम कर सकते हैं।

यहाँ और पढ़ें: अपने iOS ऐप के लिए एक विशिष्ट इंटरफ़ेस शैली चुनना


34

********** Xcode 11 के लिए सबसे आसान तरीका और ***********

इससे पहले info.plist में जोड़ें </dict></plist>

<key>UIUserInterfaceStyle</key>
<string>Light</string>

Xcode 10.x पर ऐप सबमिट करने से यह समाधान विफल हो जाएगा
Tawfik Bouabid

27

मुझे लगता है कि मैंने इसका हल ढूंढ लिया है। मैंने शुरू में इसे UIUserInterfaceStyle - सूचना संपत्ति सूची और UIUserInterfaceStyle - UIKit से एक साथ जोड़ा था , लेकिन अब यह वास्तव में आपके iOS ऐप के लिए एक विशिष्ट इंटरफ़ेस शैली का चयन करते हुए पाया गया है ।

आपके info.plist, सेट UIUserInterfaceStyle( उपयोगकर्ता इंटरफ़ेस शैली ) से 1 ( UIUserInterfaceStyle.light) तक।

EDIT: dorbeetle के उत्तर के अनुसार, अधिक उपयुक्त सेटिंग UIUserInterfaceStyleहो सकती है Light


2 को मान सेट करके डार्क मोड लागू करने से काम नहीं [UIInterfaceStyle] '2' is not a recognized value for UIUserInterfaceStyle. Defaulting to Light.
चलता है

3
प्लिस्ट में इस कुंजी के होने से ऐप स्टोर रिजेक्ट हो जाएगा।
जोस

1
AppStore अब plist.info में इस संपत्ति को अस्वीकार नहीं करता है। मैंने "डार्क" (पूंजीकृत) लगाया क्योंकि हमारा ऐप पहले से ही अंधेरा है। कोई समस्या नहीं। यह ठीक से हमें सिस्टम नियंत्रण का उपयोग करने देता है।
निकडन

@nickdnk मुझे लगता है कि आपने Xcode 11 के साथ अपना ऐप बनाया है, जो कि Apple द्वारा अनुशंसित है।
डॉनसॉन्ग

1
हाँ, मैंने किया। यह इस तथ्य को नहीं बदलता है कि Apple इस पैरामीटर को प्लिस्ट में स्वीकार करता है, जो कि मैं स्पष्ट करने की कोशिश कर रहा था।
निकडनेक

23

यदि आप संपूर्ण एप्लिकेशन को चुनना चाहते हैं तो ऊपर दिया गया उत्तर काम करता है। यदि आप यूआई वाले काम पर काम कर रहे हैं, और आपके पास संपादन .plist की विलासिता नहीं है, तो आप इसे कोड के माध्यम से भी कर सकते हैं।

यदि आप iOS 13 एसडीके के खिलाफ संकलन कर रहे हैं, तो आप बस निम्नलिखित कोड का उपयोग कर सकते हैं:

स्विफ्ट:

if #available(iOS 13.0, *) {
    self.overrideUserInterfaceStyle = .light
}

Obj सी:

if (@available(iOS 13.0, *)) {
    self.overrideUserInterfaceStyle = UIUserInterfaceStyleLight;
}

फिर भी , यदि आप चाहते हैं कि आपका कोड iOS 12 SDK के खिलाफ भी संकलित हो (जो अभी अभी नवीनतम स्थिर SDK है), तो आपको चयनकर्ताओं का उपयोग करना चाहिए। चयनकर्ताओं के साथ कोड:

स्विफ्ट (XCode इस कोड के लिए चेतावनी दिखाएगी, लेकिन यह अभी के लिए ऐसा करने का एकमात्र तरीका है क्योंकि SDK 12 में संपत्ति मौजूद नहीं है इसलिए संकलन नहीं होगा):

if #available(iOS 13.0, *) {
    if self.responds(to: Selector("overrideUserInterfaceStyle")) {
        self.setValue(UIUserInterfaceStyle.light.rawValue, forKey: "overrideUserInterfaceStyle")
    }
}

Obj सी:

if (@available(iOS 13.0, *)) {
    if ([self respondsToSelector:NSSelectorFromString(@"overrideUserInterfaceStyle")]) {
        [self setValue:@(UIUserInterfaceStyleLight) forKey:@"overrideUserInterfaceStyle"];
    }
}

यह बेहतर होगा यदि आप निर्दिष्ट करते हैं कि संपत्ति क्या overrideUserInterfaceStyleहै।
डॉन सोंग

12

नवीनतम अद्यतन-

यदि आप Xcode 10.x का उपयोग कर रहे हैं, तो डिफ़ॉल्ट UIUserInterfaceStyleहैlight आईओएस 13.x. के लिए IOS 13 डिवाइस पर चलने पर, यह केवल लाइट मोड में काम करेगा।

UIUserInterfaceStyleInfo.plist फ़ाइल में कुंजी को स्पष्ट रूप से जोड़ने की आवश्यकता नहीं है , इसे जोड़ने पर आपको अपने ऐप को मान्य करते समय एक त्रुटि मिलेगी, यह कहते हुए:

अमान्य Info.plist कुंजी। पेलोड / AppName.appInfo.plist फ़ाइल में कुंजी 'UIUserInterfaceStyle' मान्य नहीं है।

UIUserInterfaceStyleXcode 11.x का उपयोग करते समय केवल Info.plist फ़ाइल में कुंजी जोड़ें।


1
इसका Xcode 10 या 11. से कोई लेना-देना नहीं है। यदि उपयोगकर्ता ऐप फॉर्म Xcode 10 की तैनाती करता है और डार्क मोड का ध्यान नहीं रखता है, तो ऐप को iPhone 11, Pro या Pro Max में इंस्टॉल करने पर इसमें डार्क मोड की समस्या होगी। आपको Xcode 11 को अपडेट करने और इस समस्या को हल करने की आवश्यकता है।
निरंजन मोलकेरी

3
@NiranjanMolkeri इसका नए आईफ़ोन से कोई लेना-देना नहीं है। यह iOS 13. पर डार्क मोड के बारे में है। पिछले iOS 13 बीटा वर्जन ऐप्स में UI के डार्क मोड की समस्या थी अगर इसे स्पष्ट रूप से हैंडल नहीं किया गया। लेकिन नवीनतम संस्करण में, यह तय है। यदि आप XCode 10 का उपयोग कर रहे हैं, तो डिफ़ॉल्ट UIUserInterfaceStyle iOS13 के लिए हल्का है। यदि आप Xode11 का उपयोग कर रहे हैं तो आपको इसे संभालने की आवश्यकता है।
कुमारसिद्धार्थ

यदि आपके पास Xcode 10.3 का उपयोग करके TestFligth पर कोई एप्लिकेशन अपलोड करने और प्रमुख UIUserInterfaceStyle में शामिल हैं तो आपके पास समस्याएँ होंगी। यह कहेगा कि यह एक अमान्य प्लिस्ट फाइल है। अगर आपको Xcode 10 में निर्माण करना है, या Xcode 11 का उपयोग करके अपलोड करना है या तो हटाना है
eharo2

9

यदि आप UIUserInterfaceStyleplist फ़ाइल में कुंजी जोड़ेंगे , तो संभवतः Apple यहां बताए अनुसार रिलीज़ बिल्ड को अस्वीकार कर देगा: https://stackoverflow.com/a/56546554/7524146 वैसे भी प्रत्येक ViewController को स्पष्ट रूप से बताना कष्टप्रद है self.overrideUserInterfaceStyle = .light। लेकिन आप अपने रूट windowऑब्जेक्ट के लिए एक बार कोड की इस शांति का उपयोग कर सकते हैं :

if #available(iOS 13.0, *) {
    if window.responds(to: Selector(("overrideUserInterfaceStyle"))) {
        window.setValue(UIUserInterfaceStyle.light.rawValue, forKey: "overrideUserInterfaceStyle")
    }
}

बस ध्यान दें कि आप इसे अंदर नहीं कर सकते application(application: didFinishLaunchingWithOptions:)क्योंकि इसके लिए चयनकर्ता trueउस प्रारंभिक चरण में प्रतिक्रिया नहीं देगा । लेकिन आप इसे बाद में भी कर सकते हैं। यदि आप AppDelegate में स्वचालित रूप से UI शुरू करने के बजाय कस्टम AppPresenterया AppRouterक्लास का उपयोग कर रहे हैं तो यह बहुत आसान है ।


9

आप Xcode 11 में पूरे आवेदन में डार्क मोड को बंद कर सकते हैं :

  1. जानकारी जाओ
  2. जैसे bellow जोड़ें

    <key>UIUserInterfaceStyle</key>
    <string>Light</string>

Info.plist जैसा दिखेगा नीचे…

यहां छवि विवरण दर्ज करें


1
किसी कारण से Xcode संस्करण 11.3.1 (11C504) के लिए काम नहीं करता है
एंड्रयू

7

- पूरे ऐप (विंडो) के लिए:

window!.overrideUserInterfaceStyle = .light

आप खिड़की से प्राप्त कर सकते हैं SceneDelegate

- एकल दृश्य नियंत्रक के लिए:

viewController.overrideUserInterfaceStyle = .light

आप किसी भी सेट कर सकते हैं viewController, यहां तक ​​कि viewController के अंदर यह स्व

- एकल दृश्य के लिए:

view.overrideUserInterfaceStyle = .light

आप किसी भी सेट कर सकते हैं view, यहां तक ​​कि इसे स्वयं के अंदर भी

if #available(iOS 13.0, *) { ,,, }यदि आप पहले के iOS संस्करणों का समर्थन कर रहे हैं तो आपको इसका उपयोग करने की आवश्यकता हो सकती है ।


6

अन्य प्रतिक्रियाओं के अलावा, निम्नलिखित की मेरी समझ से, आपको केवल iOS 13 SDK (XCode 11 का उपयोग करके) के खिलाफ संकलन करते समय डार्क मोड की तैयारी करने की आवश्यकता है।

सिस्टम मानता है कि आईओएस 13 या बाद में एसडीके के खिलाफ जुड़े ऐप प्रकाश और अंधेरे दिखावे दोनों का समर्थन करते हैं। IOS में, आप अपनी विंडो, व्यू या व्यू कंट्रोलर को एक विशिष्ट इंटरफ़ेस शैली निर्दिष्ट करके अपने इच्छित विशिष्ट स्वरूप को निर्दिष्ट करते हैं। आप पूरी तरह से Info.plist कुंजी का उपयोग करके डार्क मोड के लिए समर्थन को अक्षम कर सकते हैं।

संपर्क



2

मेरा ऐप अब तक डार्क मोड का समर्थन नहीं करता है और लाइट ऐप बार कलर का उपयोग करता है। मैं निम्न कुंजी जोड़कर डार्क टेक्स्ट और आइकॉन को स्टेटस बार कंटेंट को बाध्य करने में सक्षम था Info.plist:

<key>UIStatusBarStyle</key>
<string>UIStatusBarStyleDarkContent</string>
<key>UIUserInterfaceStyle</key>
<string>Light</string>
<key>UIViewControllerBasedStatusBarAppearance</key>
<true/>

अन्य संभावित मान यहां देखें: https://developer.apple.com/documentation/uikit/uistatusbarstyle


2

उद्देश्य-सी संस्करण

 if (@available(iOS 13.0, *)) {
        _window.overrideUserInterfaceStyle = UIUserInterfaceStyleLight;
    }

1

यहां कुछ टिप्स और ट्रिक्स दी गई हैं, जिनका उपयोग आप अपने ऐप में डार्क मोड को सपोर्ट या बाईपास करने के लिए कर सकते हैं।

पहला टिप: ViewController शैली को ओवरराइड करने के लिए

आप द्वारा UIViewController की इंटरफ़ेस शैली को ओवरराइड कर सकते हैं

1: overrideUserInterfaceStyle = .dark // डार्क मोड के लिए

2: overrideUserInterfaceStyle = .light // प्रकाश मोड के लिए

class ViewController: UIViewController {
    override func viewDidLoad() {
        super.viewDidLoad()
        overrideUserInterfaceStyle = .light    
    }
}

दूसरा टिप: info.plist में एक कुंजी जोड़ना

बस आप एक नई कुंजी जोड़ सकते हैं

UIUserInterfaceStyle

अपने एप्लिकेशन info.plist में और लाइट या डार्क में इसका मान सेट करें। यह आपके द्वारा प्रदान किए गए मूल्य के लिए ऐप डिफ़ॉल्ट शैली को ओवरराइड करेगा। आपको overrideUserInterfaceStyle को जोड़ना नहीं है। इस लाइन को प्रत्येक viewController में, बस एक पंक्ति में देखें। सूचना में यह है।


1

बस अपनी info.plistफ़ाइल में निम्नलिखित कुंजी जोड़ें :

<key>UIUserInterfaceStyle</key>
    <string>Light</string>

1
 if #available(iOS 13.0, *) {
            overrideUserInterfaceStyle = .light
        } else {
            // Fallback on earlier versions
        }

क्या आप इस बारे में थोड़ी व्याख्या कर सकते हैं कि कोड-केवल उत्तर को पोस्ट करने के बजाय यह उत्तर समस्या को कैसे हल करेगा।
अरुण विनोथ

हाँ ज़रूर @ArunVinoth IOS 13 में डार्क मोड को पेश किया गया है, यदि आपका परिनियोजन लक्ष्य 13 से कम है तो उपरोक्त कोड का उपयोग करें अन्यथा यदि आप ब्लॉक में लिखे गए साधारण स्टेटमेंट का उपयोग कर सकते हैं।
तल्हा रसूल

1

स्विफ्ट 5

अंधेरे को प्रकाश मोड में बदलने के दो तरीके:

1- जानकारी.प्लिस्ट

    <key>UIUserInterfaceStyle</key>
    <string>Light</string>

2- प्रोग्रामिक रूप से

 UIApplication.shared.windows.forEach { window in
     window.overrideUserInterfaceStyle = .light
  } 

0

मैं इस समाधान का उपयोग करूँगा क्योंकि ऐप जीवन चक्र के दौरान विंडो प्रॉपर्टी को बदला जा सकता है। इसलिए "ओवरराइड यूटरइंटरफेसफेस" = .light "असाइन करने की आवश्यकता है। UIWindow.appearance () हमें नए बनाए गए UIWindow ऑब्जेक्ट्स के लिए उपयोग किए जाने वाले डिफ़ॉल्ट मान सेट करने में सक्षम बनाता है।

import UIKit

@UIApplicationMain
class AppDelegate: UIResponder, UIApplicationDelegate {

    var window: UIWindow?

    func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {

      if #available(iOS 13.0, *) {
          UIWindow.appearance().overrideUserInterfaceStyle = .light
      }

      return true
    }
}

0

बस इन लाइन को info.plist फ़ाइल में जोड़ें:

<key>UIUserInterfaceStyle</key>
<string>light</string>

यह ऐप को केवल लाइट मोड में चलने के लिए मजबूर करेगा।


यह पहले से ही टिप्पणी की गई थी और कई बार जवाब दिया गया था। यहां तक ​​कि स्वीकृत जवाब भी यही सुझा रहा है। इसलिए इस टिप्पणी में कोई नई जानकारी नहीं है।
फिरोजजेक

0
import UIKit

extension UIViewController {

    override open func awakeFromNib() {

        super.awakeFromNib()

        if #available(iOS 13.0, *) {

            overrideUserInterfaceStyle = .light

        }

    }
}

2
कृपया इसे संपादित करके अपने उत्तर में कुछ स्पष्टीकरण जोड़ें, जैसे कि अन्य इससे सीख सकते हैं
निको हेस

0

आप ऐसा कर सकते हैं: इस नई कुंजी UIUserInterfaceStyle को Info.plist में जोड़ें और उसका मान लाइट पर सेट करें। और चेक अलर्ट कंट्रोलर लाइट मोड के साथ दिखाई देता है।

UIUserInterfaceStyle लाइट यदि आप अपने UI.serInterfaceStyle को अपनी Info.plist फ़ाइल में जोड़कर और उसके मूल्य को लाइट या डार्क में सेट करते हुए उपयोगकर्ता की सेटिंग की परवाह किए बिना अपने पूरे एप्लिकेशन में लाइट / डार्क मोड को लागू करते हैं।


0

इस प्रश्न के इतने सारे उत्तर हैं, बल्कि info.plistआप में इसका उपयोग करके इसे AppDelegateइस तरह सेट कर सकते हैं :

#if compiler(>=5.1)
        if #available(iOS 13.0, *) {
            self.window?.overrideUserInterfaceStyle = .light
        }
        #endif

Xcode 11.3, iOS 13.3 पर टेस्ट करें


-8

वास्तव में मैंने अभी कुछ कोड लिखे हैं जो आपको विश्व स्तर पर कोड में अंधेरे मोड से बाहर निकलने की अनुमति देगा, बिना आपके आवेदन में हर एक viv नियंत्रक के साथ। यह संभवत: कक्षाओं की सूची का प्रबंधन करके किसी वर्ग के आधार पर कक्षा से बाहर होने के लिए परिष्कृत किया जा सकता है। मेरे लिए, मैं जो चाहता हूं वह अपने उपयोगकर्ताओं के लिए यह देखने के लिए है कि क्या वे मेरे ऐप के लिए डार्क मोड इंटरफ़ेस पसंद करते हैं, और यदि वे इसे पसंद नहीं करते हैं, तो वे इसे बंद कर सकते हैं। यह उन्हें अपने बाकी अनुप्रयोगों के लिए अंधेरे मोड का उपयोग जारी रखने की अनुमति देगा।

उपयोगकर्ता की पसंद अच्छी है (अहम, आपको Apple देखकर, यह है कि आपको इसे कैसे लागू करना चाहिए था)।

तो यह कैसे काम करता है यह UIViewController की एक श्रेणी है। जब यह लोड होता है तो यह देशी व्यूडीडलड विधि को एक के साथ बदल देता है जो एक वैश्विक ध्वज की जांच करेगा यह देखने के लिए कि क्या डार्क मोड सब कुछ के लिए अक्षम है या नहीं।

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

मैंने अभी तक ध्वज को बंद या बंद करने वाले उपयोगकर्ता को जवाब देने के लिए कुछ भी नहीं लिखा है। तो यह मूल रूप से उदाहरण कोड है। यदि हम चाहते हैं कि उपयोगकर्ता इसके साथ सहभागिता करे, तो सभी दृश्य नियंत्रकों को पुनः लोड करने की आवश्यकता होगी। मुझे नहीं पता कि उस अपराध को कैसे किया जाए, लेकिन संभवत: कुछ अधिसूचना भेजने से यह काम चल जाएगा। तो अभी, डार्क मोड के लिए यह ग्लोबल ऑन / ऑफ केवल स्टार्टअप पर काम करने या ऐप को पुनरारंभ करने जा रहा है।

अब, यह सिर्फ इतना ही नहीं है कि आप अपने विशाल ऐप में हर एक एमएफआई के व्यूकंट्रोलर में डार्क मोड को बंद करने का प्रयास करें। यदि आप रंग संपत्तियों का उपयोग कर रहे हैं तो आप पूरी तरह से बंधे हुए हैं। हमने 10+ वर्षों से अपरिवर्तनीय वस्तुओं को अपरिवर्तनीय समझा है। रंग परिसंपत्ति सूची से आपको मिलने वाले रंग कहते हैं कि वे UIColor हैं, लेकिन वे गतिशील (परिवर्तनशील) रंग हैं और आपके नीचे बदल जाएंगे क्योंकि सिस्टम अंधेरे से प्रकाश मोड में बदल जाता है। यह एक विशेषता माना जाता है। लेकिन निश्चित रूप से इस परिवर्तन को रोकने के लिए इन चीजों को पूछने के लिए कोई मास्टर टॉगल नहीं है (जहां तक ​​मुझे अभी पता है, शायद कोई इसे सुधार सकता है)।

तो समाधान दो भागों में है:

  1. UIViewController पर एक सार्वजनिक श्रेणी जो कुछ उपयोगिता और सुविधा विधियाँ देती है ... उदाहरण के लिए मुझे नहीं लगता कि ऐप्पल ने इस तथ्य के बारे में सोचा है कि हम में से कुछ अपने ऐप में वेब कोड में मिलाते हैं। जैसे कि हमारे पास स्टाइलशीट हैं जिन्हें अंधेरे या प्रकाश मोड के आधार पर टॉगल करने की आवश्यकता है। इस प्रकार, आपको या तो किसी प्रकार की गतिशील स्टाइलशीट ऑब्जेक्ट (जो अच्छी होगी) बनाने की जरूरत है या बस यह पूछें कि वर्तमान स्थिति क्या है (खराब लेकिन आसान)।

  2. जब यह लोड होता है तो यह श्रेणी UIViewController क्लास के व्यूडीडलॉड तरीके को बदल देगी और कॉल को इंटरसेप्ट करेगी। मुझे नहीं पता कि ऐप स्टोर नियमों को तोड़ता है या नहीं। यदि ऐसा होता है, तो इसके आस-पास अन्य तरीके भी हैं, लेकिन आप इसे अवधारणा का प्रमाण मान सकते हैं। उदाहरण के लिए, आप सभी मुख्य दृश्य नियंत्रक प्रकारों में से एक उपवर्ग बना सकते हैं और अपने सभी व्यू कंट्रोलर उन से प्राप्त कर सकते हैं, और फिर आप डार्कमोड श्रेणी के विचार का उपयोग कर सकते हैं और इसमें कॉल करके अपने सभी दृश्य नियंत्रकों को चुनने के लिए बाध्य कर सकते हैं। यह बदसूरत है लेकिन यह किसी भी नियम को तोड़ने वाला नहीं है। मैं रनटाइम का उपयोग करना पसंद करता हूं क्योंकि यही रनटाइम करने के लिए बनाया गया था। इसलिए मेरे संस्करण में आप सिर्फ श्रेणी जोड़ते हैं, आप श्रेणी पर एक वैश्विक चर निर्धारित करते हैं कि क्या आप इसे अंधेरे मोड को ब्लॉक करना चाहते हैं या नहीं, और यह ऐसा करेगा।

  3. आप अभी तक जंगल से बाहर नहीं हैं, जैसा कि उल्लेख किया गया है, दूसरी समस्या है यूक्लोर मूल रूप से जो भी नरक चाहता है वह कर रहा है। यहां तक ​​कि अगर आपके व्यू कंट्रोलर डार्क मोड को ब्लॉक कर रहे हैं तो भी UIColor को यह पता नहीं है कि आप इसका उपयोग कहां या कैसे कर रहे हैं ताकि आप इसे अनुकूलित न कर सकें। परिणामस्वरूप आप इसे सही तरीके से प्राप्त कर सकते हैं, लेकिन फिर यह भविष्य में किसी बिंदु पर आप पर वापस लौटने वाला है। शायद जल्द ही बाद में हो सकता है। तो जिस तरह से चारों ओर एक CGColor का उपयोग करके इसे दो बार आवंटित करके और इसे एक स्थिर रंग में बदल दिया जाता है। इसका मतलब यह है कि यदि आपका उपयोगकर्ता वापस जाता है और आपके सेटिंग्स पृष्ठ पर डार्क मोड को फिर से सक्षम करता है (विचार यहां यह काम करने के लिए है ताकि उपयोगकर्ता को आपके ऐप पर बाकी सिस्टम के ऊपर और ऊपर नियंत्रण हो), उन सभी स्थिर रंगों जगह की जरूरत है। अब तक यह किसी और को हल करने के लिए छोड़ दिया गया है। ऐसा करने का आसान तरीका यह है कि आप एक डिफ़ॉल्ट बनाएं डार्क मोड से बाहर निकलना, ऐप को क्रैश करने के लिए शून्य से विभाजित करें क्योंकि आप इसे बाहर नहीं निकाल सकते हैं और उपयोगकर्ता को इसे फिर से शुरू करने के लिए कह सकते हैं। शायद यह ऐप स्टोर दिशानिर्देशों का भी उल्लंघन करता है लेकिन यह एक विचार है।

UIColor श्रेणी को उजागर करने की आवश्यकता नहीं है, यह सिर्फ colorNamed कॉलिंग का काम करता है: ... यदि आपने डार्क मोड को ब्लॉक करने के लिए DarkMode ViewController वर्ग को नहीं बताया, तो यह पूरी तरह से अच्छी तरह से अपेक्षित रूप से काम करेगा। मानक ऐप्पल स्पैगेटी कोड के बजाय कुछ सुरुचिपूर्ण बनाने की कोशिश की जा रही है, जिसका मतलब है कि आप अपने अधिकांश ऐप को संशोधित करने जा रहे हैं यदि आप प्रोग्राम को अंधेरे मोड से बाहर निकालना चाहते हैं या इसे टॉगल करना चाहते हैं। अब मुझे नहीं पता कि अगर जरूरत के अनुसार डार्क मोड को बंद करने के लिए Info.plist को प्रोग्रामेटिक रूप से बदलने का एक बेहतर तरीका है। जहां तक ​​मेरी समझ है कि यह एक संकलन समय की सुविधा है और उसके बाद आप बंधुआ हैं।

तो यहां आपको वह कोड चाहिए जो आपके लिए आवश्यक है। यूआई स्टाइल सेट करने के लिए केवल एक विधि का उपयोग करना चाहिए और कोड में डिफ़ॉल्ट सेट करना चाहिए। आप किसी भी प्रयोजन के लिए इसके साथ जो चाहें, उपयोग कर सकते हैं, संशोधित कर सकते हैं और कोई वारंटी नहीं दी जा सकती है और मुझे नहीं पता कि यह ऐप स्टोर को पास करेगा या नहीं। सुधार बहुत स्वागत करते हैं।

निष्पक्ष चेतावनी मैं एआरसी या किसी अन्य हैंडहोल्डिंग विधियों का उपयोग नहीं करता हूं।

////// H file

#import <UIKit/UIKit.h>

@interface UIViewController(DarkMode)

// if you want to globally opt out of dark mode you call these before any view controllers load
// at the moment they will only take effect for future loaded view controllers, rather than currently
// loaded view controllers

// we are doing it like this so you don't have to fill your code with @availables() when you include this
typedef enum {
    QOverrideUserInterfaceStyleUnspecified,
    QOverrideUserInterfaceStyleLight,
    QOverrideUserInterfaceStyleDark,
} QOverrideUserInterfaceStyle;

// the opposite condition is light interface mode
+ (void)setOverrideUserInterfaceMode:(QOverrideUserInterfaceStyle)override;
+ (QOverrideUserInterfaceStyle)overrideUserInterfaceMode;

// utility methods
// this will tell you if any particular view controller is operating in dark mode
- (BOOL)isUsingDarkInterfaceStyle;
// this will tell you if any particular view controller is operating in light mode mode
- (BOOL)isUsingLightInterfaceStyle;

// this is called automatically during all view controller loads to enforce a single style
- (void)tryToOverrideUserInterfaceStyle;

@end


////// M file


//
//  QDarkMode.m

#import "UIViewController+DarkMode.h"
#import "q-runtime.h"


@implementation UIViewController(DarkMode)

typedef void (*void_method_imp_t) (id self, SEL cmd);
static void_method_imp_t _nativeViewDidLoad = NULL;
// we can't @available here because we're not in a method context
static long _override = -1;

+ (void)load;
{
#define DEFAULT_UI_STYLE UIUserInterfaceStyleLight
    // we won't mess around with anything that is not iOS 13 dark mode capable
    if (@available(iOS 13,*)) {
        // default setting is to override into light style
        _override = DEFAULT_UI_STYLE;
        /*
         This doesn't work...
        NSUserDefaults *d = NSUserDefaults.standardUserDefaults;
        [d setObject:@"Light" forKey:@"UIUserInterfaceStyle"];
        id uiStyle = [d objectForKey:@"UIUserInterfaceStyle"];
        NSLog(@"%@",uiStyle);
         */
        if (!_nativeViewDidLoad) {
            Class targetClass = UIViewController.class;
            SEL targetSelector = @selector(viewDidLoad);
            SEL replacementSelector = @selector(_overrideModeViewDidLoad);
            _nativeViewDidLoad = (void_method_imp_t)QMethodImplementationForSEL(targetClass,targetSelector);
            QInstanceMethodOverrideFromClass(targetClass, targetSelector, targetClass, replacementSelector);
        }
    }
}

// we do it like this because it's not going to be set often, and it will be tested often
// so we can cache the value that we want to hand to the OS
+ (void)setOverrideUserInterfaceMode:(QOverrideUserInterfaceStyle)style;
{
    if (@available(iOS 13,*)){
        switch(style) {
            case QOverrideUserInterfaceStyleLight: {
                _override = UIUserInterfaceStyleLight;
            } break;
            case QOverrideUserInterfaceStyleDark: {
                _override = UIUserInterfaceStyleDark;
            } break;
            default:
                /* FALLTHROUGH - more modes can go here*/
            case QOverrideUserInterfaceStyleUnspecified: {
                _override = UIUserInterfaceStyleUnspecified;
            } break;
        }
    }
}
+ (QOverrideUserInterfaceStyle)overrideUserInterfaceMode;
{
    if (@available(iOS 13,*)){
        switch(_override) {
            case UIUserInterfaceStyleLight: {
                return QOverrideUserInterfaceStyleLight;
            } break;
            case UIUserInterfaceStyleDark: {
                return QOverrideUserInterfaceStyleDark;
            } break;
            default:
                /* FALLTHROUGH */
            case UIUserInterfaceStyleUnspecified: {
                return QOverrideUserInterfaceStyleUnspecified;
            } break;
        }
    } else {
        // we can't override anything below iOS 12
        return QOverrideUserInterfaceStyleUnspecified;
    }
}

- (BOOL)isUsingDarkInterfaceStyle;
{
    if (@available(iOS 13,*)) {
        if (self.traitCollection.userInterfaceStyle == UIUserInterfaceStyleDark){
            return YES;
        }
    }
    return NO;
}

- (BOOL)isUsingLightInterfaceStyle;
{
    if (@available(iOS 13,*)) {
        if (self.traitCollection.userInterfaceStyle == UIUserInterfaceStyleLight){
            return YES;
        }
        // if it's unspecified we should probably assume light mode, esp. iOS 12
    }
    return YES;
}

- (void)tryToOverrideUserInterfaceStyle;
{
    // we have to check again or the compile will bitch
    if (@available(iOS 13,*)) {
        [self setOverrideUserInterfaceStyle:(UIUserInterfaceStyle)_override];
    }
}

// this method will be called via the viewDidLoad chain as we will patch it into the
// UIViewController class
- (void)_overrideModeViewDidLoad;
{
    if (_nativeViewDidLoad) {
        _nativeViewDidLoad(self,@selector(viewDidLoad));
    }
    [self tryToOverrideUserInterfaceStyle];
}


@end

// keep this in the same file, hidden away as it needs to switch on the global ... yeah global variables, I know, but viewDidLoad and colorNamed: are going to get called a ton and already it's adding some inefficiency to an already inefficient system ... you can change if you want to make it a class variable. 

// this is necessary because UIColor will also check the current trait collection when using asset catalogs
// so we need to repair colorNamed: and possibly other methods
@interface UIColor(DarkMode)
@end

@implementation UIColor (DarkMode)

typedef UIColor *(*color_method_imp_t) (id self, SEL cmd, NSString *name);
static color_method_imp_t _nativeColorNamed = NULL;
+ (void)load;
{
    // we won't mess around with anything that is not iOS 13 dark mode capable
    if (@available(iOS 13,*)) {
        // default setting is to override into light style
        if (!_nativeColorNamed) {
            // we need to call it once to force the color assets to load
            Class targetClass = UIColor.class;
            SEL targetSelector = @selector(colorNamed:);
            SEL replacementSelector = @selector(_overrideColorNamed:);
            _nativeColorNamed = (color_method_imp_t)QClassMethodImplementationForSEL(targetClass,targetSelector);
            QClassMethodOverrideFromClass(targetClass, targetSelector, targetClass, replacementSelector);
        }
    }
}


// basically the colors you get
// out of colorNamed: are dynamic colors... as the system traits change underneath you, the UIColor object you
// have will also change since we can't force override the system traits all we can do is force the UIColor
// that's requested to be allocated out of the trait collection, and then stripped of the dynamic info
// unfortunately that means that all colors throughout the app will be static and that is either a bug or
// a good thing since they won't respond to the system going in and out of dark mode
+ (UIColor *)_overrideColorNamed:(NSString *)string;
{
    UIColor *value = nil;
    if (@available(iOS 13,*)) {
        value = _nativeColorNamed(self,@selector(colorNamed:),string);
        if (_override != UIUserInterfaceStyleUnspecified) {
            // the value we have is a dynamic color... we need to resolve against a chosen trait collection
            UITraitCollection *tc = [UITraitCollection traitCollectionWithUserInterfaceStyle:_override];
            value = [value resolvedColorWithTraitCollection:tc];
        }
    } else {
        // this is unreachable code since the method won't get patched in below iOS 13, so this
        // is left blank on purpose
    }
    return value;
}
@end

उपयोगिता कार्यों का एक सेट है जो विधि स्वैपिंग करने के लिए उपयोग करता है। अलग फाइल। यह मानक सामान है और आप कहीं भी समान कोड पा सकते हैं।

// q-runtime.h

#import <Foundation/Foundation.h>
#import <objc/message.h>
#import <stdatomic.h>

// returns the method implementation for the selector
extern IMP
QMethodImplementationForSEL(Class aClass, SEL aSelector);

// as above but gets class method
extern IMP
QClassMethodImplementationForSEL(Class aClass, SEL aSelector);


extern BOOL
QClassMethodOverrideFromClass(Class targetClass, SEL targetSelector,
                              Class replacementClass, SEL replacementSelector);

extern BOOL
QInstanceMethodOverrideFromClass(Class targetClass, SEL targetSelector,
                                 Class replacementClass, SEL replacementSelector);


// q-runtime.m

static BOOL
_QMethodOverride(Class targetClass, SEL targetSelector, Method original, Method replacement)
{
    BOOL flag = NO;
    IMP imp = method_getImplementation(replacement);
    // we need something to work with
    if (replacement) {
        // if something was sitting on the SEL already
        if (original) {
            flag = method_setImplementation(original, imp) ? YES : NO;
            // if we're swapping, use this
            //method_exchangeImplementations(om, rm);
        } else {
            // not sure this works with class methods...
            // if it's not there we want to add it
            flag = YES;
            const char *types = method_getTypeEncoding(replacement);
            class_addMethod(targetClass,targetSelector,imp,types);
            XLog_FB(red,black,@"Not sure this works...");
        }
    }
    return flag;
}

BOOL
QInstanceMethodOverrideFromClass(Class targetClass, SEL targetSelector,
                                 Class replacementClass, SEL replacementSelector)
{
    BOOL flag = NO;
    if (targetClass && replacementClass) {
        Method om = class_getInstanceMethod(targetClass,targetSelector);
        Method rm = class_getInstanceMethod(replacementClass,replacementSelector);
        flag = _QMethodOverride(targetClass,targetSelector,om,rm);
    }
    return flag;
}


BOOL
QClassMethodOverrideFromClass(Class targetClass, SEL targetSelector,
                              Class replacementClass, SEL replacementSelector)
{
    BOOL flag = NO;
    if (targetClass && replacementClass) {
        Method om = class_getClassMethod(targetClass,targetSelector);
        Method rm = class_getClassMethod(replacementClass,replacementSelector);
        flag = _QMethodOverride(targetClass,targetSelector,om,rm);
    }
    return flag;
}

IMP
QMethodImplementationForSEL(Class aClass, SEL aSelector)
{
    Method method = class_getInstanceMethod(aClass,aSelector);
    if (method) {
        return method_getImplementation(method);
    } else {
        return NULL;
    }
}

IMP
QClassMethodImplementationForSEL(Class aClass, SEL aSelector)
{
    Method method = class_getClassMethod(aClass,aSelector);
    if (method) {
        return method_getImplementation(method);
    } else {
        return NULL;
    }
}

मैं क्यू-रनटाइम के बाद से इसे कुछ फाइलों में से कॉपी और पेस्ट कर रहा हूं। यह मेरी पुन: प्रयोज्य लाइब्रेरी है और यह इसका एक हिस्सा है। अगर कुछ संकलन नहीं करता है तो मुझे बताएं।


जब आप इस सवाल पर चर्चा करते हैं, तो आप भाग्य से बाहर नहीं आते हैं, जैसा कि इस सवाल पर चर्चा की गई है: stackoverflow.com/questions/56487679/…
raven_raven
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.