来自字符串数组的随机 uicolor



我希望通过从预定的字符串数组(如(红色、绿色、粉红色)中调用随机颜色来选择更改我的 swift 应用程序的背景颜色。

所以我有那个数组,我希望背景颜色被随机选择为这些颜色之一。

使用 self.bg.background color 导致 xcode 说字符串无法转换为 uicolor

下面是执行此操作的一种方法示例:

import UIKit
extension Array {
  func randomElement() -> Element {
    return self[Int(arc4random_uniform(UInt32(self.count)))]
  }
}
extension UIColor {
  enum ColorEnum: String {
    case red   // = "red"
    case green // = "green"
    case blue  // = "blue"
    case pink  // = "pink"
    func toColor() -> UIColor {
      switch self {
      case .red:
        return .redColor()
      case .green:
        return .greenColor()
      case .blue:
        return .blueColor()
      case .pink:
        return UIColor(hue: 1.0, saturation: 0.25, brightness: 1.0, alpha: 1.0)
      }
    }
  }
  static func fromString(name: String) -> UIColor? {
    return ColorEnum(rawValue: name)?.toColor()
  }
}
let colors = ["red", "green", "pink"] // stored as String
UIColor.fromString(colors.randomElement())
let enumColors: [UIColor.ColorEnum] = [.red, .green, .pink] // stored as enum
enumColors.randomElement().toColor()

您不能直接将任何字符串(如"Green"Pink")转换为UIColor对象。如果只想使用此功能,则必须创建将这些字符串与等效的 UIColor 对象匹配的自定义枚举。

意思是,虽然您可以在我编写的UIColor扩展支持的以下表单中使用字符串颜色。

  1. RGBA 字符串(字符串必须用空格"0.5 0.6 0.7 1.0"分隔 红色的 50% 的绿色的 70% 的蓝色 Alpha 的 100
  2. %)
  3. 十六进制字符串,例如 #ffffff(相当于白色)等于 UIColor.white

要将这两种颜色字符串转换为 UIColor,您可以使用以下 UIColor 扩展

extension UIColor {

//Convert RGBA String to UIColor object
//"rgbaString" must be separated by space "0.5 0.6 0.7 1.0" 50% of Red 60% of Green 70% of Blue Alpha 100%
public convenience init?(rgbaString : String){
    self.init(ciColor: CIColor(string: rgbaString))
}
//Convert UIColor to RGBA String
func toRGBAString()-> String {
    var r: CGFloat = 0
    var g: CGFloat = 0
    var b: CGFloat = 0
    var a: CGFloat = 0
    self.getRed(&r, green: &g, blue: &b, alpha: &a)
    return "(r) (g) (b) (a)"
}
//return UIColor from Hexadecimal Color string
public convenience init?(hexString: String) {
        let r, g, b, a: CGFloat
        if hexString.hasPrefix("#") {
            let start = hexString.index(hexString.startIndex, offsetBy: 1)
            let hexColor = hexString.substring(from: start)
            if hexColor.characters.count == 8 {
                let scanner = Scanner(string: hexColor)
                var hexNumber: UInt64 = 0
                if scanner.scanHexInt64(&hexNumber) {
                    r = CGFloat((hexNumber & 0xff000000) >> 24) / 255
                    g = CGFloat((hexNumber & 0x00ff0000) >> 16) / 255
                    b = CGFloat((hexNumber & 0x0000ff00) >> 8) / 255
                    a = CGFloat(hexNumber & 0x000000ff) / 255
                    self.init(red: r, green: g, blue: b, alpha: a)
                    return
                }
            }
        }
        return nil
    }
// Convert UIColor to Hexadecimal String
func toHexString() -> String {
    var r: CGFloat = 0
    var g: CGFloat = 0
    var b: CGFloat = 0
    var a: CGFloat = 0
    self.getRed(&r, green: &g, blue: &b, alpha: &a)
    return String(
        format: "%02X%02X%02X",
        Int(r * 0xff),
        Int(g * 0xff),
        Int(b * 0xff)
    )
}

}

要获取数组中存在的任何随机值,您可以在数组上创建一个扩展,如下所示。

extension Array {
   func randomElement() -> Element {
        return self[Int(arc4random_uniform(UInt32(self.count)))]
   }
}

对于您的情况,您可以创建UIColor数组,如下所示

   //Define array to hold UIColor which will hold your Views background color  
    var arrOfColors = [UIColor]()
   //Create array of   RGBA String color like
    let arrRGBAStringColor = ["0.5 0.6 0.7 1.0","0.53 0.46 0.27 1.0","0.3 0.16 0.17 1.0"]
   //Create array of   Hexadecimal String color like
    let arrHexStringColor = ["#cccc41","#8e8e8e","#003300"]

    for stringColor in arrRGBAStringColor {
        //Use UIColor extension to convert RGBA string to UIColor
        if let color = UIColor(rgbaString : stringColor){
            arrOfColors.append(color)
        }
    }
    for stringColor in arrHexStringColor {
        //Use UIColor extension to convert Hexadecimal string to UIColor
        if let color = UIColor(hexString : stringColor){
            arrOfColors.append(color)
        }
    }
    //Now fetch any random color from your color array
    let randomColor = arrOfColors.randomElement()
    self.backgroundColor = randomColor

最新更新