關於16進製制顏色值轉換為UIColor的思考

2021-09-20 01:10:00 字數 3216 閱讀 7502

大家都知道ios的uicolor提供的自定義初始化是通過rgb(a) 4個10進行制的引數,那麼為什麼用16進製制呢?因為web和安卓端以常識性用16進製制讀取,所以為了方便設計師出圖標註,很多時候都是16進製制的效果圖。而今天就是要討論一下,這個16進製制的轉換的方法。

網頁顏色 - 維基百科:

在html和css中使用3位元組共6個十六進製制數字表示一種顏色,每位元組從00到ff,相當十進位數字從0到255,按順序前兩位是紅色的值,中間兩位是綠的值,最後兩位是藍色的值。

由於網頁(web)是基於計算機瀏覽器開發的**,所以顏色以光學顏色rgb(紅、綠、藍)為主。 網頁顏色是以16進製制**表示,一般以「#」號開頭,後面分別為r、g、b的16位進製數。 ff為最大數,代表十進位制255。比如白色是r、g、b三個顏色最大,在網頁**便是:#ffffff。黑色是三個顏色為0,在網頁**便是:#000000。當顏色**為#xxyyzz時,可以用#xyz表示,如#135與#113355表示同樣的顏色。在css中,也可以使用rgb(127,127,127)代替#7f7f7f(十進位制表示)。

有意思的是,所以可以表示的顏色數總共有: 256^3 = 16,777,216 種,這個顏色就是我們常說的真彩色

16進製制轉換為10進製後的整形轉換為uicolor:

// rgb顏色轉換(rgbvalue為16進製制轉換成10進製的整形)

#define macro_color_hexcolor(rgbvalue) ([uicolor colorwithred:((float)((rgbvalue & 0xff0000) >> 16))/255.0f green:((float)((rgbvalue & 0xff00) >> 8))/255.0f blue:((float)(rgbvalue & 0xff))/255.0f alpha:1.0])

#pragma mark -16進製制顏色值轉化uicolor

+ (uicolor *)colorfromhexstring:(nsstring *)hexstring

這種方法,只能輸入以#開頭的十六進製制顏色,比如#3c93fd,如果輸入0x3c93fd,最後都會得到黑色。(因為rgbvalue為0,所以全部顏色為0,得到黑色。)

+ (uicolor *)colorwithhexstring:(nsstring *) hexstring

這種方法,只能輸入以0x0x開頭的十六進製制顏色,比如0x3c93fd,如果輸入#3c93fd,最後都會得到nil(透明)。(scanner轉換10進製失敗,hexnum為0,但是直接return nil,)

// 顏色轉換三:ios中十六進製制的顏色(以#開頭)轉換為uicolor

+ (uicolor *) colorwithhexstring: (nsstring *)color

// 判斷字首並剪下掉

if ([cstring hasprefix:@"0x"])

cstring = [cstring substringfromindex:2];

if ([cstring hasprefix:@"#"])

cstring = [cstring substringfromindex:1];

if ([cstring length] != 6)

return [uicolor clearcolor];

// 從六位數值中找到rgb對應的位數並轉換

nsrange range;

range.location = 0;

range.length = 2;

//r、g、b

nsstring *rstring = [cstring substringwithrange:range];

range.location = 2;

nsstring *gstring = [cstring substringwithrange:range];

range.location = 4;

nsstring *bstring = [cstring substringwithrange:range];

// scan values

unsigned int r, g, b;

[[nsscanner scannerwithstring:rstring] scanhexint:&r];

[[nsscanner scannerwithstring:gstring] scanhexint:&g];

[[nsscanner scannerwithstring:bstring] scanhexint:&b];

return [uicolor colorwithred:((float) r / 255.0f) green:((float) g / 255.0f) blue:((float) b / 255.0f) alpha:1.0f];

}

這種方法,做了0x#判斷,但是為什麼那麼長!!!有沒有辦法優化?

因為用了nsscanner進行轉換,所以為什麼不用nsscanner直接判斷,然後轉換呢?另外蘋果文件注釋:

- (bool)scanhexint:(nullable unsigned *)result;   // optionally prefixed with "0x" or "0x"
所以,其實用nsscanner進行轉換時,不用判斷 "0x" or "0x",所以直接判斷#後過濾掉(跳過)就可以啦!!!

直接看**吧,發現看**比文字更有力!:

+ (uicolor *) colorwithhexstring:(nsstring *)hexstring 

上面的scanstring: intostring:方法是乙個技巧,判斷是否包含#,如果包括時,scanner的scanlocation會指向下乙個字元。所以用scanhexint:將十六進製制無符號整形時,已經不包含#,所以能成功轉換。

使用16進製制顏色值

通常情況下我們是直接使用類似於 ee1289這樣的 來直接表示rgb顏色的 uicolor colorwithred 0xee 255.0 green 0x12 255.0 blue 0x89 255.0 alpha 1 這樣呼叫真是太繁瑣了,所以封裝了乙個小方法來直接呼叫 獲取顏色 uicolor...

2019 1 2 數字轉換為16進製制

給定乙個整數,編寫乙個演算法將這個數轉換為十六進製制數。對於負整數,我們通常使用 補碼運算 方法。注意 十六進製制中所有字母 a f 都必須是小寫。十六進製制字串中不能包含多餘的前導零。如果要轉化的數為0,那麼以單個字元 0 來表示 對於其他情況,十六進製制字串中的第乙個字元將不會是0字元。給定的數...

將數字轉換為16進製制

給定乙個整數,寫乙個函式將其轉換為16進製制。對於負整數,需要使用二進位制補碼。樣例1 輸入 26 輸出 1a 樣例2 輸入 1 輸出 ffffffff 16進製制的所有字母 a f 必須為小寫。16進製制字串不能包含額外的前導0。如果數字為零,將它表示為單個字元 0 否則,16進製制數的第乙個字元...