項(xiàng)目中有這樣的需求,獲取到的某一種顏色,將button 定位到彩色圓上的位置。
這里需要用到HSB的概念了。
色相H( Hue ):在0~360°的標(biāo)準(zhǔn)色環(huán)上,按照角度值標(biāo)識(shí)。比如紅是0°、橙色是30°等。
飽和度S( saturation ):是指顏色的強(qiáng)度或純度。飽和度表示色相中彩色成分所占的比例,用從0%(灰色)~100%(完全飽和)的百分比來(lái)度量。在色立面上飽和度是從內(nèi)向外逐漸增加。
亮度B( brightness ):是顏色的明暗程度,通常是從0(黑)~100%(白)的百分比來(lái)度量的,在色立面中從上至下逐漸遞減,上邊線為100%,下邊線為0% 。
既然是0~360°,紅色的是0°. 根據(jù)角度來(lái)定位。
當(dāng)然這是一種思路而已,大屌繞道。
舉個(gè)我這邊的例子:我這邊是根據(jù)一張彩色的圖片來(lái)的
UIImageView *imgView=[[UIImageView alloc]initWithImage:[UIImage imageNamed:@"Combined Shape"]];
imgView.frame=CGRectMake(70, 74, 235, 235);
imgView.userInteractionEnabled=YES;
[self.view addSubview:imgView];
self.imgView=imgView;
UIButton *btn=[UIButton buttonWithType:UIButtonTypeCustom];
btn.layer.cornerRadius=11.5;
btn.backgroundColor=[UIColor clearColor];
btn.layer.borderColor=[UIColor whiteColor].CGColor;
btn.layer.borderWidth=2;
btn.size=CGSizeMake(23, 23);
btn.center=CGPointMake(imgView.frame.size.width/2, imgView.frame.size.height/2-107);
[imgView addSubview:btn];
self.sliderBtn=btn;
[[[UIColor redColor] neoToHSL] getHue:&_hue saturation:&_saturation brightness:&_luminosity alpha:&_alpha];
[self positionHue];
- (void) positionHue {
CGFloat angle = M_PI * 2 * _hue+M_PI*1/3;
CGFloat cx = 107 * cos(angle) + self.imgView.frame.size.width/2 ;
CGFloat cy = 107 * sin(angle) + self.imgView.frame.size.width/2 ;
CGRect frame = self.sliderBtn.frame;
frame.origin.x = cx;
frame.origin.y = cy;
self.sliderBtn.center = CGPointMake(cx, cy);
}
如上代碼得到的效果就是這樣:
1.png
可以看出定位在紅色位置了, 我這邊因?yàn)槭羌t色并不在0度的位置,所以+M_PI*1/3的角度,這個(gè)自行調(diào)整。
顏色是先轉(zhuǎn)成HSL的Color了再獲取到飽和度。
位置就根據(jù)角度來(lái)算了,考驗(yàn)數(shù)學(xué)能力了。
其他就根據(jù)自身需求做一些調(diào)整,修改咯。
最后擺一個(gè)轉(zhuǎn)HSL的分類:
- (UIColor *) neoToHSL {
CGFloat h, s, l, w, a;
if ([self getHue:&h saturation:&s brightness:&l alpha:&a]) {
return self;
} else if ([self getWhite:&w alpha:&a]) {
return [UIColor colorWithHue:0 saturation:0 brightness:w alpha:a];
} else {
CGFloat r, g, b;
[self getRed:&r green:&g blue:&b alpha:&a];
CGFloat min, max, delta;
min = MIN(MIN(r, g), b);
max = MAX(MAX(r, g), b);
delta = max - min;
l = (max + min) / 2;
if (delta == 0) {
h = 0;
s = 0;
} else {
if (l < 0.5 ) {
s = max / ( max + min );
} else {
s = max / ( 2 - max - min );
}
CGFloat dR, dG, dB;
dR = (((max - r) / 6.0) + (max / 2)) / max;
dG = (((max - g) / 6) + (max / 2)) / max;
dB = (((max - b) / 6) + (max / 2)) / max;
if (r == max) {
h = dB - dG;
} else if (g == max) {
h = 1/3 + dR - dB;
} else if (b == max) {
h = 2/3 + dG - dR;
}
if (h < 0) h += 1;
if (h > 1) h -= 1;
}
return [UIColor colorWithHue:h saturation:s brightness:l alpha:a];
}
}