Как получить компоненты RGB из Color SwiftUI - PullRequest
2 голосов
/ 13 июня 2019

Если у меня есть SwiftUI Color:

let col: Color = Color(red: 0.5, green: 0.5, blue: 0.5)

Как получить компоненты RGB из col?
Примерно так:

print(col.components.red)

В UIKit я мог бы использовать UIColor.getRed, но в SwiftUI нет аналога.

1 Ответ

1 голос
/ 13 июня 2019

Ответ: нет - API пока нет, но ...

Большинство структур SwiftUI имеют поля private, как в Color.

Вы можете использовать Mirror для извлечения такой информации, но имейте в виду, что она неэффективна.

Вот как извлечь шестнадцатеричное представление SwiftUI Color - для образовательных целей.

Скопируйте и вставьте это на Xcode 11 игровую площадку.

import UIKit
import SwiftUI

let systemColor = Color.red
let color = Color(red: 0.3, green: 0.5, blue: 1)

extension Color {

    var hexRepresentation: String? {
        let children = Mirror(reflecting: color).children
        let _provider = children.filter { $0.label == "provider" }.first
        guard let provider = _provider?.value else {
            return nil
        }
        let providerChildren = Mirror(reflecting: provider).children
        let _base = providerChildren.filter { $0.label == "base" }.first
        guard let base = _base?.value else {
            return nil
        }
        var baseValue: String = ""
        dump(base, to: &baseValue)
        guard let firstLine = baseValue.split(separator: "\n").first,
              let hexString = firstLine.split(separator: " ")[1] as Substring? else {
            return nil
        }
        return hexString.trimmingCharacters(in: .newlines)
    }

}

systemColor.hexRepresentation
color.hexRepresentation

Цвета, такие как .red, .white и т. Д., Похоже, несодержат много информации, когда dumped.

Просто их "системное" имя.

▿ red
  ▿ provider: SwiftUI.(unknown context at $1297483bc).ColorBox<SwiftUI.SystemColorType> #0
    - super: SwiftUI.(unknown context at $129748300).AnyColorBox
    - base: SwiftUI.SystemColorType.red

A Color, экземпляру которого присвоено red / blue / greenкомпоненты делают вместо этого.

▿ #4C80FFFF
  ▿ provider: SwiftUI.(unknown context at $11cd2e3bc).ColorBox<SwiftUI.Color._Resolved> #0
    - super: SwiftUI.(unknown context at $11cd2e300).AnyColorBox
    ▿ base: #4C80FFFF
      - linearRed: 0.073238954
      - linearGreen: 0.21404114
      - linearBlue: 1.0
      - opacity: 1.0

На игровой площадке вы увидите:

  • systemColor.hexRepresentation возвращение nil
  • color.hexRepresentation возвращение "#4C80FFFF"
...