2010-05-26 56 views
5

Làm cách nào để tạo một hệ thập lục phân màu ngẫu nhiên trong Objective-C?Tạo hex màu ngẫu nhiên trong Objective-C?

Tôi cần một màu thập lục phân, tôi không cần màu ngẫu nhiên. Đó là phức tạp ...

+2

UIColor/NSColor hoặc chuỗi '# abcdef'? – kennytm

+0

Tôi không cần một màu ngẫu nhiên, nhưng tôi thực sự cần một hex màu (mục đích nó được sử dụng cho không liên quan đến màu sắc). –

Trả lời

18

Tôi nghĩ nên làm việc cho bạn. Arc4random() là tốt hơn nhiều trong cách thực hiện & ... độ chính xác hơn rand(). Rand() cũng cần phải được gieo hạt trước khi sử dụng.

// 16777215 is FFFFFF 
NSInteger *baseInt = arc4random() % 16777216; 
NSString *hex = [NSString stringWithFormat:@"%06X", baseInt]; 

Chỉnh sửa: Đã chỉnh sửa dựa trên nhận xét về định dạng.

+0

Cảm ơn bạn rất nhiều –

+1

Hầu như chính xác, nhưng bạn cần'% 06X', nếu không bạn sẽ nhận được các màu như '# AB'. – kennytm

+1

Định dạng chuỗi khi bạn cần bao gồm # hoặc không. –

5

Bạn có thể sử dụng các tiêu chuẩn C thói quen thư viện rand() trong ứng dụng Objective-C của bạn. Từ đó, sau đó, bạn sẽ muốn gọi nó ba lần để nhận các giá trị ngẫu nhiên cho mỗi kênh màu đỏ, xanh lá cây và xanh dương của màu ngẫu nhiên của bạn. Bạn sẽ muốn mod (%) giá trị theo giá trị tối đa mà kênh có thể có - thường là 256. Từ đó bạn có thể tạo NSColor một cách thích hợp. Vì vậy, mã của bạn có thể giống như thế:

int red = rand() % 255; 
int green = rand() % 255; 
int blue = rand() % 255; 
NSColor* myColor = [NSColor colorWithCalibratedRed:red/255.0 green:green/255.0 blue:blue/255.0 alpha:1.0]; 

Vì NSColor mất phao nổi thay vì số nguyên một cách tiếp cận tốt hơn sẽ được chia các giá trị ngẫu nhiên bằng cách RAND_MAX ngay từ đầu:

float rand_max = RAND_MAX; 
float red = rand()/rand_max; 
float green = rand()/rand_max; 
float blue = rand()/rand_max; 
NSColor* myColor = [NSColor colorWithCalibratedRed:red green:green blue:blue alpha:1.0]; 

đang sau này sẽ không giới hạn số lượng màu đến phổ 24 bit.

+0

Vâng, nhưng sau đó bạn sẽ chỉ có các giá trị RGB - nó không được chuyển đổi thành giá trị thập lục phân và được nối (làm cho nó trở thành mã màu thập lục phân), mà OP rõ ràng là cần. –

+0

Yep; Tôi đã đăng câu trả lời của mình trước khi anh ta làm rõ chính xác những gì anh ta đang tìm kiếm. – fbrereto

+0

Sử dụng ngẫu nhiên() không rand(). 12 bit thấp của rand() đi qua một mô hình tuần hoàn. Ngoài ra, 'rand()% 255' cung cấp cho bạn một số trong khoảng 0 - 254. – JeremyP

0

Chỉ cần lưu ý ngắn:

Tùy thuộc vào nhu cầu của bạn, có thể bạn nên cân nhắc viết trình tạo màu không ngẫu nhiên. (Ví dụ khi muốn thiết lập "quy tắc" cho khả năng hiển thị của các màu được tạo.) Vì vậy, có thể bạn cần lấy mã màu bằng cách giới hạn các giá trị được tạo ngẫu nhiên trong HSB.