2017-02-20 56 views
2

我,每次我創建一個新的行表視圖,不同的顏色是隨機產生改變它`背景。使用此功能:如何將隨機UIColor與swift中的顏色數組中的顏色進行比較?

func getRandomColor() -> UIColor{ 
    let red:CGFloat = CGFloat(drand48()) 
    let green:CGFloat = CGFloat(drand48()) 
    let blue:CGFloat = CGFloat(drand48()) 

    return UIColor(red:red, green: green, blue: blue, alpha: 1.0) 
} 

我將顏色存儲在一個數組中,這樣做我想避免在我的表視圖中的等於顏色。 在表視圖cellForRow在創建表時視圖的陣列被填充,這樣的:

colors.append(category.color as! UIColor) 

類別是我的對象。

問題是,當我關閉應用程序,並再次啓動它。內存連續並開始隨機創建相同的顏色。所以我試圖比較顏色,以保持生成顏色,直到它是一種新顏色。使用此功能:

func validateColor(color: UIColor) -> Bool { 

    let primeiraCor = colors.first! as UIColor 

    if primeiraCor == color { 
     return false 
    } else { 
     return true 
    } 
} 

顏色是我的顏色的排列和色彩我想比較出彩。但每次調用該函數時都會返回true。

我該怎麼辦?

+0

你總是用你的顏色數組的第一個元素進行比較 - 你需要遍歷所有的顏色,看看你是否有一個重複。 –

+0

所以ü有一個[顏色]與10種的UIColor元素和當u創建一個隨機的顏色,u需要檢查,如果隨機生成的顏色陣列具有相同的元素,原始顏色陣列,如果其具有相同的元件u需要省略該陣列元素,並創建一個新的元素 – Koushik

回答

1

首先,您總能獲得每個運行相同的顏色,因爲drand48(),除非你播種它生成相同的數字序列。參見如何做到這一點this answer,但這裏是代碼,使用當前時間隨機化的種子:

let time = UInt32(NSDate().timeIntervalSinceReferenceDate) 
srand48(Int(time)) 
let number = drand48() 

其次 - 您比較完全隨機的顏色(有效0和近1700萬之間的數字)和想知道爲什麼它看起來不符合你的顏色數組中的第一個顏色?我想你應該會感到驚訝,如果它曾經:-)

+0

即使知道某一天一種顏色可以重複,這個固定我的問題。謝謝。包含 –

2

匹配是可以做到的簡單:

func validateColor(color: UIColor) -> Bool { 
    return !colors.contains(color) 
} 

,或者如果你想添加平等某個閾值,那麼你可以做這樣的事情: 擴展從Extract RGB Values From UIColor

extension UIColor { 
    var components: (red: CGFloat, green: CGFloat, blue: CGFloat, alpha: CGFloat)? { 
     var r: CGFloat = 0, g: CGFloat = 0, b: CGFloat = 0, a: CGFloat = 0 
     return getRed(&r, green: &g, blue: &b, alpha: &a) ? (r,g,b,a) : nil 
    } 
} 


func validateColor(color: UIColor) -> Bool { 
    let maxDistance: CGFloat = 0.3 
    guard let colorComponents = color.components else { 
     return true 
    } 
    return !colors.contains { c in 
     guard let components = c.components else { 
      return false 
     } 

     let distance = abs(colorComponents.red - components.red) + abs(colorComponents.green - components.green) + abs(colorComponents.blue - components.blue) 

     return distance < maxDistance 
    } 
} 

採取設置在maxDistance的閾值變量或將其移動到您的類的靜態成員更好的可讀性。

+0

沒有工作。我已經嘗試過了。但是,謝謝,當我有時間的時候我會用另一種方式來測試。謝謝。 –