/**
An extension to `UIColor` that provides convenience methods for working with Android packed ColorInt values.
*/
extension UIColor {
/**
Initializes a `UIColor` instance with the specified Android packed ColorInt value.
- Parameter colorInt: The Android packed ColorInt value.
- Returns: A new `UIColor` instance.
- Note: The `colorInt` value should be a 32-bit integer representing a color in ARGB format.
*/
convenience init(colorInt: Int32) {
let alpha = (colorInt >> 24) & 0xFF
let red = (colorInt >> 16) & 0xFF
let green = (colorInt >> 8) & 0xFF
let blue = colorInt & 0xFF
self.init(red: CGFloat(red) / 255.0,
green: CGFloat(green) / 255.0,
blue: CGFloat(blue) / 255.0,
alpha: CGFloat(alpha) / 255.0)
}
/**
Retrieves the Android packed ColorInt value of the `UIColor` instance.
- Returns: The Android packed ColorInt value.
- Note: The returned value is a 32-bit integer representing the color in ARGB format.
*/
var colorInt: Int32 {
let components = cgColor.components ?? [0, 0, 0, 0]
let red = components[0] * 255
let green = components[1] * 255
let blue = components[2] * 255
let alpha = components[3] * 255
return Int32(alpha) << 24 | Int32(red) << 16 | Int32(green) << 8 | Int32(blue)
}
}
3条答案
按热度按时间pxq42qpu1#
您引用的整数似乎是压缩整数。参见:android color documentation。你需要找到一种方法将打包的int转换为十六进制,然后你可以使用这个宏(获得here),它将十六进制数转换为UIColor:
我知道这并没有真正回答你的问题,但它可能会帮助你缩小搜索范围。
编辑
好吧,我刚刚意识到上面的宏确实解决了你的问题。只要给予它整数表示,它就会给你正确的UIColor。我的测试代码如下:
我得到了here的帮助
编辑
修复宏以期望正确的RGBA值:
之前的宏预期RGBA,而Android颜色int提供ARGB。
6tqwzwtp2#
Swift版本,如果它能帮助任何人:
5f0d552i3#
您可以在Swift中为UIColor创建一个扩展,添加方便的方法,从Android打包的ColorInt值初始化颜色,并从UIColor示例中检索ColorInt值。
有了这个扩展,您可以使用UIColor(colorInt:)初始化器从Android打包的ColorInt值轻松创建UIColor示例。此外,您可以使用colorInt属性从UIColor示例中检索Android打包的ColorInt值。
示例用法:
在上面的示例中,UIColor示例颜色是从packed color int值-16776961创建的,表示蓝色。然后打印所提取的ColorInt值extractedColorInt,其与原始打包的color int值匹配。