我已经从我想用来创建UIColor的数据库中生成了用户ID(格式如"" XzSYoKJaqKYREkdB2dgwt0fLOPP2"")。
我找到了几个关于如何使用颜色十六进制代码来创建UIColor的solutions,但我不太清楚如何从类似于字符串的字符串生成颜色十六进制代码(#ffffff)以上。任何帮助将不胜感激,谢谢。
答案 0 :(得分:12)
用户ID太多,无法为每个可能的用户ID获取唯一的颜色。您最好的选择是找到一种方法将每个用户ID缩小到可能的可用颜色之一,并接受两个用户可能具有相同颜色的事实。
一种可能的解决方案是获取用户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
都不能保证相同。
答案 1 :(得分: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)
}
我希望来自https://classictutorials.com/2014/08/generate-a-random-color-in-swift/的Oscar De Moya的上述解决方案对你有帮助。