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))
6 Réponses :
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) } }
Il est important de vérifier la valeur de retour de getRed(_:green:blue:alpha:)
. Cela peut échouer.
À partir de la version bêta 5, vous pouvez créer une couleur à partir d'un UIColor:
Color(UIColor.systemBlue)
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?
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
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.
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)
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) } }
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
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 */
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!
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 }
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.