Une grande partie de mon application se compose de vues Web pour fournir des fonctionnalités qui ne sont pas encore disponibles via les implémentations natives. L'équipe Web n'a pas l'intention de mettre en œuvre un thème sombre pour le site Web. En tant que tel, mon application sera un peu à moitié avec la prise en charge du mode sombre sur iOS 13.
Est-il possible de désactiver la prise en charge du mode sombre de telle sorte que notre application affiche toujours le mode clair pour correspondre au thème du site Web?
ios
ios13
ios-darkmode
SeanR
la source
la source
UIUserInterfaceStyle
surLight
dans votre Info.Plist. Voir developer.apple.com/library/archive/documentation/General/…Réponses:
Tout d'abord, voici l'entrée d'Apple relative à la désactivation du mode sombre. Le contenu de ce lien est écrit pour Xcode 11 et iOS 13 :
Cette section s'applique à l'utilisation de Xcode 11
Approche n ° 1
Utilisez la clé suivante dans votre fichier info.plist :
Et affectez-lui une valeur de
Light
.Le XML de l'
UIUserInterfaceStyle
affectation:Approche n ° 2
Vous pouvez définir
overrideUserInterfaceStyle
lawindow
variable de l'application .Selon la façon dont votre projet a été créé, cela peut être dans le
AppDelegate
fichier ou leSceneDelegate
.Documentation Apple pour overrideUserInterfaceStyle
A quoi ressemblera le code ci-dessus dans Xcode 11:
Cette section s'applique à l'utilisation de Xcode 10.x
Si vous utilisez Xcode 11 pour votre soumission, vous pouvez ignorer en toute sécurité tout ce qui se trouve en dessous de cette ligne.
Étant donné que l'API appropriée n'existe pas dans iOS 12, vous obtiendrez des erreurs lorsque vous tenterez d'utiliser les valeurs fournies ci-dessus:
Pour installer
overrideUserInterfaceStyle
votreUIViewController
Cela peut être géré dans Xcode 10 en testant la version du compilateur et la version iOS:
Vous pouvez modifier l'extrait ci-dessus pour qu'il fonctionne avec l'ensemble de l'application pour Xcode 10, en ajoutant le code suivant à votre
AppDelegate
fichier.Cependant, le paramètre plist échouera lors de l'utilisation de Xcode version 10.x:
Crédit @Aron Nelson , @Raimundas Sakalauskas , @NSLeader et rmaddy pour améliorer cette réponse avec leurs commentaires.
la source
overrideUserInterfaceStyle
enviewDidLoad
de chaque contrôleur de vue, vous pouvez le régler une fois sur la fenêtre principale de l'application. C'est beaucoup plus facile si vous voulez que l'application se comporte dans un sens.#if compiler(>=5.1)
plutôtresponds(to:)
etsetValue
Selon la session d'Apple sur "Implémentation du mode sombre sur iOS" ( https://developer.apple.com/videos/play/wwdc2019/214/ à partir de 31:13), il est possible de définir
overrideUserInterfaceStyle
surUIUserInterfaceStyleLight
ouUIUserInterfaceStyleDark
sur n'importe quel contrôleur de vue ou vue , qui sera utilisé dans letraitCollection
pour toute sous-vue ou contrôleur de vue.Comme déjà mentionné par SeanR, vous pouvez définir
UIUserInterfaceStyle
surLight
ouDark
dans le fichier plist de votre application pour modifier cela pour l'ensemble de votre application.la source
Si vous n'utilisez pas Xcode 11 ou une version ultérieure (i, e iOS 13 ou une version ultérieure du SDK), votre application n'a pas automatiquement choisi de prendre en charge le mode sombre. Il n'est donc pas nécessaire de désactiver le mode sombre.
Si vous utilisez Xcode 11 ou une version ultérieure, le système a automatiquement activé le mode sombre pour votre application. Il existe deux approches pour désactiver le mode sombre en fonction de vos préférences. Vous pouvez le désactiver entièrement ou le désactiver pour une fenêtre, une vue ou un contrôleur de vue spécifique.
Désactiver le mode sombre entièrement pour votre application
Vous pouvez désactiver le mode sombre en incluant la
UIUserInterfaceStyle
clé avec une valeur commeLight
dans le fichier Info.plist de votre application. Cela ignore la préférence de l'utilisateur et applique toujours une apparence claire à votre application.Désactiver le mode sombre pour Window, View ou View Controller
Vous pouvez forcer votre interface à toujours apparaître dans un style clair ou sombre en définissant
overrideUserInterfaceStyle
propriété de la fenêtre, de la vue ou du contrôleur de vue approprié.Afficher les contrôleurs:
Vues:
La fenêtre:
En savoir plus ici: Choisir un style d'interface spécifique pour votre application iOS
la source
********** Moyen le plus simple pour Xcode 11 et supérieur ***********
Ajoutez ceci à info.plist avant
</dict></plist>
la source
Je pense avoir trouvé la solution. Je l'ai initialement reconstitué à partir de UIUserInterfaceStyle - Information Property List et UIUserInterfaceStyle - UIKit , mais je l'ai maintenant trouvé réellement documenté à Choisir un style d'interface spécifique pour votre application iOS .
Dans votre
info.plist
, définissezUIUserInterfaceStyle
( Style d'interface utilisateur ) sur 1 (UIUserInterfaceStyle.light
).EDIT: Selon la réponse de dorbeetle, un réglage plus approprié
UIUserInterfaceStyle
pourrait êtreLight
.la source
[UIInterfaceStyle] '2' is not a recognized value for UIUserInterfaceStyle. Defaulting to Light.
La réponse ci-dessus fonctionne si vous souhaitez désactiver l'application entière. Si vous travaillez sur la bibliothèque qui a une interface utilisateur et que vous n'avez pas le luxe d'éditer .plist, vous pouvez également le faire via du code.
Si vous compilez avec le SDK iOS 13, vous pouvez simplement utiliser le code suivant:
Rapide:
Obj-C:
CEPENDANT , si vous voulez que votre code soit compilé avec le SDK iOS 12 (qui est actuellement le dernier SDK stable), vous devez recourir à des sélecteurs. Code avec sélecteurs:
Swift (XCode affichera des avertissements pour ce code, mais c'est la seule façon de le faire pour l'instant car la propriété n'existe pas dans le SDK 12 ne compilera donc pas):
Obj-C:
la source
overrideUserInterfaceStyle
appartient la propriété .Dernière mise à jour-
Si vous utilisez Xcode 10.x, la valeur par défaut
UIUserInterfaceStyle
estlight
pour iOS 13.x. Lorsqu'il est exécuté sur un appareil iOS 13, il ne fonctionnera qu'en mode léger.Pas besoin d'ajouter explicitement la
UIUserInterfaceStyle
clé dans le fichier Info.plist, l'ajouter donnera une erreur lorsque vous validerez votre application, en disant:UIUserInterfaceStyle
N'ajoutez la clé dans le fichier Info.plist que lorsque vous utilisez Xcode 11.x.la source
Si vous ajoutez une
UIUserInterfaceStyle
clé au fichier plist, Apple rejettera peut-être la version de la version comme indiqué ici: https://stackoverflow.com/a/56546554/7524146 Quoi qu'il en soit, il est ennuyeux de dire explicitement à chaque ViewControllerself.overrideUserInterfaceStyle = .light
. Mais vous pouvez utiliser cette paix de code une fois pour votrewindow
objet racine :Notez juste que vous ne pouvez pas faire cela à l'intérieur
application(application: didFinishLaunchingWithOptions:)
car ce sélecteur ne répondra pastrue
à ce stade précoce. Mais vous pouvez le faire plus tard. C'est très facile si vous utilisez une classe personnaliséeAppPresenter
ouAppRouter
dans votre application au lieu de démarrer automatiquement l'interface utilisateur dans AppDelegate.la source
Vous pouvez désactiver le mode sombre dans toute l'application dans Xcode 11:
Ajouter ci-dessous comme
Info.plist ressemblera à ci-dessous ...
la source
- Pour toute l'application (fenêtre):
Vous pouvez obtenir la fenêtre de
SceneDelegate
- Pour un seul ViewController:
Vous pouvez définir tout
viewController
, même à l' intérieur du viewController il auto- Pour une seule vue:
Vous pouvez définir tout
view
, même à l' intérieur de la vue , il autoVous devrez peut-être utiliser
if #available(iOS 13.0, *) { ,,, }
si vous prenez en charge les versions antérieures d'iOS.la source
Mis à part les autres réponses, d'après ma compréhension des éléments suivants, il vous suffit de vous préparer au mode sombre lors de la compilation avec le SDK iOS 13 (en utilisant XCode 11).
Lien
la source
Oui, vous pouvez ignorer en ajoutant le code suivant dans viewDidLoad:
la source
Mon application ne prend pas en charge le mode sombre à partir de maintenant et utilise une couleur de barre d'application claire. J'ai pu forcer le contenu de la barre d'état en texte et icônes sombres en ajoutant la clé suivante à mon
Info.plist
:Trouvez les autres valeurs possibles ici: https://developer.apple.com/documentation/uikit/uistatusbarstyle
la source
Version Objective-C
la source
Voici quelques trucs et astuces que vous pouvez utiliser dans votre application pour prendre en charge ou contourner le mode sombre.
Premier conseil: pour remplacer le style ViewController
vous pouvez remplacer le style d'interface de UIViewController en
Deuxième conseil: ajouter une clé dans info.plist
Vous pouvez simplement ajouter une nouvelle clé
dans votre application info.plist et définissez sa valeur sur Clair ou Foncé. cela remplacera le style par défaut de l'application par la valeur que vous fournissez. Vous n'avez pas besoin d'ajouter overrideUserInterfaceStyle = .light cette ligne dans chaque viewController, juste une ligne dans info.plist c'est tout.
la source
Ajoutez simplement la clé suivante dans votre
info.plist
fichier:la source
la source
Swift 5
Deux façons de passer du mode sombre au mode clair:
la source
J'utiliserais cette solution car la propriété de la fenêtre peut être modifiée pendant le cycle de vie de l'application. L'affectation de "overrideUserInterfaceStyle = .light" doit donc être répétée. UIWindow.appearance () nous permet de définir la valeur par défaut qui sera utilisée pour les objets UIWindow nouvellement créés.
la source
Ajoutez simplement ces lignes dans le fichier info.plist:
Cela forcera l'application à fonctionner en mode léger uniquement.
la source
la source
Vous pouvez faire: ajoutez cette nouvelle clé UIUserInterfaceStyle à Info.plist et définissez sa valeur sur Light. et vérifier que le contrôleur d'alerte apparaît avec le mode d'éclairage.
UIUserInterfaceStyle Light Si vous forcez le mode clair / sombre dans l'ensemble de votre application, quels que soient les paramètres de l'utilisateur, ajoutez la clé UIUserInterfaceStyle à votre fichier Info.plist et définissez sa valeur sur Clair ou Foncé.
la source
Cette question a tellement de réponses, plutôt en l'utilisant,
info.plist
vous pouvez la définirAppDelegate
comme ceci:Test sur Xcode 11.3, iOS 13.3
la source
En fait, je viens d'écrire du code qui vous permettra de désactiver globalement le mode sombre dans le code sans avoir à mettre en place tous les contrôleurs viw de votre application. Cela peut probablement être affiné pour se retirer classe par classe en gérant une liste de classes. Pour moi, ce que je veux, c'est que mes utilisateurs voient s'ils aiment l'interface en mode sombre de mon application, et s'ils ne l'aiment pas, ils peuvent la désactiver. Cela leur permettra de continuer à utiliser le mode sombre pour le reste de leurs applications.
Le choix de l'utilisateur est bon (Ahem, en te regardant Apple, c'est comme ça que tu aurais dû l'implémenter).
Donc, comment cela fonctionne, c'est que c'est juste une catégorie de UIViewController. Lorsqu'il se charge, il remplace la méthode native viewDidLoad par une qui vérifiera un indicateur global pour voir si le mode sombre est désactivé pour tout ou non.
Parce qu'il est déclenché lors du chargement de UIViewController, il devrait démarrer automatiquement et désactiver le mode sombre par défaut. Si ce n'est pas ce que vous voulez, vous devez y arriver tôt et définir le drapeau, ou bien simplement définir le drapeau par défaut.
Je n'ai encore rien écrit pour répondre à l'utilisateur qui active ou désactive le drapeau. Il s'agit donc essentiellement d'un exemple de code. Si nous voulons que l'utilisateur interagisse avec cela, tous les contrôleurs de vue devront être rechargés. Je ne sais pas comment faire cela à la volée mais probablement envoyer une notification va faire l'affaire. Donc, pour le moment, cette activation / désactivation globale du mode sombre ne fonctionnera qu'au démarrage ou au redémarrage de l'application.
Maintenant, il ne suffit plus d'essayer de désactiver le mode sombre dans chaque viewController MFING de votre énorme application. Si vous utilisez des actifs de couleur, vous êtes complètement désossé. Depuis plus de 10 ans, nous comprenons que les objets immuables sont immuables. Les couleurs que vous obtenez dans le catalogue des ressources de couleur disent qu'elles sont UIColor mais ce sont des couleurs dynamiques (modifiables) et changeront sous vous lorsque le système passera du mode sombre au mode clair. C'est censé être une fonctionnalité. Mais bien sûr, il n'y a pas de bascule principale pour demander à ces choses de cesser de faire ce changement (à ma connaissance, peut-être que quelqu'un peut améliorer cela).
La solution est donc en deux parties:
une catégorie publique sur UIViewController qui donne des méthodes d'utilité et de commodité ... par exemple, je ne pense pas qu'Apple ait pensé au fait que certains d'entre nous mélangent du code Web dans nos applications. En tant que tel, nous avons des feuilles de style qui doivent être basculées en fonction du mode sombre ou clair. Ainsi, vous devez soit créer une sorte d'objet de feuille de style dynamique (ce qui serait bien), soit simplement demander quel est l'état actuel (mauvais mais facile).
cette catégorie lors du chargement remplacera la méthode viewDidLoad de la classe UIViewController et interceptera les appels. Je ne sais pas si cela enfreint les règles de l'App Store. Si c'est le cas, il existe probablement d'autres moyens de contourner cela, mais vous pouvez le considérer comme une preuve de concept. Vous pouvez par exemple créer une sous-classe de tous les principaux types de contrôleurs de vue et faire hériter tous vos propres contrôleurs de vue de ceux-ci, puis vous pouvez utiliser l'idée de catégorie DarkMode et l'appeler pour forcer la désactivation de tous vos contrôleurs de vue. C'est plus laid mais ça ne va enfreindre aucune règle. Je préfère utiliser le runtime car c'est pour cela que le runtime a été conçu. Donc, dans ma version, vous ajoutez simplement la catégorie, vous définissez une variable globale sur la catégorie pour savoir si vous souhaitez ou non qu'elle bloque le mode sombre, et elle le fera.
Vous n'êtes pas encore sorti du bois, comme mentionné, l'autre problème est que UIColor fait essentiellement ce qu'il veut. Donc, même si vos contrôleurs de vue bloquent le mode sombre, UIColor ne sait pas où ni comment vous l'utilisez, donc ne peut pas s'adapter. En conséquence, vous pouvez le récupérer correctement, mais cela reviendra sur vous à un moment donné dans le futur. Peut-être bientôt peut-être plus tard. Donc, la solution consiste à l'allouer deux fois à l'aide d'un CGColor et à le transformer en une couleur statique. Cela signifie que si votre utilisateur revient en arrière et réactive le mode sombre sur votre page de paramètres (l'idée est de faire en sorte que cela fonctionne afin que l'utilisateur ait le contrôle sur votre application au-delà du reste du système), toutes ces couleurs statiques besoin de remplacement. Jusqu'à présent, cela reste à résoudre par quelqu'un d'autre. Le moyen le plus simple de le faire est de faire un défaut que vous ' en désactivant le mode sombre, divisez par zéro pour planter l'application car vous ne pouvez pas la quitter et dire à l'utilisateur de simplement la redémarrer. Cela viole probablement également les directives de l'App Store, mais c'est une idée.
La catégorie UIColor n'a pas besoin d'être exposée, elle fonctionne simplement en appelant colorNamed: ... si vous n'avez pas dit à la classe DarkMode ViewController de bloquer le mode sombre, cela fonctionnera parfaitement comme prévu. Essayer de créer quelque chose d'élégant au lieu du code standard des sphaghetti aux pommes, ce qui signifie que vous devrez modifier la plupart de votre application si vous souhaitez désactiver par programme le mode sombre ou le basculer. Maintenant, je ne sais pas s'il existe un meilleur moyen de modifier par programmation l'Info.plist pour désactiver le mode sombre si nécessaire. Pour autant que je sache, c'est une fonction de compilation et après cela, vous êtes désossé.
Voici donc le code dont vous avez besoin. Doit être déposé et utiliser la seule méthode pour définir le style d'interface utilisateur ou définir la valeur par défaut dans le code. Vous êtes libre d'utiliser, de modifier, de faire tout ce que vous voulez avec cela pour n'importe quel but et aucune garantie n'est donnée et je ne sais pas si cela passera sur l'App Store. Améliorations très bienvenues.
Juste avertissement Je n'utilise pas ARC ou toute autre méthode de prise en main.
Il existe un ensemble de fonctions utilitaires que cela utilise pour effectuer un échange de méthode. Fichier séparé. Il s'agit cependant de choses standard et vous pouvez trouver du code similaire n'importe où.
Je copie et colle ceci à partir de quelques fichiers depuis que q-runtime.h est ma bibliothèque réutilisable et ceci n'en est qu'une partie. Si quelque chose ne se compile pas, faites le moi savoir.
la source