Je souhaite convertir la couleur de vue SwiftUI en composant UIKit UIcolor. J'ai essayé plusieurs façons et je me réfère également au StackOverflow déjà donné des réponses, mais cela n'a pas fonctionné. Il a également été mentionné par certains utilisateurs dans ces messages. J'ai parcouru le code ci-dessous qui est proposé par turingtested
mais ça ne fonctionne pas. Toute suggestion ou aide est vraiment appréciée.
fileprivate extension Color { func uiColor() -> UIColor { let components = self.components() return UIColor(red: components.r, green: components.g, blue: components.b, alpha: components.a) } private func components() -> (r: CGFloat, g: CGFloat, b: CGFloat, a: CGFloat) { let scanner = Scanner(string: self.description.trimmingCharacters(in: CharacterSet.alphanumerics.inverted)) var hexNumber: UInt64 = 0 var r: CGFloat = 0.0, g: CGFloat = 0.0, b: CGFloat = 0.0, a: CGFloat = 0.0 let result = scanner.scanHexInt64(&hexNumber) if result { r = CGFloat((hexNumber & 0xff000000) >> 24) / 255 g = CGFloat((hexNumber & 0x00ff0000) >> 16) / 255 b = CGFloat((hexNumber & 0x0000ff00) >> 8) / 255 a = CGFloat(hexNumber & 0x000000ff) / 255 } return (r, g, b, a) } }
3 Réponses :
Fondamentalement, Apple n'a pas l'intention de vous faire effectuer cette conversion. La Color
de SwiftUI est une View
, et la conception du cadre est que les données circulent vers une View
, qui est ensuite affichée. Vous n'êtes jamais censé extraire des données d'une View
.
Si vous avez besoin d'utiliser les composants d'une couleur, vous devez travailler avec UIColor
, puis convertir en Color
au moment où vous êtes prêt à l'afficher.
Si vous essayez d'obtenir les composants des couleurs système comme Color.red
, je pense qu'ils sont les mêmes que le UIColor.systemRed
adaptatif, qui a des composants accessibles.
Documentation sur les couleurs standard
Si vous recherchez une réponse à jour:
À partir d'iOS 14, la classe UIColor
a un initialiseur, qui prend une couleur SwiftUI comme argument: UIColor(Color.red)
.
Mettez à jour votre réponse pour vous débarrasser de l'avertissement de long tuple et cela fonctionne bien.
extension Color { func uiColor() -> UIColor { if #available(iOS 14.0, *) { return UIColor(self) } let scanner = Scanner(string: description.trimmingCharacters(in: CharacterSet.alphanumerics.inverted)) var hexNumber: UInt64 = 0 var r: CGFloat = 0.0, g: CGFloat = 0.0, b: CGFloat = 0.0, a: CGFloat = 0.0 let result = scanner.scanHexInt64(&hexNumber) if result { r = CGFloat((hexNumber & 0xFF000000) >> 24) / 255 g = CGFloat((hexNumber & 0x00FF0000) >> 16) / 255 b = CGFloat((hexNumber & 0x0000FF00) >> 8) / 255 a = CGFloat(hexNumber & 0x000000FF) / 255 } return UIColor(red: r, green: g, blue: b, alpha: a) } }
Que signifie exactement «cela ne fonctionne pas»? Ne compile-t-il pas? Est-ce que ça plante? Cela donne-t-il de mauvais résultats?
Cela fonctionne pour les
Colors
vous déclarez comme ceci:Color(red: 0.74, green: 0.5, blue: 0.32)
, mais pas pour lesColor.red
statiques commeColor.red
Cette "solution" ne doit jamais être utilisée, elle tente de dériver les composantes de couleur de la
description
de l'objet ... elle peut casser à tout moment.Je pense que self.description imprime "rouge" pour un Color.red