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?
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 :
Si vous souhaitez retirer votre candidature ENTIÈREMENT
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>
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:
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
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:
Crédit à @ Aron Nelson , @ Raimundas Sakalauskas , @ NSLeader et rmaddy pour améliorer cette réponse avec leurs commentaires.
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.
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.
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
********** Moyen le plus simple pour Xcode 11 et supérieur ***********
Ajoutez ceci à info.plist avant </dict></plist>
<key>UIUserInterfaceStyle</key>
<string>Light</string>
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
.
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"];
}
}
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.
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.
window!.overrideUserInterfaceStyle = .light
Vous pouvez obtenir la fenêtre de SceneDelegate
viewController.overrideUserInterfaceStyle = .light
Vous pouvez définir n'importe quel viewController
, même à l'intérieur du viewController, il self
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.
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.
Oui, vous pouvez ignorer en ajoutant le code suivant dans viewDidLoad:
if #available(iOS 13.0, *) {
// Always adopt a light interface style.
overrideUserInterfaceStyle = .light
}
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
Voici quelques trucs et astuces que vous pouvez utiliser dans votre application pour prendre en charge ou contourner le mode sombre.
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
}
}
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.
Ajoutez simplement la clé suivante dans votre info.plist
fichier :
<key>UIUserInterfaceStyle</key>
<string>Light</string>
if (@available(iOS 13.0, *)) {
_window.overrideUserInterfaceStyle = UIUserInterfaceStyleLight;
}
import UIKit
extension UIViewController {
override open func awakeFromNib() {
super.awakeFromNib()
if #available(iOS 13.0, *) {
overrideUserInterfaceStyle = .light
}
}
}
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é.
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.
if #available(iOS 13.0, *) {
overrideUserInterfaceStyle = .light
} else {
// Fallback on earlier versions
}
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
}
}