Dark Mode

Bonjour,
La couleur des éléments texte de mon interface ne change pas en fonction du "mode d'apparence", clair ou sombre.
J'ai pourtant défini mes couleurs "Any/Dark" dans Assets.xcassets (que j'ai nommé "AccentColor") et modifié les couleurs de tous mes éléments en choisissant AccentColor dans l'interface de Xcode. Mais l'apparence de mon interface ne bouge pas du tout en fonction du mode choisi par l'utilisateur.
Faut-il faire autre chose? J'ai vu que certains développeurs modifient les couleurs au sein de leur code. Bien que cette façon de faire me semble être un boulot énorme, j'ai tenté le coup sur un label mais sa couleur ne change pas quand on change le mode d'apparence. Qu'est-ce qui m'échappe?
Quelqu'un aurait-il le code d'une petite application d'exemple?

Réponses

  • @Rocou a dit :
    Bonjour,
    La couleur des éléments texte de mon interface ne change pas en fonction du "mode d'apparence", clair ou sombre.
    J'ai pourtant défini mes couleurs "Any/Dark" dans Assets.xcassets (que j'ai nommé "AccentColor") et modifié les couleurs de tous mes éléments en choisissant AccentColor dans l'interface de Xcode. Mais l'apparence de mon interface ne bouge pas du tout en fonction du mode choisi par l'utilisateur.
    Faut-il faire autre chose? J'ai vu que certains développeurs modifient les couleurs au sein de leur code. Bien que cette façon de faire me semble être un boulot énorme, j'ai tenté le coup sur un label mais sa couleur ne change pas quand on change le mode d'apparence. Qu'est-ce qui m'échappe?
    Quelqu'un aurait-il le code d'une petite application d'exemple?

    Le dark mode c'est simple:

    • tu dois utiliser NSColor et oublier CGColor si tu veux quelque chose de simple.
    • typiquement NSColor. labelColor est une couleur employée par défaut pour les textes et qui va s'adapter automatiquement sans que tu aies à lever le petit doigt.

    AccentColor c'est différent. Depuis des lustres tu peux choisir la couleur d'accentuation dans macOS, bleue par défaut. Depuis BigSur tu as une nouvelle option: Multicolore qui applique une teinte bleue par défaut sauf pour les applications qui ont déclaré une AccentColor. Un exemple avec Sketch :

    Je ne pense pas qu'utiliser AccentColor partout est forcement ce que tu cherche à faire.

    Pour qu'on t'aide il va falloir nous montrer des trucs. Parce que normalement le dark mode c'est gratos, y'a rien à faire 😉

  • RocouRocou Membre
    août 2021 modifié #3

    OK, alors le terme AccentColor n'était peut-être pas judicieusement choisi.
    J'ai changé en MaCouleur :smile:
    Voici ce que j'ai fait:


    Comme on peut le voir, "Valeur 1" reste noir quelque soit le mode d'apparence.

  • Si tu choisi Label Color ça marche ? J'imagine que non vu la gueule du textfield en dessous, lui aussi est rendu en Aqua.

    Une des causes probables: l'option Appearance respective de chaque vue de la hiérarchie doit être configurée comme tel:

    En passant ton système en dark ça sera plus facile de repérer ce qui va pas dans Interface Builder. Dans cet exemple on comprend vite que le soucis se place entre la NSBox et son contenu:

    Un appui forcé sur une vue (trackpad obligatoire pour le coup) te montre la hiérarchie:

    Et comme de fait j'ai modifié l'Appearance de la content view de la NSBox. Tu dois avoir un truc du genre qui traîne parce que ton fond de fenêtre s'adapte correctement. Peut-être la content view de ta NSTabView...
    Oublie ta couleur custom aussi, utilise NSColor.labelColor c'est fait pour 😉

    PS: Sinon t'es sûr pour la fonte ? Les best practices préconisent de rester sur la fonte système et c'est généralement ce qu'attendent les utilisateurs.

  • @Pyroh a dit :
    Si tu choisi Label Color ça marche ? J'imagine que non vu la gueule du textfield en dessous, lui aussi est rendu en Aqua.

    En effet, ça ne fonctionne pas non plus.

    Une des causes probables: l'option Appearance respective de chaque vue de la hiérarchie doit être configurée comme tel:

    Qu'est-ce que tu appelles "chaque vue de la hiérarchie"? Je n'obtiens cette option que si je clique sur la fenêtre de mon application. Et c'est bien positionné sur "Inherited (System, Dark Aqua)"

    En passant ton système en dark ça sera plus facile de repérer ce qui va pas dans Interface Builder. Dans cet exemple on comprend vite que le soucis se place entre la NSBox et son contenu:

    Je n'ai pas de NSBox, j'ai placé mes éléments directement dans ma fenêtre.

    Un appui forcé sur une vue (trackpad obligatoire pour le coup) te montre la hiérarchie:

    Qu'est-ce que tu appelles un "appui forcé"? J'ai tout tenté avec mon trackpad mais je n'ai jamais réussi à obtenir ceci.

    Et comme de fait j'ai modifié l'Appearance de la content view de la NSBox. Tu dois avoir un truc du genre qui traîne parce que ton fond de fenêtre s'adapte correctement. Peut-être la content view de ta NSTabView...
    Oublie ta couleur custom aussi, utilise NSColor.labelColor c'est fait pour 😉

    Je n'ai pas de NSTabView.

    PS: Sinon t'es sûr pour la fonte ? Les best practices préconisent de rester sur la fonte système et c'est généralement ce qu'attendent les utilisateurs.

    J'ai essayé "Regular" mais cela ne change rien.

  • Appui forcé c'est quand tu appuie sur trackpad, que tu sens le click et que tu appuie plus fort jusqu'à ce que tu sente un second click. Comme pour Quick View dans le Finder. Faut pas traverser la table non plus si ça marche pas avec une pression ferme c'est peut-être désactivé.

    Il n'y a effectivement pas de NSTabView mais une NSBox j'ai confondu les icônes 😬.

    Le plus simple pour vérifier l'Appearance de tes vues c'est de passer directement par le Document Outline et de les faire une par une:

    Idéalement tu les fais toutes histoire d'être sûr. Et vérifie si tu change pas l'apparence dans le code directement mais tu t'en souviendrai je pense.

    Pour la fonte c'est très étrange que System Regular ne change pas la police du texte. Tu l'as bien changé sur la vue et pas la cell ?

  • Impeccable! Merci beaucoup.
    En fait, j'avais mis mes labels et textfields dans des NSBox, j'avais complètement oublié. Et effectivement l'apparence des box était réglée sur "Aqua".
    Ouf, je commence à piger, encore merci :smile:

  • Bonne nouvelle !

    @Rocou a dit :
    Impeccable! Merci beaucoup.

    Mais de rien !

    Par contre j'ai l'impression que tu utilise des NSBox pour grouper les éléments graphiques. On faisait ça dans le temps, maintenant on utilise des NSStackView. Xcode t'aide à le faire d'ailleurs :

  • Ha ok, effectivement je n'avais pas programmé depuis 2011...
    Je vais voir cela, je te remercie.

Connectez-vous ou Inscrivez-vous pour répondre.