我看到了这个宏on an Internet page。没有解释它的作用。
#define UIColorFromRGB(__HEX__, __A__) [UIColor \
colorWithRed:((float)((__HEX__ & 0xFF0000) >> 16))/255.0 \
green:((float)((__HEX__ & 0xFF00) >> 8))/255.0 \
blue:((float)(__HEX__ & 0xFF))/255.0 alpha:__HEX__]
我想它在0xRRGGBB
表单上需要一个十六进制数字,并从中提取RR
,GG
和BB
部分,但这究竟是如何完成的?
或者最具体地说,(__HEX__ & 0xFF0000) >> 16)
如何提取数字的第一部分?
抱歉,我从来没有理解这个C
的东西。
最后写alpha:__HEX__
是不是作者错了?不应该是alpha:__A__
?
感谢。
答案 0 :(得分:3)
因此,我们取值0xAABBCC
作为颜色。
__HEX__ & 0xFF0000
会产生0xAA0000
。 0xAA0000 >> 16
会产生0xAA
。 0xAA / 255.0
会产生0.6667
。这是+colorWithRed:green:blue:alpha:
正在寻找的价值范围内。
__HEX__ & 0xFF00
会产生0xBB00
。 0xBB00 >> 8
会产生0xBB
。 0xBB / 255.0
会产生0.7333
。这是+colorWithRed:green:blue:alpha:
正在寻找的价值范围内。
__HEX__ & 0xFF
会产生0xCC
。 0xCC / 255.0
会产生0.8
。这是+colorWithRed:green:blue:alpha:
正在寻找的价值范围内。
你是对的阿尔法是错的。为简单起见,我只想使用原始A值
#define UIColorFromRGB(__HEX__, __A__) [UIColor \
colorWithRed:((CGFloat)(((__HEX__) & 0xFF0000) >> 16))/255.0 \
green:((CGFloat)(((__HEX__) & 0xFF00) >> 8))/255.0 \
blue:((CGFloat)((__HEX__) & 0xFF))/255.0 alpha:(CGFloat)(__A__)]
预期用途类似于UIColorFromRGB(0xAABBCC, 0.6)
,此alpha会使0xAABBCC
颜色变为60%不透明。
注意强>
我总是在括号中包装宏参数。这可以防止某些类型的语法或逻辑错误。
+colorWithRed:green:blue:alpha:
期望类型CGFloat
不是float
。
<强>更新强>
有人询问有关位移的更多解释。所以这里。
0x32241608
是我构建的一个数字,显示0x32000000
是32位数字,0x240000
是24但数字,0x1600
是16位数字,并且0x08
是一个8位数字。
0x32241608 >> 8
会产生0x322416
。您可以将其视为切断数字的8位部分。
0x32241608 >> 16
会产生0x3224
。您可以将其视为切断数字的16位部分。
0x32241608 >> 24
会产生0x32
。您可以将其视为切断数字的24位部分。
0x32241608 >> 32
会产生0x0
。您可以将其视为切断数字的32位部分,从而减少整数。
回到我的解释。要获得红色值,您需要切断绿色和蓝色值的16位。要获得绿色值,您需要切掉蓝色值的8位。
希望这可以清除位移。