92 votes

Comment convertir UIColor en couleur SwiftUI ?

Je veux utiliser une UIColor comme couleur d'avant-plan pour un objet mais je ne sais pas comment convertir une UIColor en une couleur.

var myColor: UIColor
RoundedRectangle(cornerRadius: 5).foregroundColor(UIColor(myColor))

0 votes

Je sais que je peux utiliser les propriétés individuelles mais je pensais qu'il y avait une méthode plus simple.

2 votes

J'ai compris, mais Apple a peut-être déjà fourni une méthode, alors j'ai pensé qu'il était légitime de demander. Je suis désolé si vous ne le pensez pas.

1 votes

J'ai découvert depuis qu'il n'y a pas de coercition intégrée, c'est pourquoi j'ai accepté la réponse pour aider d'autres personnes qui se posent la même question.

159voto

kontiki Points 633

À partir de la version bêta 5, vous pouvez créer une couleur à partir d'une UIColor :

Color(UIColor.systemBlue)

4 votes

Je peux confirmer que cela fonctionne et que si le UIColor est une couleur dynamique personnalisée, le Color est également dynamique.

5 votes

Il convient de noter que vous pouvez simplement écrire : Color(.systemBlue)

1 votes

Comment faire dans l'autre sens, de Color à UIColor ?

52voto

Mojtaba Hosseini Points 2525

IOS et macOS

Color possède un initialisateur natif qui prend un fichier UIColor o NSColor comme argument :

Color(.red) /* or any other UIColor/NSColor you need INSIDE parentheses */

<strong>NE PAS </strong>appelez <code>Color(UIColor.red)</code> explicitement <strong>! !! </strong>. Cela permettra de coupler votre code SwiftUI à l'interface de l'utilisateur. <code>UIKit</code> . Au lieu de cela, il suffit d'appeler <code>Color(.red)</code> Cela permettra de déduire automatiquement le module correct.

Aussi, notez cette différence :

Color.red     /* this `red` is SwiftUI native `red` */
Color(.red)   /* this `red` is UIKit `red` */

suColor vs uiColor

Notez que :

Color.red y UIColor.red son PAS même ! Ils ont valeurs différentes y avoir l'air différent les uns avec les autres. Donc ne supposez pas cela ne vaut rien

Ceux-ci sont égaux à la place : <code>SwiftUI.Color.Red == UIKit.UIColor.systemRed</code>

Vous pouvez également consulter <strong><a href="https://stackoverflow.com/a/62994482/5623035">Comment obtenir des composants RVB à partir de SwiftUI.Color ?</a></strong>


Extension

Vous pouvez implémenter une variable personnalisée pour qu'elle ressemble davantage à l'un des éléments suivants cgColor y ciColor

extension UIColor {
    /// The SwiftUI color associated with the receiver.
    var suColor: Color { Color(self) }
}

donc ce serait comme :

UIColor.red         // UIKit color
UIColor.red.suColor // SwiftUI color
UIColor.red.cgColor // Core graphic color
UIColor.red.ciColor // Core image color

Note : Cliquez sur ici pour voir comment convertir SwiftUI.Color a UIColor

9voto

Utilisation de deux extensions d'aide :

Pour extraire des composants de UIColor :

extension UIColor {
    var rgba: (red: CGFloat, green: CGFloat, blue: CGFloat, alpha: CGFloat) {
        var red: CGFloat = 0
        var green: CGFloat = 0
        var blue: CGFloat = 0
        var alpha: CGFloat = 0
        getRed(&red, green: &green, blue: &blue, alpha: &alpha)

        return (red, green, blue, alpha)
    }
}

A init con UIColor :

extension Color {
    init(uiColor: UIColor) {
        self.init(red: Double(uiColor.rgba.red),
                  green: Double(uiColor.rgba.green),
                  blue: Double(uiColor.rgba.blue),
                  opacity: Double(uiColor.rgba.alpha))
    }
}

Utilisation :

Color(uiColor: .red)

3voto

Joannes Points 242

En Swift UI couleurs personnalisées avec une extension pratique :

extension UIColor {
struct purple {
    static let normal = UIColor(red:0.043, green:0.576 ,blue:0.588 , alpha:1.00)
    static let light = UIColor(red: 1, green: 1, blue: 1, alpha: 1)
    static let dark = UIColor(red: 1, green: 1, blue: 1, alpha: 1)
}
struct gray {
    static let normal = UIColor(red:0.5, green:0.5 ,blue:0.5 , alpha:1.00)
    static let dark = UIColor(red: 1, green: 1, blue: 1, alpha: 1)
}
}

et en utilisant ceci :

var body: some View {
    Text("Hello World")
    .foregroundColor(Color(UIColor.purple.normal))
    .background(Color(UIColor.gray.normal))
}

Edité avec Xcode 11.0 beta 6 et le code peut changer

1voto

AB Murphy Points 11

Je suis un très ancien hobbyiste. Voici une méthode qui fonctionne pour moi. Oui, j'utilise les globaux pour les instructions réutilisables dans un fichier Constant.swift. Cet exemple est en ligne pour que ce soit plus facile à voir. Je ne dis pas que c'est la voie à suivre, c'est juste mon à l'ancienne.

Capture d'écran (27k)

   import SwiftUI

    // named color from the developer's pallet
    let aluminumColor = Color(UIColor.lightGray)

    // a custom color I use often
    let butterColor = Color.init(red: 0.9993399978, 
                               green: 0.9350042167, 
                               blue: 0.5304131241)

    // how I use this in a SwiftUI VStack:

    Text("Fur People")
           .font(.title)
           .foregroundColor(aluminumColor)
           .shadow(color: butterColor, radius: 4, x: 2, y: 2)
           .minimumScaleFactor(0.75)

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