98 votes

Comment pouvons-nous utiliser les jeux de couleurs du catalogue Assets ?

J'utilise habituellement des UIColors personnalisés sur iOS en utilisant des extensions avec Swift, mais maintenant avec iOS 11/ Xcode 9 nous pouvons créer des Colors Sets. Comment pouvons-nous les utiliser ?

Mise à jour - Conseil

Comme @Cœur le dit, nous pouvons glisser et déposer la couleur, et l'utiliser comme un objet UIColor. Une solution possible serait de l'utiliser comme une extension :

UIColor as an extension

Ou comme une constante :

UIColor as a constant

Maintenant, je veux savoir si nous pouvons y accéder comme un UIImage accède à une image d'actif ou non, comme :

UIImage(named: "image-name") -> UIColor(named: "color-name")

117voto

user2421361 Points 531
UIColor(named: "myColor") 

Source : Session 237 de la WWDC 2017 -- Nouveautés de MapKit


Mise en garde : Le projet de votre Cible de déploiement doit être réglé sur iOS 11.0.

8 votes

Cela nécessitera une cible de déploiement = 11.0.

48voto

Cœur Points 1538

(réponse courte à la mise à jour de la question : il y a UIColor(named: "MyColor") dans Xcode 9.0)

Répondre à la question initiale :

  1. vous créez votre jeu de couleurs

enter image description here

  1. vous trouvez votre couleur parmi vos snippets et vous la faites glisser-déposer

enter image description here

  1. cela se traduira par une couleur littérale lorsque vous regarderez le code source :

    #colorLiteral(red: 0, green: 0.6378085017, blue: 0.8846047521, alpha: 1)

Tu as remarqué que les valeurs du rouge, du vert et du bleu sont différentes ? C'est parce que je les ai définies en utilisant l'espace couleur. Display P3 mais le colorLiteral utilise l'espace colorimétrique sRGB .

1 votes

@elGeekalpha c'est une mauvaise pratique d'éditer la question en une question différente ; cf. meta.stackoverflow.com/questions/350309/ ou meta.stackexchange.com/questions/43478/

1 votes

Je n'ai pas changé la question, j'ai juste mieux spécifié l'implémentation que je souhaite : Comment puis-je les utiliser, mais comme nous utilisons habituellement les images Assets car drag&drop n'est qu'une solution alternative. Désolé pour le dérangement.

4 votes

Xcode n'a pas ajouté UIColor(named:) Il fait partie de UIKit, qui est intégré à iOS depuis iOS 11. Cela peut sembler être un point subtil mais il est important. Xcode ne peut pas ajouter de méthodes à UIKit.

31voto

robmathers Points 889

Version courte

Ajoutez un jeu de couleurs à un catalogue d'actifs, nommez-le et définissez votre couleur dans l'inspecteur d'attributs, puis appelez-le dans votre code avec UIColor(named: "MyColor") .

Instructions complètes

  1. Dans le visualiseur du catalogue d'actifs, cliquez sur le bouton plus en bas à droite du panneau principal et choisissez Nouveau jeu de couleurs

    New Color Set menu

  2. Cliquez sur le carré blanc, et sélectionnez l'option Inspecteur des attributs (icône la plus à droite dans le volet de droite)

  3. À partir de là, vous pouvez nommer et choisir votre couleur.

    enter image description here

  4. Pour l'utiliser dans votre code, appelez-le avec UIColor(named: "MyColor") . Cette fonction renvoie une option, vous devrez donc la déballer dans la plupart des cas (c'est probablement l'un des rares cas où un déballage forcé est acceptable, étant donné que vous savez que la couleur existe dans votre catalogue de ressources).

4 votes

Cela nécessitera une cible de déploiement = 11.0.

9 votes

Comment puis-je le faire dans iOS <= 10

7 votes

Bonne réponse. J'aimerais qu'iOS fasse de ces actifs quelque chose que l'on puisse compiler de la même manière qu'Android le fait avec R.color.myColor. La nouvelle approche Colors.xcassets est définitivement meilleure, mais elle laisse toujours la porte ouverte aux erreurs d'exécution si vous vous trompez dans le nom d'une couleur, si vous supprimez une couleur sans trouver tous les endroits où elle a été utilisée, etc. Il me semble que c'est quelque chose qui devrait être attrapé au moment de la compilation plutôt que de causer un crash au moment de l'exécution (je comprends que vous pouvez le traiter comme optionnel et ne pas le forcer à se déballer, mais alors cela ajoute plus de complexité... alors quel était le but ? !) :)

31voto

Hitesh Agarwal Points 856

Vous devez utiliser UIColor(named: "appBlue") .

Et vous pouvez créer une fonction dans l'extension UIColor pour un accès simple.

enum AssetsColor {
   case yellow
   case black
   case blue
   case gray
   case green
   case lightGray
   case separatorColor
   case red
}

extension UIColor {

    static func appColor(_ name: AssetsColor) -> UIColor? {
        switch name {
        case .yellow:
            return UIColor(named: "appYellow")
        case .black:
            return UIColor(named: "appBlack")
        case .blue:
            return UIColor(named: "appBlue")
        case .gray:
            return UIColor(named: "appGray")
        case .lightGray:
            return UIColor(named: "appLightGray")
        case .red:
            return UIColor(named: "appRed")
        case .separatorColor:
            return UIColor(named: "appSeparatorColor")
        case .green:
            return UIColor(named: "appGreen") 
        }
    }
}

Vous pouvez l'utiliser comme ceci :

userNameTextField.textColor = UIColor.appColor(.gray)

1 votes

Les SDK minimums sont : iOS 11.0+, Mac Catalyst 13.0+, tvOS 11.0+, watchOS 4.0.

3 votes

Vous pourriez ajouter une valeur brute pour enum AssetsColor: String et fournir des noms sous forme de valeurs brutes (par exemple case yellow = "appYellow" ), vous n'aurez donc pas besoin d'un switch mais juste UIColor(named: name.rawValue)

9voto

Ashish Points 634
 // iOS
 let color = UIColor(named: "SillyBlue")

 // macOS
 let color = NSColor(named: "SillyBlue")

5 votes

Cette URL n'a rien à voir avec les couleurs du catalogue d'actifs, ou les couleurs, ou iOS.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X