2017-04-01 197 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。 –

相关问题