Swift:将字符串转换为十六进制颜色代码

5
我已经从数据库生成了用户ID(格式类似于“XzSYoKJaqKYREkdB2dgwt0fLOPP2”),想要使用它来创建UIColor。
我发现有几个解决方案可以使用颜色十六进制代码创建UIColor,但是我不知道如何从上述字符串生成颜色十六进制代码(#ffffff)。任何帮助将不胜感激,谢谢。

所有用户ID都非常不同吗? - kennytm
你想为每个生成的用户ID字符串设置随机颜色吗? - Danyl
所有的ID都具有与上述(Firebase用户.uid)相同的格式。我想从这些字符串中创建一个唯一的颜色(如果可能的话)。 - José
在该格式中,可能的唯一用户ID数量比可能的颜色组合更多。一个由28个字符组成的用户ID,其中每个字符可以是42个字符之一(至少),意味着有42^28(大约2.8E45)个用户ID。但是颜色是RGB格式,其中每个通道都有256个值,总共有256^3(大约1.6E7)种颜色组合。 - rmaddy
@maddy,我认为主要问题不在于唯一性。OP只是想为每个用户创建一个常量颜色。 - Okan Kocyigit
2个回答

15

由于用户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不能保证在每次应用运行时都相同,因此您需要将此颜色存储在用户的个人资料中。


哇,超级棒的函数! :) - Alex Cio
你为什么要使用上世纪90年代的8位色彩? - user652038

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。 - Okan Kocyigit
谢谢,如果我无法从userId生成UIColor,那么这将是我要使用的解决方案。不过,如果我能够以某种方式使用userId创建UIColor,那就真的很理想了。 - José

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接