2016-01-25 40 views
0

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

所以我有那个数组,我想要随机选择背景颜色作为thoses颜色之一。

使用self.bg.background颜色导致在Xcode中说,一个字符串不能转换成的UIColor

+0

为什么不能有'UIColor'阵列创建的UIColor的阵列? – rmaddy

+0

'bg.backgroundColor = UIColor(hue:CGFloat(arc4random_uniform(361))/ 360,饱和度:1,亮度:1,alpha:1)' –

回答

1

下面是做到这一点的一种方式的示例:

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() 
+1

@LeoDabus对啊,忘了那个捷径!我会编辑它。 – ColGraff

+0

辉煌的谢谢:) –

+0

只是想知道什么应该被称为uicolor一旦这已成立?我使用self.view.backgroundcolor = enumColors,但这没有奏效。对不起,如果它是一个简单的问题,我对编码很陌生。 –

0

你不能直接将任何字符串像“绿色”“粉红色”转换为UIColor对象。如果你只想使用这个,那么你必须创建自定义的枚举,将这些字符串匹配到那里等价的UIColor对象。

这意味着您可以在由我写的UIColor扩展支持的下列表单中使用字符串颜色。

  1. RGBA字符串(字符串必须由空间 “0.5 0.6 0.7 1.0” 的绿色70%红60%50%被分离,蓝,α100%)
  2. 十六进制字符串为例如#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) 
    ) 
} 

}

取得任何随机您可以在Array上创建一个扩展,如下所示。

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

对于你的情况,你可以按照如下

//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