4
votes

Convertir SwiftUI Color en UIColor

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


4 commentaires

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 les Color.red statiques comme Color.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


3 Réponses :


5
votes

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


0 commentaires

9
votes

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


0 commentaires

0
votes

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


0 commentaires