2016-06-26 42 views
1

我有顏色的代碼轉換:convering十六進制爲rgb結果白

// takes @"#123456" 
+ (UIColor *)colorWithHexString:(NSString *)str { 
    const char *cStr = [str cStringUsingEncoding:NSASCIIStringEncoding]; 
    long x = strtol(cStr+1, NULL, 16); 
    return [UIColor colorWithHex:(UInt32)x]; 
} 

// takes 0x123456 
+ (UIColor *)colorWithHex:(UInt32)col { 
    unsigned char r, g, b, a; 
    b = col & 0xFF; 
    g = (col >> 8) & 0xFF; 
    r = (col >> 16) & 0xFF; 
    a = (col >> 24) & 0xFF; 
    if (a == 0) { 
     a = 255.0; 
    } 
    return [UIColor colorWithRed:(float)r/255.0f green:(float)g/255.0f blue:(float)b/255.0f alpha:(float)a/255.0f]; 
} 

的問題是,當我測試在模擬器上的代碼返回正確的顏色,但是當我測試這個設備上(新iPad迷你1)顏色返回

UIDeviceRGBColorSpace 111 0.0156863

這是小白!

+0

嘗試在設備上運行時NSLog值'x'和'col'。 – kennytm

+0

@Rob這是值#ffdd6858 – OXXY

+0

@kennytm這是輸出:x = 2147483647 col = 2147483647 – OXXY

回答

1

iPad mini 1有一個32位的CPU,並且類型long是一個32位有符號整數。

數字0xffdd6858溢出了32位有符號整數範圍,因此將返回最大數字0x7fffffff而不是半透明白色。

爲了解決這個問題,使用strtoul,以確保我們有至少一個無符號的32位整數:

unsigned long x = strtoul(cStr+1, NULL, 16); 

的代碼是在模擬器細因爲計算機應該是一個64位CPU和long是一個64位有符號整數,因此strtol調用不會溢出並保持實際值。而不是寫你自己的方法


,考慮重用現有的庫,例如mRs-/HexColorstinymind/UIColor-HexRGB

+0

這個答案只是xD – OXXY