Используйте шестнадцатеричный цвет в SwiftUI - PullRequest
2 голосов
/ 03 июля 2019

в UIKit мы могли бы использовать Расширение, чтобы установить шестнадцатеричный цвет практически для всего. https://www.hackingwithswift.com/example-code/uicolor/how-to-convert-a-hex-color-to-a-uicolor

но когда я пытаюсь сделать это на SwiftUI, это невозможно, похоже, что SwiftUI не получает UIColor в качестве параметра.

    Text(text)
        .color(UIColor.init(hex: "FFF"))

сообщение об ошибке:

Cannot convert value of type 'UIColor' to expected argument type 'Color?'

Я даже пытался сделать расширение для Color вместо UIColor, но мне не повезло

мое расширение для цвета:

импорт SwiftUI

extension Color {
    init(hex: String) {
        let scanner = Scanner(string: hex)
        scanner.scanLocation = 0
        var rgbValue: UInt64 = 0
        scanner.scanHexInt64(&rgbValue)

        let r = (rgbValue & 0xff0000) >> 16
        let g = (rgbValue & 0xff00) >> 8
        let b = rgbValue & 0xff

        self.init(
            red: CGFloat(r) / 0xff,
            green: CGFloat(g) / 0xff,
            blue: CGFloat(b) / 0xff, alpha: 1
        )
    }
}

сообщение об ошибке:

Incorrect argument labels in call (have 'red:green:blue:alpha:', expected '_:red:green:blue:opacity:')

Ответы [ 2 ]

1 голос
/ 05 июля 2019

Другая альтернатива ниже, которая использует Int для гексагона, но, конечно, его можно изменить на String, если вы предпочитаете это.

extension Color {
    init(hex: Int, alpha: Double = 1) {
        let components = (
            R: Double((hex >> 16) & 0xff) / 255,
            G: Double((hex >> 08) & 0xff) / 255,
            B: Double((hex >> 00) & 0xff) / 255
        )
        self.init(
            .sRGB,
            red: components.R,
            green: components.G,
            blue: components.B,
            opacity: alpha
        )
    }
}

Примеры использования:

Color(hex: 0x000000)
Color(hex: 0x000000, alpha: 0.2)
1 голос
/ 03 июля 2019

Вы почти на месте, вы использовали неверный параметр инициализатора:

extension Color {
    init(hex: String) {
        let scanner = Scanner(string: hex)
        scanner.scanLocation = 0
        var rgbValue: UInt64 = 0
        scanner.scanHexInt64(&rgbValue)

        let r = (rgbValue & 0xff0000) >> 16
        let g = (rgbValue & 0xff00) >> 8
        let b = rgbValue & 0xff


        self.init(red: Double(r) / 0xff, green: Double(g) / 0xff, blue: Double(b) / 0xff)

    }
}
...