2011-12-31 55 views
7

Có cách nào dễ dàng để chuyển đổi UIColor thành giá trị thập lục phân không?
Hoặc chúng ta phải lấy các thành phần RGB với CGColorGetComponents và sau đó làm việc ra khỏi đó?UIColor to Hexadecimal (màu web)

ví dụ: CGColorGetComponents(color.CGColor)[0] * 256?

Trả lời

7

Tôi sẽ xem xét sử dụng danh mục UIColor của Erica Sadun. Nó bao gồm rất nhiều chức năng miễn phí, bao gồm cả các biểu diễn hex. Nó khá dễ sử dụng, chỉ cần thêm nó vào bất kỳ tiêu đề lớp nào bạn đang sử dụng nó trong hoặc, thêm nó vào tiêu đề được biên dịch trước để có sự linh hoạt tối đa. Nếu bạn đang thêm vào tiêu đề trước khi biên soạn, làm như vậy tương tự như một cái gì đó như thế này:

#ifdef __OBJC__ 
    #import <Foundation/Foundation.h> 
    #import <UIKit/UIKit.h> 
    #import "UIColor-Expanded.h" 
#endif 

Sau đó, Bạn có thể sử dụng nó như vậy NSLog(@"%@", [myColor hexStringFromColor]);

GitHub liên kết tới các loại UIColor: https://github.com/erica/uicolor-utilities

Bài viết về ArsTechnica về nó: http://arstechnica.com/apple/guides/2009/02/iphone-development-accessing-uicolor-components.ars

+0

thư viện tuyệt vời. cám ơn vì cái này. – fes

+0

Không sao cả. Hi vọng nó sẽ dễ dàng cho bạn! – lewiguez

1

Không, theo như tôi biết, mọi giải pháp tích hợp sẵn. Tuy nhiên,
Lưu ý rằng bạn nên nhân với 255 thay vì 256.

Bắt một biểu diễn hệ thập lục phân là một nhiệm vụ dễ dàng, vì vậy bạn sẽ không gặp nhiều khó khăn khi xây dựng chuỗi theo cách thủ công.

NSLog(@"%X%X%X", redInteger, greenInteger, blueInteger); 
+0

Tôi nghĩ đó là cách thông minh để thực hiện điều đó. Vì thành phần trả về một số phao, làm sao bạn có thể chuyển đổi nó thành một số nguyên? Ví dụ: đối với màu tía: UIDeviceRGBColorSpace 0.548638 0.554697 1 1 – fes

+0

bạn sẽ có số nguyên bằng cách truyền hoặc làm tròn kết quả, thử nghiệm RGB 0,548638 0,554697 1, cắt ngắn, làm tròn, cho tôi mỗi lần * cùng màu * tía. –

+0

Bạn có thể cho tôi một ví dụ về cắt ngắn và làm tròn của bạn không?Có lẽ tôi đang làm tròn quá cao nhưng tôi luôn nhận được 1 và% X% X% X xuất hiện dưới dạng 111 – fes

9

Tôi cũng phải chuyển đổi UIColor thành thành phần hex của nó.

Như đã được chỉ ra bởi lewiguez có một danh mục rất tốt tại github thực hiện tất cả nội dung đó.

Nhưng vì tôi muốn tìm hiểu cách thực hiện, tôi đã thực hiện triển khai đơn giản của riêng mình cho màu RGB.

+ (NSString*)colorToWeb:(UIColor*)color 
{ 
    NSString *webColor = nil; 

    // This method only works for RGB colors 
    if (color && 
     CGColorGetNumberOfComponents(color.CGColor) == 4) 
    { 
     // Get the red, green and blue components 
     const CGFloat *components = CGColorGetComponents(color.CGColor); 

     // These components range from 0.0 till 1.0 and need to be converted to 0 till 255 
     CGFloat red, green, blue; 
     red = roundf(components[0] * 255.0); 
     green = roundf(components[1] * 255.0); 
     blue = roundf(components[2] * 255.0); 

     // Convert with %02x (use 02 to always get two chars) 
     webColor = [[NSString alloc]initWithFormat:@"%02x%02x%02x", (int)red, (int)green, (int)blue]; 
    } 

    return webColor; 
} 

Tất cả phản hồi đều được hoan nghênh!

+0

Phương pháp này hoạt động hoàn hảo, cảm ơn! – BFeher

2

Khác với giải pháp dựa trên chuỗi được sử dụng rộng rãi, đây là giải pháp dựa trên hex (số nguyên). Cách sử dụng:

UIColor* color = lf_rgb(0x120aef); 
log(@"color %.6x", color.hex_rgb); 

Và bạn sẽ nhận được "màu 120aef". Tôi sẽ đặt những mã trong https://github.com/superarts/LCategory, hoặc bạn có thể sao chép-dán vào ngân hàng mã của riêng bạn quá:

#define lf_rgb(rgbValue) [UIColor colorWithRed:((float)((rgbValue & 0xFF0000) >> 16))/255.0 green:((float)((rgbValue & 0xFF00) >> 8))/255.0 blue:((float)(rgbValue & 0xFF))/255.0 alpha:1.0] 

@interface UIColor (lc_rgb) 
- (NSInteger)hex_rgb; 
@end 

@implementation UIColor (lc_rgb) 
- (NSInteger)hex_rgb 
{ 
    CGFloat r, g, b, a; 
    BOOL result = [self getRed:&r green:&g blue:&b alpha:&a]; 
    // log(@"rgba: %f, %f, %f, %f", r * 255, g * 255, b * 255, a * 255); 
    if ((result == NO) || (a != 1.0f)) 
     return -1; 
    return 
     (NSInteger)(r * 255) * 256 * 256 + 
     (NSInteger)(g * 255) * 256 + 
     (NSInteger)(b * 255) * 1; 
} 
@end 
0

Đây là cách tôi đã làm nó với Swift 3:

extension UIColor { 
    var hex:String{ 
     get{ 
      var red:CGFloat = 0 
      var blue:CGFloat = 0 
      var green:CGFloat = 0 
      var alpha:CGFloat = 0 

      self.getRed(&red, green: &green, blue: &blue, alpha: &alpha) 
      let rgb:Int = (Int)(red*255)<<16 | (Int)(green*255)<<8 | (Int)(blue*255)<<0 
      return String.localizedStringWithFormat("#%06x", rgb) 
     } 
    } 
} 

Hoặc bạn có thể làm cho nó một phương pháp. Tôi chỉ thích cách color.hex giao diện với số color.hex().

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