iOS:将整数颜色转换为UIColor或十六进制值?

3

在安卓系统中,有一种选项可以根据int值设置颜色。那么我能否使用这个值或将其转换为iOS系统下的UIColor来设置呢?比如说,像这个值,-5242884,能够在安卓系统中被用于设置颜色。

据我所知,在iOS系统中,广泛使用十六进制值或RGB值来设置UIColor。但是我没能找到任何关于解决我的问题的信息。是否有什么方法可以使用int值来代替呢?


实际上,这是一个可以在Android端设置的颜色值。在Android中,我可以将这个负整数值转换为十六进制值。但我想知道是否可以在iOS中将该值转换。 - IssacZH.
@KudoCC 坦白说,我真的不太确定那个 int 值代表什么。对于这些东西,我自己也有点茫然无措。 - IssacZH.
如何在Android上进行测试?没有上下文。将负值转换为RGB使用了什么算法? - rmaddy
只是用这种方式进行测试。将其设置为一个视图。它接受整数值。例如,view.setBackgroundColor(color)color 定义为上述的值。 - IssacZH.
请看下面我的更新答案。我认为现在它回答了你的问题。 - nalyd88
显示剩余5条评论
4个回答

10

看起来你引用的整数是打包的整数。参见:Android 颜色文档。你需要找到一种将打包的整型转换为十六进制的方法,然后可以使用此宏(从此处获取),将十六进制数转换为 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

我从这里得到了一些帮助。

编辑

修正了宏以期望正确的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格式,而安卓颜色整数提供的是ARGB格式。


谢谢...我很感激。我会调查一下的。 - IssacZH.
UIColor *color = HEXCOLOR(-16776961); 使用上述代码创建的color对象在Android中显示为蓝色,但在iOS中显示为红色。不幸的是,宏的准确性有所欠缺。 - IssacZH.
@IssacZH。我认为这与RGBA值的顺序有关。Android颜色可能是ARGB,而UIColor是RGBA,因此在示例中红色和蓝色可能被交换了位置。修改宏以将它们放置在正确的顺序中。我会在我的答案中发布一次编辑。 - nalyd88
它成功了!非常感谢,现在颜色与安卓匹配了。你真是救星。 =) 如果可以的话,不知是否能将其从十六进制或 RGB 值反向转换? - IssacZH.
我没有以那种方式使用过它,但我认为这是可能的。尝试对宏进行逆向工程。从十六进制开始处理颜色组件,然后按位向左移动(<<),再将它们进行按位或(OR)操作。祝你好运。很高兴能帮到你! - nalyd88

1

0
您可以在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实例的颜色是从打包的颜色int值-16776961创建的,表示蓝色。然后打印提取的ColorInt值extractedColorInt,它与原始的打包颜色int值相匹配。

这段代码在许多情况下会崩溃。例如:print(UIColor.white.colorInt)。并非所有颜色都是RGBA,并且并非所有颜色都有4个组件。 - HangarRash

0

如果有帮助的话,这是 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)

    }

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