2016-01-25 71 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