我使用了几个colorWell示例,虽然我在获取selectedColor时没有遇到任何问题,但除了编写自己的转换之外,我还没有找到任何指示如何获取RGB十六进制表示的内容。因为colorWell实际上显示了这些信息,所以它必须是可用的。有人有关于在哪里可以访问这个属性的任何信息吗?
xpszyzbs1#
这是在进行了一些搜索和测试之后的一种变通方法。创建UIColor的扩展类
import UIKit extension UIColor { // MARK: - Initialization convenience init?(hex: String) { var hexSanitized = hex.trimmingCharacters(in: .whitespacesAndNewlines) hexSanitized = hexSanitized.replacingOccurrences(of: "#", with: "") var rgb: UInt64 = 0 var r: CGFloat = 0.0 var g: CGFloat = 0.0 var b: CGFloat = 0.0 var a: CGFloat = 1.0 let length = hexSanitized.count guard Scanner(string: hexSanitized).scanHexInt64(&rgb) else { return nil } if length == 6 { r = CGFloat((rgb & 0xFF0000) >> 16) / 255.0 g = CGFloat((rgb & 0x00FF00) >> 8) / 255.0 b = CGFloat(rgb & 0x0000FF) / 255.0 } else if length == 8 { r = CGFloat((rgb & 0xFF000000) >> 24) / 255.0 g = CGFloat((rgb & 0x00FF0000) >> 16) / 255.0 b = CGFloat((rgb & 0x0000FF00) >> 8) / 255.0 a = CGFloat(rgb & 0x000000FF) / 255.0 } else { return nil } self.init(red: r, green: g, blue: b, alpha: a) } // MARK: - Computed Properties var toHex: String? { return toHex() } // MARK: - From UIColor to String func toHex(alpha: Bool = false) -> String? { guard let components = cgColor.components, components.count >= 3 else { return nil } let r = Float(components[0]) let g = Float(components[1]) let b = Float(components[2]) var a = Float(1.0) if components.count >= 4 { a = Float(components[3]) } if alpha { return String(format: "%02lX%02lX%02lX%02lX", lroundf(r * 255), lroundf(g * 255), lroundf(b * 255), lroundf(a * 255)) } else { return String(format: "%02lX%02lX%02lX", lroundf(r * 255), lroundf(g * 255), lroundf(b * 255)) } } }
创建UIColorWell:我在故事板中把它拖到了我的ViewController类中。
import UIKit class ViewController: UIViewController { @IBOutlet weak var colorWell: UIColorWell! @IBOutlet weak var geofence: UIView! override func viewDidLoad() { super.viewDidLoad() setupColorWell() geofence.layer.cornerRadius = geofence.frame.size.height / 2 } private func setupColorWell() { colorWell.title = "Pick Your Color" colorWell.addTarget(self, action: #selector(colorChanged), for: .valueChanged) } @objc private func colorChanged() { geofence.backgroundColor = colorWell.selectedColor guard let hexValue = colorWell.selectedColor?.toHex else { return } print(hexValue) } }
在上面的代码中(在colorChanged函数中),您可以看到我是如何从颜色池中返回的selectedColor创建一个hexValue的。选定的颜色是UIColor类型,因此我们可以将其展开并使用在扩展类中创建的.toHex函数。我打印出hexValue只是为了验证它实际上是否为我们提供了正确的十六进制值。注意:我的项目我使用了一个叫做“geofence”的视图,你可以忽略它,并将selectedColor设置为你所需要的任何颜色。我将发布我的故事板的图像来进一步澄清。
你可以在这里找到我的代码:GITHUB
1条答案
按热度按时间xpszyzbs1#
这是在进行了一些搜索和测试之后的一种变通方法。
创建UIColor的扩展类
创建UIColorWell:我在故事板中把它拖到了我的ViewController类中。
在上面的代码中(在colorChanged函数中),您可以看到我是如何从颜色池中返回的selectedColor创建一个hexValue的。选定的颜色是UIColor类型,因此我们可以将其展开并使用在扩展类中创建的.toHex函数。我打印出hexValue只是为了验证它实际上是否为我们提供了正确的十六进制值。
注意:我的项目我使用了一个叫做“geofence”的视图,你可以忽略它,并将selectedColor设置为你所需要的任何颜色。我将发布我的故事板的图像来进一步澄清。
你可以在这里找到我的代码:GITHUB