web-dev-qa-db-fra.com

Est-il possible de désactiver le mode sombre sur iOS 13?

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 sorte que notre application affiche toujours le mode clair pour correspondre au thème du site Web?

257
SeanR

Tout d'abord, voici entrée d'Apple lié à 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


Si vous souhaitez retirer votre candidature ENTIÈREMENT

Approche n ° 1

Utilisez le fichier clé suivante dans votre info.plist :

UIUserInterfaceStyle

Et affectez-lui une valeur de Light.

Le [~ # ~] xml [~ # ~] pour l'affectation UIUserInterfaceStyle:

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

Approche n ° 2

Vous pouvez définir overrideUserInterfaceStyle par rapport à la variable window de l'application.

Selon la façon dont votre projet a été créé, cela peut être dans le fichier AppDelegate ou SceneDelegate.

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

Si vous souhaitez désactiver votre UIViewController sur une base individuelle

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

documentation Apple pour overrideUserInterfaceStyle

A quoi ressemblera le code ci-dessus dans Xcode 11:

enter image description here

Cette section s'applique à l'utilisation de Xcode 10.x


Si vous utilisez Xcode 11 pour votre soumission, vous pouvez ignorer 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 définir overrideUserInterfaceStyle dans votre UIViewController

enter image description here

Si vous souhaitez désactiver votre UIViewController sur une base individuelle

Cela peut être géré dans Xcode 10 en testant la version du compilateur et la version iOS:

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

Si vous souhaitez retirer votre candidature ENTIÈREMENT

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 fichier AppDelegate.

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

Cependant, le paramètre plist échouera lors de l'utilisation de Xcode version 10.x:

enter image description here

Crédit à @ Aron Nelson , @ Raimundas Sakalauskas , @ NSLeader et rmaddy pour améliorer cette réponse avec leurs commentaires.

546
CodeBender

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 à UIUserInterfaceStyleLight ou UIUserInterfaceStyleDark sur n'importe quel contrôleur de vue ou vue, qui sera utilisé dans le traitCollection pour toute sous-vue ou contrôleur de vue.

Comme déjà mentionné par SeanR, vous pouvez définir UIUserInterfaceStyle sur Light ou Dark dans le fichier plist de votre application pour changer cela pour l'ensemble de votre application.

160
dorbeetle

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ésactivez le mode sombre entièrement pour votre application

Vous pouvez désactiver le mode sombre en incluant la clé UIUserInterfaceStyle avec une valeur comme Light dans le fichier Info.plist de votre application.
UIUserInterfaceStyle as Light
Cela ignore la préférence de l'utilisateur et applique toujours une apparence claire à votre application.

Désactivez le mode sombre pour Window, View ou View Controller

Vous pouvez forcer votre interface à toujours apparaître dans un style clair ou foncé en définissant la propriété overrideUserInterfaceStyle de la fenêtre, de la vue ou du contrôleur de vue approprié.

Afficher les contrôleurs:

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

Vues:

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

La fenêtre:

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

Remarque: Apple encourage fortement la prise en charge du mode sombre dans votre application. Par conséquent, vous ne pouvez désactiver le mode sombre que temporairement.

En savoir plus ici: Choix d'un style d'interface spécifique pour votre application iOS

58
Ajith R Nayak

********** Moyen le plus simple pour Xcode 11 et supérieur ***********

Ajoutez ceci à info.plist avant </dict></plist>

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

Je pense avoir trouvé la solution. Je l'ai initialement reconstitué à partir de IUserInterfaceStyle - Information Property List et IUserInterfaceStyle - UIKit , mais je l'ai maintenant trouvé réellement documenté à Choisir un style d'interface spécifique pour votre iOS app .

Dans votre info.plist, définissez UIUserInterfaceStyle ( Style d'interface utilisateur ) sur 1 ( UIUserInterfaceStyle.light ).

EDIT: Selon la réponse de dorbeetle, un paramètre plus approprié pour UIUserInterfaceStyle peut être Light.

27
SeanR

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:

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

Obj-C:

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

CEPENDANT , si vous voulez que votre code compile contre SDK iOS 12 aussi (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):

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

Obj-C:

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

Dernière mise à jour-

Si vous utilisez Xcode 10.x, la valeur par défaut UIUserInterfaceStyle est light 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 clé UIUserInterfaceStyle dans le fichier Info.plist, l'ajouter donnera une erreur lors de la validation de votre application, en disant:

Clé Info.plist non valide. La clé "UIUserInterfaceStyle" du fichier Payload/AppName.appInfo.plist n'est pas valide.

Ajoutez uniquement la clé UIUserInterfaceStyle dans le fichier Info.plist lorsque vous utilisez Xcode 11.x.

12
kumarsiddharth123

Si vous ajoutez la clé UIUserInterfaceStyle au fichier plist, peut-être Apple rejettera la version de la version comme mentionné ici: https://stackoverflow.com/a/56546554/7524146 Quoi qu'il en soit, il est ennuyeux de dire explicitement chaque ViewController self.overrideUserInterfaceStyle = .light. Mais vous pouvez utiliser cette paix de code une fois pour votre racine window objet:

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

Notez juste que vous ne pouvez pas faire cela dans application(application: didFinishLaunchingWithOptions:) car pour ce sélecteur ne répondra pas true à ce stade précoce. Mais vous pouvez le faire plus tard. C'est très facile si vous utilisez une classe AppPresenter ou AppRouter personnalisée dans votre application au lieu de démarrer automatiquement l'interface utilisateur dans AppDelegate.

9
SerhiiK

- Pour toute l'application (fenêtre):

window!.overrideUserInterfaceStyle = .light

Vous pouvez obtenir la fenêtre de SceneDelegate

- Pour un seul ViewController:

viewController.overrideUserInterfaceStyle = .light

Vous pouvez définir n'importe quel viewController, même à l'intérieur du viewController, il self

- Pour une seule vue:

view.overrideUserInterfaceStyle = .light

Vous pouvez définir n'importe quel view, même à l'intérieur de la vue self

Vous devrez peut-être utiliser if #available(iOS 13.0, *) { ,,, } si vous prenez en charge les versions antérieures d'iOS.

7
Mojtaba Hosseini

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).

Le système suppose que les applications liées au SDK iOS 13 ou version ultérieure prennent en charge les apparences claires et sombres. Dans iOS, vous spécifiez l'apparence spécifique que vous souhaitez en attribuant un style d'interface spécifique à votre fenêtre, vue ou contrôleur de vue. Vous pouvez également désactiver entièrement la prise en charge du mode sombre à l'aide d'une clé Info.plist.

Lien

6
Claudio

Vous pouvez désactiver le mode sombre dans toute l'application xcode 11 ou plus

  1. Allez Info.plish
  2. Ajouter ci-dessous comme

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

Info.plist sera comme ci-dessous.

enter image description here

5
Enamul Haque

Oui, vous pouvez ignorer en ajoutant le code suivant dans viewDidLoad:

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

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:

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

Trouvez les autres valeurs possibles ici: https://developer.Apple.com/documentation/uikit/uistatusbarstyle

2
ToniTornado

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

1: overrideUserInterfaceStyle = .dark // Pour le mode sombre

2: overrideUserInterfaceStyle = .light // Pour le mode d'éclairage

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

Deuxième conseil: ajouter une clé dans info.plist

Vous pouvez simplement ajouter une nouvelle clé

UIUserInterfaceStyle

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.

1
Mohammed Ebrahim

Ajoutez simplement la clé suivante dans votre info.plist fichier :

<key>UIUserInterfaceStyle</key>
    <string>Light</string>
1
Moeen Ahmad

Version Objective-C

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

extension UIViewController {

    override open func awakeFromNib() {

        super.awakeFromNib()

        if #available(iOS 13.0, *) {

            overrideUserInterfaceStyle = .light

        }

    }
}
0

Vous pouvez faire: ajoutez cette nouvelle clé UIUserInterfaceStyle à Info.plist et définissez sa valeur sur Light. et vérifiez que le contrôleur d'alerte apparaît avec le mode d'éclairage.

UIUserInterfaceStyle Light Si vous forcez le mode clair/sombre dans toute 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é.

0
Hominda

Ajoutez simplement ces lignes dans le fichier info.plist:

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

Cela forcera l'application à fonctionner uniquement en mode léger.

0
Rahul Gusain
 if #available(iOS 13.0, *) {
            overrideUserInterfaceStyle = .light
        } else {
            // Fallback on earlier versions
        }
0
Talha Rasool

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.

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
Dmitry