2017-04-01 246 views
2

我從用於創建UIColor的數據庫生成用戶ID(格式類似「」XzSYoKJaqKYREkdB2dgwt0fLOPP2「」))。Swift:將字符串轉換爲十六進制顏色代碼

我發現了幾個solutions關於如何創建一個顏色十六進制代碼的UIColor,但我不知道如何從上面的字符串生成一個顏色十六進制代碼(#ffffff)。任何幫助將不勝感激,謝謝。

+0

所有用戶ID是否彼此有很大不同? – kennytm

+0

你想爲每個生成的用戶ID字符串隨機顏色? – Danyl

+0

所有的ID都具有上面的格式(firebase user.uid)。我想從這些字符串中創建一個獨特的顏色(如果可能的話)。 –

回答

10

有太多的用戶標識符爲每個可能的用戶標識獲取唯一的顏色。您最好的選擇是找到一種方法,將每個用戶標識縮小爲可能的顏色之一,並接受兩個用戶可能具有相同顏色的事實。

一個可能的解決方案是獲取用戶ID字符串的hashValue,然後將該Int降至可能的16,777,216種顏色之一。

let userId = "XzSYoKJaqKYREkdB2dgwt0fLOPP2" // or whatever the id is 
let hash = abs(userId.hashValue) 
let colorNum = hash % (256*256*256) 

此時colorNum是範圍0 - 0xFFFFFF

您現在可以從colorNum創建顏色。

let red = colorNum >> 16 
let green = (colorNum & 0x00FF00) >> 8 
let blue = (colorNum & 0x0000FF) 
let userColor = UIColor(red: CGFloat(red)/255.0, green: CGFloat(green)/255.0, blue: CGFloat(blue)/255.0, alpha: 1.0) 

你將要這種顏色存儲在用戶的個人資料,因爲hashValue不能保證每次都相同的應用程序運行。

+3

@vacawama當然,謝謝。固定。 – rmaddy

0

就我的理解而言,您試圖每次爲每個用戶生成隨機顏色並將其存儲在Firebase中?如我錯了請糾正我。

我希望這個解決方案能夠解決您每次創建隨機顏色的問題。總之,無論何時何地需要隨機唯一的顏色 - 調用該方法並檢查返回的UIColor是否已存在於數據庫中。如果它不存在然後使用它!

func getRandomColor() -> UIColor { 
let randomRed:CGFloat = CGFloat(arc4random())/CGFloat(UInt32.max) 
let randomGreen:CGFloat = CGFloat(arc4random())/CGFloat(UInt32.max) 
let randomBlue:CGFloat = CGFloat(arc4random())/CGFloat(UInt32.max) 
return UIColor(red: randomRed, green: randomGreen, blue: randomBlue, alpha: 1.0) 
} 

我希望從Oscar De Moya的https://classictutorials.com/2014/08/generate-a-random-color-in-swift/的上述解決方案將幫助你。

+1

OP想要生成一個獨特且恆定的顏色,所以它必須基於uuid而不是arc4random生成。 – ocanal

+0

謝謝,如果我無法從userId生成UIColor,這將是我將使用的解決方案。這將是最佳的,但如果我可以使用userId以某種方式創建UIColor。 –

相關問題