Ein großer Teil meiner App besteht aus Webansichten, um Funktionen bereitzustellen, die durch native Implementierungen noch nicht verfügbar sind. Das Webteam hat keine Pläne, ein dunkles Thema für die Website zu implementieren. Daher sieht meine App mit Dark Mode-Unterstützung unter iOS 13 ein bisschen halb aus.
Ist es möglich, die Unterstützung für den Dunkelmodus so zu deaktivieren, dass unsere App immer den Lichtmodus anzeigt, der zum Thema der Website passt?
ios
ios13
ios-darkmode
SeanR
quelle
quelle
UIUserInterfaceStyle
aufLight
Ihrem info.plist. Siehe developer.apple.com/library/archive/documentation/General/…Antworten:
Hier ist zunächst Apples Eintrag zum Deaktivieren des Dunkelmodus. Der Inhalt dieses Links ist für Xcode 11 und iOS 13 geschrieben :
Dieser Abschnitt gilt für die Verwendung von Xcode 11
Ansatz Nr. 1
Verwenden Sie den folgenden Schlüssel in Ihrer Datei info.plist :
Und weisen Sie ihm einen Wert von zu
Light
.Das XML für die
UIUserInterfaceStyle
Zuordnung:Ansatz Nr. 2
Sie können
overrideUserInterfaceStyle
gegen diewindow
Variable der App setzen .Je nachdem, wie Ihr Projekt erstellt wurde, befindet sich dies möglicherweise in der
AppDelegate
Datei oder in derSceneDelegate
.Apple-Dokumentation für overrideUserInterfaceStyle
Wie der obige Code in Xcode 11 aussehen wird:
Dieser Abschnitt gilt für die Verwendung von Xcode 10.x.
Wenn Sie Xcode 11 für Ihre Übermittlung verwenden, können Sie alles unter dieser Zeile ignorieren.
Da die entsprechende API in iOS 12 nicht vorhanden ist, werden beim Versuch, die oben angegebenen Werte zu verwenden, Fehler angezeigt:
Zum Einstellen
overrideUserInterfaceStyle
in IhremUIViewController
Dies kann in Xcode 10 durch Testen der Compiler-Version und der iOS-Version behoben werden:
Sie können das obige Snippet so ändern, dass es für die gesamte Anwendung für Xcode 10 funktioniert, indem Sie Ihrer
AppDelegate
Datei den folgenden Code hinzufügen .Bei Verwendung von Xcode Version 10.x schlägt die Plist-Einstellung jedoch fehl:
Dank an @Aron Nelson , @Raimundas Sakalauskas , @NSLeader und rmaddy für die Verbesserung dieser Antwort mit ihrem Feedback.
quelle
overrideUserInterfaceStyle
inviewDidLoad
jeder View - Controller, können Sie es einmal auf das Hauptfenster der Anwendung festgelegt. So viel einfacher, wenn Sie möchten, dass sich die gesamte App in eine Richtung verhält.#if compiler(>=5.1)
stattdessenresponds(to:)
undsetValue
Laut Apple - Sitzung zum Thema „Implementierung von dunklen Modus auf iOS“ ( https://developer.apple.com/videos/play/wwdc2019/214/ bei 31:13 Start) ist es möglich, Satz
overrideUserInterfaceStyle
zuUIUserInterfaceStyleLight
oderUIUserInterfaceStyleDark
auf jedem View - Controller oder Ansicht , die in der verwendet werdentraitCollection
für jede Unteransicht oder Ansichtssteuerung verwendet wird.Wie bereits von SeanR erwähnt, können Sie dies
UIUserInterfaceStyle
inLight
oderDark
in der Plist-Datei Ihrer App festlegen, um dies für Ihre gesamte App zu ändern.quelle
Wenn Sie Xcode 11 oder höher (z. B. iOS 13 oder höher SDK) nicht verwenden, hat sich Ihre App nicht automatisch für die Unterstützung des Dunkelmodus entschieden. Sie müssen den Dunkelmodus also nicht deaktivieren.
Wenn Sie Xcode 11 oder höher verwenden, hat das System den Dunkelmodus für Ihre App automatisch aktiviert. Es gibt zwei Möglichkeiten, den Dunkelmodus je nach Ihren Vorlieben zu deaktivieren. Sie können es vollständig deaktivieren oder für ein bestimmtes Fenster, eine bestimmte Ansicht oder einen bestimmten Ansichtscontroller deaktivieren.
Deaktivieren Sie den dunklen Modus vollständig für Ihre App
Sie können den Dunkelmodus deaktivieren, indem Sie den
UIUserInterfaceStyle
Schlüssel mit einem Wert wieLight
in der Info.plist-Datei Ihrer App einfügen. Dies ignoriert die Präferenzen des Benutzers und verleiht Ihrer App immer ein helles Aussehen.Deaktivieren Sie den Dunkelmodus für Fenster, Ansicht oder View Controller
Sie können erzwingen, dass Ihre Benutzeroberfläche immer hell oder dunkel angezeigt wird, indem Sie die Einstellung festlegen
overrideUserInterfaceStyle
Eigenschaft des entsprechenden Fensters, der Ansicht oder des Ansichtscontrollers festlegen.Controller anzeigen:
Ansichten:
Fenster:
Lesen Sie hier mehr: Auswählen eines bestimmten Schnittstellenstils für Ihre iOS-App
quelle
********** Einfachster Weg für Xcode 11 und höher ***********
Fügen Sie dies vorher zu info.plist hinzu
</dict></plist>
quelle
Ich glaube, ich habe die Lösung gefunden. Ich habe es zunächst aus UIUserInterfaceStyle - Information Property List und UIUserInterfaceStyle - UIKit zusammengesetzt , aber jetzt gefunden, dass es tatsächlich unter Auswählen eines bestimmten Schnittstellenstils für Ihre iOS-App dokumentiert ist .
In Ihrem
info.plist
setzenUIUserInterfaceStyle
( User Interface Design ) bis 1 (UIUserInterfaceStyle.light
).BEARBEITEN: Gemäß der Antwort von dorbeetle kann eine geeignetere Einstellung für
UIUserInterfaceStyle
seinLight
.quelle
[UIInterfaceStyle] '2' is not a recognized value for UIUserInterfaceStyle. Defaulting to Light.
Die obige Antwort funktioniert, wenn Sie die gesamte App deaktivieren möchten. Wenn Sie an der Bibliothek mit Benutzeroberfläche arbeiten und nicht den Luxus haben, .plist zu bearbeiten, können Sie dies auch über Code tun.
Wenn Sie mit iOS 13 SDK kompilieren, können Sie einfach den folgenden Code verwenden:
Schnell:
Obj-C:
JEDOCH , wenn Sie möchten, dass Ihr Code mit iOS 12 SDK kompiliert wird zu (die jetzt noch die letzte stabile SDK ist), sollten Sie auf die Verwendung Selektoren greifen. Code mit Selektoren:
Swift (XCode zeigt Warnungen für diesen Code an, aber dies ist die einzige Möglichkeit, dies zu tun, da die Eigenschaft in SDK 12 nicht vorhanden ist und daher nicht kompiliert werden kann):
Obj-C:
quelle
overrideUserInterfaceStyle
gehört.Neuestes Update-
Wenn Sie Xcode 10.x verwenden, dann der Standard
UIUserInterfaceStyle
istlight
für iOS 13.x. Wenn es auf einem iOS 13-Gerät ausgeführt wird, funktioniert es nur im Lichtmodus.Sie müssen den
UIUserInterfaceStyle
Schlüssel nicht explizit in die Datei Info.plist einfügen. Wenn Sie ihn hinzufügen, wird beim Überprüfen Ihrer App ein Fehler angezeigt.UIUserInterfaceStyle
Fügen Sie den Schlüssel nur in die Datei Info.plist ein, wenn Sie Xcode 11.x verwenden.quelle
Wenn Sie
UIUserInterfaceStyle
der plist-Datei einen Schlüssel hinzufügen , lehnt Apple möglicherweise den hier erwähnten Release-Build ab: https://stackoverflow.com/a/56546554/7524146 Auf jeden Fall ist es ärgerlich, jedem ViewController dies explizit mitzuteilenself.overrideUserInterfaceStyle = .light
. Sie können diesen Code-Code jedoch einmal für Ihr Stammobjekt verwendenwindow
:Beachten Sie nur, dass Sie dies im Inneren nicht tun können,
application(application: didFinishLaunchingWithOptions:)
da dieser Selektortrue
in diesem frühen Stadium nicht reagiert . Aber Sie können es später tun. Es ist sehr einfach, wenn Sie in Ihrer App benutzerdefinierteAppPresenter
oderAppRouter
Klassen verwenden, anstatt die Benutzeroberfläche in AppDelegate automatisch zu starten.quelle
Sie können den Dunkelmodus in der gesamten Anwendung in Xcode 11 deaktivieren:
Fügen Sie unten wie hinzu
Info.plist wird wie folgt aussehen ...
quelle
- Für die gesamte App (Fenster):
Sie können das Fenster von bekommen
SceneDelegate
- Für einen einzelnen ViewController:
Sie können jeden
viewController
selbst im viewController selbst einstellen- Für eine einzelne Ansicht:
Sie können jede festlegen
view
, auch innerhalb der Ansicht selbstMöglicherweise müssen Sie verwenden,
if #available(iOS 13.0, *) { ,,, }
wenn Sie frühere iOS-Versionen unterstützen.quelle
Abgesehen von anderen Antworten müssen Sie sich nach meinem Verständnis der folgenden Punkte nur auf den Dunkelmodus vorbereiten, wenn Sie mit iOS 13 SDK kompilieren (mit XCode 11).
Verknüpfung
quelle
Ja, Sie können überspringen, indem Sie den folgenden Code in viewDidLoad hinzufügen:
quelle
Meine App unterstützt derzeit keinen dunklen Modus und verwendet eine helle App-Balkenfarbe. Ich konnte den Inhalt der Statusleiste in dunklen Text und Symbole zwingen, indem ich meinem Schlüssel den folgenden Schlüssel hinzufügte
Info.plist
:Die anderen möglichen Werte finden Sie hier: https://developer.apple.com/documentation/uikit/uistatusbarstyle
quelle
Objective-c-Version
quelle
Hier sind einige Tipps und Tricks, die Sie in Ihrer App verwenden können, um den Dunkelmodus zu unterstützen oder zu umgehen.
Erster Tipp: So überschreiben Sie den ViewController-Stil
Sie können den Schnittstellenstil von UIViewController durch überschreiben
Zweiter Tipp: Hinzufügen eines Schlüssels in info.plist
Sie können einfach einen neuen Schlüssel hinzufügen
in Ihrer App info.plist und setzen Sie den Wert auf Hell oder Dunkel. Dadurch wird der Standardstil der App auf den von Ihnen angegebenen Wert überschrieben. Sie müssen nicht overrideUserInterfaceStyle = .light diese Zeile in jedem viewController hinzufügen, nur eine Zeile in info.plist ist es.
quelle
Fügen Sie einfach folgenden Schlüssel in Ihre
info.plist
Datei ein:quelle
quelle
Swift 5
Zwei Möglichkeiten, um den Dunkel- in den Hellmodus zu schalten:
quelle
Ich würde diese Lösung verwenden, da die Fenstereigenschaft während des App-Lebenszyklus geändert werden kann. Die Zuweisung von "overrideUserInterfaceStyle = .light" muss daher wiederholt werden. Mit UIWindow.appearance () können wir den Standardwert festlegen, der für neu erstellte UIWindow-Objekte verwendet wird.
quelle
Fügen Sie einfach diese Zeile in die Datei info.plist ein:
Dadurch wird die App nur im Lichtmodus ausgeführt.
quelle
quelle
Sie können Folgendes tun: Fügen Sie diesen neuen Schlüssel UIUserInterfaceStyle zu Info.plist hinzu und setzen Sie seinen Wert auf Light. und überprüfen Sie, ob der Alarmregler im Lichtmodus angezeigt wird.
UIUserInterfaceStyle Light Wenn Sie in Ihrer gesamten Anwendung den Hell / Dunkel-Modus erzwingen, unabhängig von den Einstellungen des Benutzers, fügen Sie den Schlüssel UIUserInterfaceStyle zu Ihrer Info.plist-Datei hinzu und setzen Sie den Wert entweder auf Hell oder Dunkel.
quelle
Diese Frage hat so viele Antworten. Wenn Sie sie in verwenden
info.plist
, können Sie sieAppDelegate
wie folgt einstellen :Test auf Xcode 11.3, iOS 13.3
quelle
Eigentlich habe ich gerade einen Code geschrieben, mit dem Sie den Dunkelmodus im Code global deaktivieren können, ohne mit jedem einzelnen viw-Controller in Ihrer Anwendung putzeln zu müssen. Dies kann wahrscheinlich verfeinert werden, um Klasse für Klasse durch Deaktivieren einer Klassenliste zu deaktivieren. Ich möchte, dass meine Benutzer sehen, ob ihnen die Dunkelmodus-Oberfläche für meine App gefällt, und wenn sie sie nicht mögen, können sie sie deaktivieren. Dadurch können sie den Dunkelmodus für den Rest ihrer Anwendungen weiterhin verwenden.
Die Auswahl der Benutzer ist gut (Ahem, wenn Sie sich Apple ansehen, sollten Sie es so implementiert haben).
Das funktioniert also so, dass es nur eine Kategorie von UIViewController ist. Beim Laden wird die native viewDidLoad-Methode durch eine ersetzt, die ein globales Flag überprüft, um festzustellen, ob der Dunkelmodus für alles deaktiviert ist oder nicht.
Da es beim Laden von UIViewController ausgelöst wird, sollte es automatisch gestartet und der Dunkelmodus standardmäßig deaktiviert werden. Wenn dies nicht das ist, was Sie wollen, müssen Sie irgendwo früh einsteigen und das Flag setzen, oder setzen Sie einfach das Standard-Flag.
Ich habe noch nichts geschrieben, um dem Benutzer zu antworten, der die Flagge ein- oder ausschaltet. Das ist also im Grunde ein Beispielcode. Wenn der Benutzer damit interagieren soll, müssen alle Ansichts-Controller neu geladen werden. Ich weiß nicht, wie ich das ohne weiteres machen soll, aber wahrscheinlich reicht es aus, eine Benachrichtigung zu senden. Im Moment funktioniert dieses globale Ein / Aus für den Dunkelmodus nur beim Start oder Neustart der App.
Jetzt reicht es nicht mehr aus, den Dunkelmodus in jedem einzelnen MFING viewController in Ihrer riesigen App auszuschalten. Wenn Sie Farbressourcen verwenden, sind Sie vollständig entbeint. Wir haben seit mehr als 10 Jahren unveränderliche Objekte als unveränderlich verstanden. Farben, die Sie aus dem Farb-Asset-Katalog erhalten, sind UIColor-Farben, aber dynamische (veränderbare) Farben, die sich unter Ihnen ändern, wenn das System vom Dunkel- in den Hell-Modus wechselt. Das soll ein Feature sein. Aber natürlich gibt es keinen Master-Schalter, der diese Dinge auffordert, diese Änderung zu beenden (soweit ich jetzt weiß, kann vielleicht jemand dies verbessern).
Die Lösung besteht also aus zwei Teilen:
Eine öffentliche Kategorie auf UIViewController, die einige nützliche und bequeme Methoden bietet. Ich glaube zum Beispiel nicht, dass Apple darüber nachgedacht hat, dass einige von uns Webcode in ihre Apps einmischen. Als solche haben wir Stylesheets, die basierend auf dem Dunkel- oder Hellmodus umgeschaltet werden müssen. Daher müssen Sie entweder eine Art dynamisches Stylesheet-Objekt erstellen (was gut wäre) oder einfach nach dem aktuellen Status fragen (schlecht, aber einfach).
Diese Kategorie ersetzt beim Laden die viewDidLoad-Methode der UIViewController-Klasse und fängt Aufrufe ab. Ich weiß nicht, ob das gegen die App Store-Regeln verstößt. Wenn dies der Fall ist, gibt es wahrscheinlich andere Möglichkeiten, aber Sie können es als Proof of Concept betrachten. Sie können beispielsweise eine Unterklasse aller Haupttypen von Ansichtscontrollern erstellen und alle Ihre eigenen Ansichtscontroller von diesen erben lassen. Anschließend können Sie die DarkMode-Kategorieidee verwenden und sie aufrufen, um das Deaktivieren aller Ihrer Ansichtscontroller zu erzwingen. Es ist hässlicher, aber es wird keine Regeln brechen. Ich bevorzuge die Verwendung der Laufzeit, da dies die Aufgabe der Laufzeit ist. In meiner Version fügen Sie einfach die Kategorie hinzu. Sie legen eine globale Variable für die Kategorie fest, ob sie den Dunkelmodus blockieren soll oder nicht.
Sie sind noch nicht aus dem Wald, wie bereits erwähnt, das andere Problem ist, dass UIColor im Grunde alles tut, was zum Teufel es will. Selbst wenn Ihre View Controller den Dunkelmodus blockieren, weiß UIColor nicht, wo oder wie Sie ihn verwenden, und kann sich daher nicht anpassen. Infolgedessen können Sie es korrekt abrufen, aber dann wird es irgendwann in der Zukunft auf Sie zurückgreifen. Vielleicht bald, vielleicht später. Um dies zu umgehen, müssen Sie es zweimal mit einer CGColor zuweisen und in eine statische Farbe umwandeln. Dies bedeutet, wenn Ihr Benutzer zurückkehrt und den Dunkelmodus auf Ihrer Einstellungsseite wieder aktiviert (die Idee hier ist, dass dies funktioniert, damit der Benutzer über den Rest des Systems hinaus die Kontrolle über Ihre App hat), all diese statischen Farben müssen ersetzt werden. Bisher muss dies jemand anderes lösen. Der einfachste Weg, dies zu tun, besteht darin, einen Standardwert festzulegen, den Sie ' Wenn Sie den Dunkelmodus wieder deaktivieren, teilen Sie ihn durch Null, um die App zum Absturz zu bringen, da Sie sie nicht beenden können, und weisen Sie den Benutzer an, sie einfach neu zu starten. Das verstößt wahrscheinlich auch gegen die Richtlinien des App Stores, aber es ist eine Idee.
Die UIColor-Kategorie muss nicht verfügbar gemacht werden. Sie ruft lediglich colorNamed auf: ... Wenn Sie der DarkMode ViewController-Klasse nicht mitgeteilt haben, dass sie den Dunkelmodus blockieren soll, funktioniert sie wie erwartet einwandfrei. Der Versuch, etwas Elegantes anstelle des Standard-Apple-Sphaghetti-Codes zu erstellen, bedeutet, dass Sie den größten Teil Ihrer App ändern müssen, wenn Sie den Dunkelmodus programmgesteuert deaktivieren oder umschalten möchten. Jetzt weiß ich nicht, ob es eine bessere Möglichkeit gibt, die Info.plist programmgesteuert zu ändern, um den Dunkelmodus nach Bedarf auszuschalten. Soweit ich weiß, ist dies eine Funktion zur Kompilierungszeit, und danach sind Sie entbeint.
Hier ist der Code, den Sie benötigen. Sollte vorbeischauen und nur die eine Methode verwenden, um den UI-Stil festzulegen oder den Standard im Code festzulegen. Es steht Ihnen frei, dies für jeden Zweck zu verwenden, zu ändern und zu tun, was immer Sie wollen, und es wird keine Garantie gegeben, und ich weiß nicht, ob es den App Store passieren wird. Verbesserungen sind sehr willkommen.
Faire Warnung Ich verwende kein ARC oder andere Handholding-Methoden.
Es gibt eine Reihe von Dienstprogrammfunktionen, mit denen Methoden ausgetauscht werden. Separate Datei. Dies ist jedoch Standard und Sie können ähnlichen Code überall finden.
Ich kopiere und füge dies aus ein paar Dateien ein, da q-runtime.h meine wiederverwendbare Bibliothek ist und dies nur ein Teil davon ist. Wenn etwas nicht kompiliert werden kann, lass es mich wissen.
quelle