2010-06-09 19 views
13

मेरे पास url डेटा से आने वाले रंग मान हैं, "# ff33cc"। मैं इस मान को यूआईसीओलर में कैसे परिवर्तित कर सकता हूं? मैं कोड की निम्नलिखित पंक्तियों का प्रयास कर रहा हूं। मुझे baseColor1 के लिए मूल्य नहीं मिल रहा है। ऐसा लगता है कि मुझे वह पाउंड चार बंद करना चाहिए। क्या ऐसा करने का कोई और तरीका है?मैं आरजीबी हेक्स स्ट्रिंग को यूआईसीओलर में उद्देश्य-सी में कैसे परिवर्तित कर सकता हूं?

NSScanner *scanner2 = [NSScanner scannerWithString:@"#ff33cc"]; 
int baseColor1; 
[scanner2 scanHexInt:&baseColor1]; 
CGFloat red = (baseColor1 & 0xFF0000); 
[UIColor colorWithRed:red ... 
+0

पर ध्यान नहीं देता डॉक्स, 'के अनुसार - (bool) scanHexInt: (अहस्ताक्षरित *) intValue', ताकि आप' 'unsigned' के रूप में घोषित करने के लिए baseColor' चाहते हो सकता है; इसके अलावा, मुझे प्रोग्रामर का जवाब पसंद है। – Isaac

उत्तर

25

आप निकट पहुंच गए हैं लेकिन colorWithRed:green:blue:alpha: 0.0 से 1.0 से लेकर मूल्यों की उम्मीद है, तो आप 255.0f द्वारा बिट्स सही और विभाजित शिफ्ट करने के लिए की जरूरत है:

CGFloat red = ((baseColor1 & 0xFF0000) >> 16)/255.0f; 
CGFloat green = ((baseColor1 & 0x00FF00) >> 8)/255.0f; 
CGFloat blue = (baseColor1 & 0x0000FF)/255.0f; 

संपादित - इसके अलावा NSScanner के scanHexInt होगा हेक्स स्ट्रिंग के सामने 0x पिछले छोड़ें, लेकिन मुझे नहीं लगता कि यह आपके हेक्स स्ट्रिंग के सामने # वर्ण को छोड़ देगा। आपको लगता है कि संभाल करने के लिए इस लाइन जोड़ सकते हैं:

[scanner2 setCharactersToBeSkipped:[NSCharacterSet symbolCharacterSet]]; 
+0

अच्छा चालाक और सुरुचिपूर्ण समाधान! अच्छा कार्य! – ninehundredt

12

मैं एक स्ट्रिंग प्रतिस्थापन जोड़ा तो यह साथ या #

संभव पूर्ण कोड के बिना एक हेक्स स्ट्रिंग स्वीकार करता है:

+ (UIColor *)colorWithHexString:(NSString *)stringToConvert 
{ 
    NSString *noHashString = [stringToConvert stringByReplacingOccurrencesOfString:@"#" withString:@""]; // remove the # 
    NSScanner *scanner = [NSScanner scannerWithString:noHashString]; 
    [scanner setCharactersToBeSkipped:[NSCharacterSet symbolCharacterSet]]; // remove + and $ 

    unsigned hex; 
    if (![scanner scanHexInt:&hex]) return nil; 
    int r = (hex >> 16) & 0xFF; 
    int g = (hex >> 8) & 0xFF; 
    int b = (hex) & 0xFF; 

    return [UIColor colorWithRed:r/255.0f green:g/255.0f blue:b/255.0f alpha:1.0f]; 
} 
+0

यह उत्कृष्ट है, धन्यवाद। हालांकि स्कैनर पर 'अक्षर ToBeSkipped' को सेट नहीं किया गया है, पहले से ही '#' स्ट्रिंग प्रतिस्थापन की आवश्यकता को रोकता है? – devios1

1

मैंने एक फ़ंक्शन बनाया है जो निम्न मामलों में काम करता है: - 1) # 2 के साथ या बिना) 3 और 6 वर्ण लंबे मूल्य # 000 के साथ-साथ # 000000 3) छह से अधिक अतिरिक्त अंकों के मामले में यह अतिरिक्त अंक

//Function Call 
UIColor *organizationColor = [self colorWithHexString:@"#AAAAAAAAAAAAA" alpha:1]; 

//Function 
- (UIColor *)colorWithHexString:(NSString *)str_HEX alpha:(CGFloat)alpha_range{ 
    NSString *noHashString = [str_HEX stringByReplacingOccurrencesOfString:@"#" withString:@""]; // remove the # 

    int red = 0; 
    int green = 0; 
    int blue = 0; 

if ([str_HEX length]<=3) 
    { 
     sscanf([noHashString UTF8String], "%01X%01X%01X", &red, &green, &blue); 
     return [UIColor colorWithRed:red/16.0 green:green/16.0 blue:blue/16.0 alpha:alpha_range]; 
    } 
else if ([str_HEX length]>7) 
    { 
     NSString *mySmallerString = [noHashString substringToIndex:6]; 
     sscanf([mySmallerString UTF8String], "%02X%02X%02X", &red, &green, &blue); 
     return [UIColor colorWithRed:red/255.0 green:green/255.0 blue:blue/255.0 alpha:alpha_range]; 
    } 
else 
{ 
    sscanf([noHashString UTF8String], "%02X%02X%02X", &red, &green, &blue); 
    return [UIColor colorWithRed:red/255.0 green:green/255.0 blue:blue/255.0 alpha:alpha_range]; 
}} 
संबंधित मुद्दे

 संबंधित मुद्दे