2010-05-26 24 views
5

Objective-C'de rasgele bir renk onaltılık nasıl oluşturulur?Objective-C'de rasgele renk altıgen üretilsin mi?

Renkli bir onaltılık desteğe ihtiyacım var, rastgele bir renge ihtiyacım yok. Bu bir ekran koruyucu yazma (kod örnekleri dahil) cocoadev ilgili bir makale vardır

+2

UIColor/NSColor veya '# abcdef' dizesi? – kennytm

+0

Rastgele bir renge ihtiyacım yok, ama aslında bir renk hex'e ihtiyacım var (bunun için kullanıldığı amaç renkle ilgili değil). –

cevap

18

Sanırım senin için çalışmalıyım. Arc4random(), & ... performansından rand() 'den daha iyi bir şekilde daha iyidir. Rand() ayrıca kullanılmadan önce tohumlanmalıdır.

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

Düzenleme: Biçimlendirmeyle ilgili yoruma göre düzenlenir.

Sadece kısa not için
+0

Çok teşekkür ederim –

+1

Neredeyse doğru, ancak'% 06X 'gerekir, aksi takdirde # AB gibi renkler alırsınız. – kennytm

+1

Dizeyi, # içermesi gerekmedikçe biçimlendirin. –

5

Standart C kullanabilirsiniz Objective-C uygulamanızda kütüphane rutinini rand(). Oradan, rastgele rengin kırmızı, yeşil ve mavi kanallarının her biri için rastgele değerler almak için üç kez aramak isteyeceksiniz. Bu değeri (%), kanalın tipik olarak 256'ya sahip olabileceği maksimum değere göre değiştirmek isteyeceksiniz. Buradan, NSColor modelinizi uygun şekilde oluşturabilirsiniz.

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]; 

NSColor yerine tamsayılar yüzen sürdüğünden daha iyi bir yaklaşım baştan itibaren RAND_MAX tarafından rastgele değerler bölmek olacaktır:

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]; 

Bu sonuncu kod olacak gibi Yani kod görünebilir Renk sayısını 24 bit spektrumla sınırlamaz.

+0

Evet, ancak daha sonra yalnızca RGB değerlerine sahip olacaksınız - OP'nin açıkça olması gereken onaltılı değerlere dönüştürülmez ve birleştirilmiş (onaltılık bir renk kodu). –

+0

Yep; Ne aradığını tam olarak netleştirmeden önce cevabımı yayınladım. – fbrereto

+0

Rasgele kullanın() değil rand(). Rand() 'nın düşük 12 biti döngüsel bir desenden geçer. Ayrıca, rand()% 255 'size 0 - 254 aralığında bir sayı verir. – JeremyP

0

: İhtiyaçlarınıza bağlı

, size bir değil çok rastgele renk jeneratör yazmaya düşünmelisiniz mümkündür. (Örneğin, oluşturulan renklerin görünürlüğü için "kurallar" ayarlamak istediğinizde). Dolayısıyla, HSB'deki rastgele oluşturulan değerleri sınırlandırarak renk kodunu almanız gerekebilir.