2012-12-12 26 views
11

Tôi có một chuỗi RGB ở dạng rgb(34, 34, 34). Tôi muốn phân tích cú pháp thành UIColor bằng iOS. Tôi tin rằng tôi cần một regex cho điều này, nhưng tôi không thể có vẻ để crack nó. Đây là những gì tôi có cho đến nay.rgb (34, 34, 34) để UIColor

NSString *regExString = @"(.*?)rgb\((\d+), (\d+), (\d+)\)"; 

NSError *error = nil; 

NSRegularExpression *regEx = [NSRegularExpression regularExpressionWithPattern:regExString 
                     options:NSRegularExpressionCaseInsensitive error:&error]; 

NSArray *matches = [regEx matchesInString:backgroundColorString options:NSRegularExpressionCaseInsensitive 
             range:NSMakeRange(0, backgroundColorString.length)]; 

Nếu có ai có thể gửi cho tôi đúng hướng, điều đó thật tuyệt.

+0

Bạn CÓ CÓ nhận chuỗi rgb như vậy hoặc bạn có thể nhận được giá trị thực tế không? –

+0

Tôi nhận được chuỗi RGB này từ API mà tôi không có quyền kiểm soát. Họ đang phân phối nó ở định dạng này không may. –

+0

Kiểm tra câu trả lời của tôi :) Đã thêm nội dung nào đó sẽ giúp –

Trả lời

28

UIColor sử dụng một 0-1 thay vì 0-255 hệ thống vì vậy bạn chỉ cần phải chuyển đổi nó như vậy:

[UIColor colorWithRed:34.0/255.0 green:34.0/255.0 blue:34.0/255.0 alpha:1.0]; 

Cập nhật

Sau khi đọc câu hỏi của bạn tôi nhận ra thực sự của bạn vấn đề không chuyển đổi sang UIColor nhưng nhận được các giá trị. Tôi không biết nhiều về regex nhưng NSScanner là một đối tượng Objective-C đơn giản có thể làm điều tương tự, mặc dù tiết lộ nhiều hơn. Hãy thử kích thước này. Tôi chắc chắn rằng có thể có cách tốt hơn thậm chí có thể sử dụng hiệu quả hơn của NSScanner chính nó nhưng điều này chắc chắn hoạt động và sẽ làm việc cho bất kỳ giá trị int mà đi qua.

NSString *backgroundColorString = @"rgb(34, 34, 34)"; 

NSScanner *scanner = [NSScanner scannerWithString:backgroundColorString]; 
NSString *junk, *red, *green, *blue; 
[scanner scanUpToCharactersFromSet:[NSCharacterSet decimalDigitCharacterSet] intoString:&junk]; 
[scanner scanUpToCharactersFromSet:[NSCharacterSet punctuationCharacterSet] intoString:&red]; 
[scanner scanUpToCharactersFromSet:[NSCharacterSet decimalDigitCharacterSet] intoString:&junk]; 
[scanner scanUpToCharactersFromSet:[NSCharacterSet punctuationCharacterSet] intoString:&green]; 
[scanner scanUpToCharactersFromSet:[NSCharacterSet decimalDigitCharacterSet] intoString:&junk]; 
[scanner scanUpToCharactersFromSet:[NSCharacterSet punctuationCharacterSet] intoString:&blue]; 

UIColor *backgroundColor = [UIColor colorWithRed:red.intValue/255.0 green:green.intValue/255.0 blue:blue.intValue/255.0 alpha:1.0]; 
+0

Điều đó làm việc tuyệt vời Ryan. Cảm ơn rất nhiều. –

+0

Không sao cả. Happy Coding! Nếu tôi tìm ra một giải pháp bằng cách sử dụng Regex tôi sẽ cập nhật câu trả lời của tôi :) –

4

Tại sao sử dụng regex?

Chỉ cần sử dụng tỷ lệ 255:

UIColor* color = [UIColor colorWithRed:(red/255.0) green:(green/255.0) blue:(blue/255.0) alpha:1]; 

Tada!

+0

Vâng, nhưng thật đáng buồn tôi không biết giá trị RGB trước. Vì vậy, tôi cần phải phân tích chúng ra khỏi chuỗi đó. Tôi đang tải chuỗi đó từ máy chủ. –

0

Tôi đã làm cho nó đơn giản bằng cách sử dụng macro tiền xử lý.

#define UIColorMake(r,g,b)[[UIColor alloc] initWithRed:r/255.0 green:g/255.0 blue:b/255.0 alpha:1.0f]; 

làm thế nào để sử dụng:

UIColor MyGreenColor = UIColorMake(31.0, 164.0, 23.0); 

Tôi luôn để lại mã này trong các dự án iOS của tôi.

+0

Không phải là 255.0 không phải 215.0? –

Các vấn đề liên quan