2012-11-12 111 views
1

我設置了一個顏色類,它將紅色/藍色/綠色的值設置在哪裏,並使用它們來創建一個十六進制字符串,然後用它來返回一個顏色。它可以通過提供紅色,藍色和綠色的彩色像這樣HexDex顏色:將字符串轉換爲整數除去0

Colour *col = [[Colour alloc] initWithRed:200 Green:100 Blue:05]; 

這種方法的問題被初始化時,如果我通過在像05的值,則0被剝離,並且僅有5被傳遞在,所以藍色將設置爲只爲5,而非05.我的方法返回一個有效的十六進制字符串是這個

-(NSString *)getHexString 
    { 
     NSString *hexString = [NSString stringWithFormat:@"#%x%x%x", iRed_i,iGreen_i,iBlue_i]; 
     hexString = [hexString uppercaseString]; 
     return hexString; 
    } 

據預計2個值,每個數字返回正確的顏色代碼,但0被剝離意味着它返回不正確的顏色。

我用於創建顏色的另一種方法是用一個十六進制字符串這樣初始化的顏色對象:

Colour *colour = [[Colour alloc] initWithHex:@"#782402"]; 

然後我用掃描儀到3個值中分離像這樣

if ([sHex_p hasPrefix:@"#"]) sHex_p = [sHex_p substringFromIndex:1]; 
      unsigned int outVal; 
      NSString *sRed = [sHex_p substringToIndex:2]; 
      NSScanner* scanner = [NSScanner scannerWithString:sRed]; 

      [scanner scanHexInt:&outVal]; 
      [self setRed:outVal]; 

      NSString *sGreen = [[sHex_p substringFromIndex:2] substringToIndex:2]; 
      scanner = [NSScanner scannerWithString:sGreen]; 
      [scanner scanHexInt:&outVal]; 
      [self setGreen:outVal]; 

      NSString *sBlue = [sHex_p substringFromIndex:4]; 
      scanner = [NSScanner scannerWithString:sBlue]; 

      [scanner scanHexInt:&outVal]; 

      [self setBlue:outVal]; 
     } 

但同樣的問題,在我提供的最後2個值的十六進制字符串中是02,但是當從int轉換爲字符串時,0將被除去,所以只有2會被傳遞,並且以不正確的顏色結束。

我真的不確定解決這個問題的最好方法是什麼。如果有人能指出正確的方向,我會很感激。

我一直用這個網站在這裏

http://www.colorpicker.com/

快速例如測試它,我想創造這個十六進制字符串「#DB4200」。它需要紅色= 219綠= 66,藍= 00

但隨着藍色正好被設置爲0時,從字符串轉換成int,最終返回一個不正確的顏色,十六進制的字符串結尾爲「#DB420」

回答

1

嗯,這實際上涉及三種不同的情況。首先,05只有5, 在十六進制和十進制的基礎上。這個問題不在你的輸入 這種情況下,但可能與輸出。但是,請記住這是一個十進制的 字面值,因此如果您希望#101010表示每種顏色的255箇中的16個,請使用 十六進制常數,如0x10

二:關於產量。您使用的格式字符串不會強制執行每種顏色的2 數字,這就是爲什麼您的05只能成爲5。通過使用%02x而不是%x,可以強制 輸出一個整數(以十六進制形式)的兩個數字填充爲零 。

三,實際上是第一。看起來你的方法正在工作,但輸出是 錯誤。修復格式字符串應該解決這個問題。無論如何,這是一個 替代版本使用sscanf

- (void)interpretHexString(NSString *str) 
{ 
    int r,g,b; 
    const char *s = [str cStringUsingEncoding:NSUTF8StringEncoding]; 

    if (sscanf(s, "#%02x%02x%02x", &r, &g, &b) != 3) { 
     /* problem with input */ 
    } else { 
     /* set ivars */ 
     [self setRed:r]; 
     [self setGreen:g]; 
     [self setBlue:b]; 
    } 
} 
+0

非常感謝,您的解決方案非常完美!在那裏試圖找出那個好的! – AdamM

+0

不客氣,我很高興解決了這個問題。請注意,我對掃描該值的建議實際上只是一個建議,但在您的內容中包含錯誤檢查部分會很好,除非它已經存在並且未在您發佈的示例中顯示;-) – sidyll

+1

我的錯誤檢查didn' t之前提出這個問題,因爲我的錯誤檢查只是確保紅色/藍色/綠色的值介於0和255之間,而我在錯誤檢查傳遞的十六進制字符串是正確的格式,即以散列開始,是6位數字,我didn對生成的十六進制字符串沒有任何錯誤檢查,這就是爲什麼我以前沒有注意到這一點。這是我沒有使我的測試足夠廣泛,將現在添加一個錯誤檢查,以確保我沒有遇到像這樣的問題。乾杯! – AdamM