36
votes

Comment convertir `UIColor` en` Color` de SwiftUI

Je souhaite utiliser un UIColor comme couleur de premier plan pour un objet mais je ne sais pas comment convertir UIColor en couleur

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


3 commentaires

Je sais que je peux utiliser les propriétés uniques mais j'ai pensé qu'il pourrait y avoir une méthode plus simple


Je comprends cela, mais Apple m'aurait peut-être déjà fourni une méthode, alors j'ai pensé qu'il serait légitime de demander. Je suis désolé si tu ne le penses pas


Depuis, j'ai découvert qu'il n'y avait pas de coercition intégrée, c'est pourquoi j'ai accepté la réponse pour aider les autres avec la même question.


6 Réponses :


8
votes

Utilisation de deux extensions d'assistance:

Pour extraire des composants d' UIColor :

Color(uiColor: .red)

Pour init avec 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))
    }
}

Usage:

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


1 commentaires

Il est important de vérifier la valeur de retour de getRed(_:green:blue:alpha:) . Cela peut échouer.



67
votes

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

Color(UIColor.systemBlue)


3 commentaires

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


À noter que vous pouvez simplement écrire: Color(.systemBlue)


Comment feriez-vous l'inverse, Color to UIColor?



1
votes

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

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

et en utilisant ceci:

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

Édité avec Xcode 11.0 beta 6 et le code peut changer


0 commentaires

0
votes

Je suis un très vieux amateur. Voici une façon qui fonctionne pour moi. Oui, j'utilise des globals pour les instructions réutilisables dans un fichier Constant.swift. Cet exemple est en ligne pour qu'il soit plus facile à voir. Je ne dis pas que c'est la voie à suivre, c'est juste mon ancienne manière.

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)


0 commentaires

16
votes

IOS et macOS

Color a pour cela un initialiseur natif qui prend un UIColor ou NSColor comme argument:

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

Color(UIColor.red) PAS Color(UIColor.red) explicitement !!! . Cela couplera votre code SwiftUI à l' UIKit . Au lieu de cela, appelez simplement Color(.red) qui déduit automatiquement le module correct.

Notez également cette différence:

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

suColor vs uiColor

Notez que:

Color.red et UIColor.red sont PAS les mêmes! Ils ont des valeurs différentes et sont différents les uns des autres. Alors ne présumez pas que cela ne vaut rien

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


Extension

Vous pouvez implémenter une variable personnalisée pour qu'elle ressemble davantage à cgColor et ciColor

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

donc ce serait comme:

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

2 commentaires

C'est honnêtement la meilleure réponse ici. Une extension sur UIColor pour renvoyer une suColor est géniale.


'Color.red' de SwiftUI est égal à 'Color (.systemRed)' ou 'UIColor.systemRed' de UIKit! Cela signifie que SwiftUI utilise implicitement systemRed par défaut pour son 'Color.red', c'est bon à savoir!



0
votes

Créez une extension comme celle-ci:

struct ContentView: View {
       var body: some View {
        Rectangle()
            .frame(width: 100, height: 100)
            .foregroundColor(.someColor)
    }
}

Usage:

extension Color {
    static let someColor = Color(UIColor.systemIndigo) // << Select any UIColor
}


0 commentaires