ios将整数颜色转换为uicolor或十六进制值?

xwbd5t1u  于 2023-06-25  发布在  iOS
关注(0)|答案(3)|浏览(129)

在android中有一个选项,你可以根据int值设置颜色。我可以使用这个值或转换这个值以在iOS中将其设置为UIColor吗?例如这个值,-5242884可以在android中用来设置颜色。
从我设法找到的是iOS广泛使用十六进制值或rgb值来设置UIColor。但是我在这里找不到关于我的问题的任何信息。有没有什么方法可以让我用int value来代替。

pxq42qpu

pxq42qpu1#

您引用的整数似乎是压缩整数。参见:android color documentation。你需要找到一种方法将打包的int转换为十六进制,然后你可以使用这个宏(获得here),它将十六进制数转换为UIColor:

#define HEXCOLOR(c) [UIColor colorWithRed:((c>>24)&0xFF)/255.0 green:((c>>16)&0xFF)/255.0 blue:((c>>8)&0xFF)/255.0  alpha:((c)&0xFF)/255.0]

我知道这并没有真正回答你的问题,但它可能会帮助你缩小搜索范围。

编辑

好吧,我刚刚意识到上面的宏确实解决了你的问题。只要给予它整数表示,它就会给你正确的UIColor。我的测试代码如下:

UIColor *color = HEXCOLOR(-16776961); // Blue const from android link above
const CGFloat *components = CGColorGetComponents(color.CGColor);
NSString *colorAsString = [NSString stringWithFormat:@"%f,%f,%f,%f", components[0], components[1], components[2], components[3]]; 
NSLog(@"%@",colorAsString); // Prints 1.0 0.0 0.0 1.0 which corresponds to 0xff0000ff

我得到了here的帮助

编辑

修复宏以期望正确的RGBA值:

#define ANDROID_COLOR(c) [UIColor colorWithRed:((c>>16)&0xFF)/255.0 green:((c>>8)&0xFF)/255.0 blue:((c)&0xFF)/255.0  alpha:((c>>24)&0xFF)/255.0]

之前的宏预期RGBA,而Android颜色int提供ARGB。

6tqwzwtp

6tqwzwtp2#

Swift版本,如果它能帮助任何人:

func getUIColorFromAndroidColorInt(androidColorInt: Int) -> UIColor {

        let red = (CGFloat) ( (androidColorInt>>16)&0xFF )
        let green = (CGFloat) ( (androidColorInt>>8)&0xFF )
        let blue = (CGFloat) ( (androidColorInt)&0xFF )

        return UIColor(red: red/255, green: green/255, blue: blue/255, alpha: 1)

    }
5f0d552i

5f0d552i3#

您可以在Swift中为UIColor创建一个扩展,添加方便的方法,从Android打包的ColorInt值初始化颜色,并从UIColor示例中检索ColorInt值。

/**
 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)
    }
}

有了这个扩展,您可以使用UIColor(colorInt:)初始化器从Android打包的ColorInt值轻松创建UIColor示例。此外,您可以使用colorInt属性从UIColor示例中检索Android打包的ColorInt值。
示例用法:

let packedColor: Int32 = -16776961
let color = UIColor(colorInt: packedColor)
print(color) // Output: UIExtendedSRGBColorSpace 0 0 1 1

let extractedColorInt = color.colorInt
print(extractedColorInt) // Output: -16776961

在上面的示例中,UIColor示例颜色是从packed color int值-16776961创建的,表示蓝色。然后打印所提取的ColorInt值extractedColorInt,其与原始打包的color int值匹配。

相关问题