圓環(huán)型的顏色選擇器

????作為一名程序員,最怕的產(chǎn)品是什么樣的? 沒(méi)錯(cuò),就是那種覺(jué)得你做起來(lái)應(yīng)該很容易的產(chǎn)品。
?? 好吧,也都是怪小弟學(xué)藝不精。
?? 是有這么一個(gè)UI圖,

image.png

我反正是沒(méi)有玩過(guò)這個(gè)·當(dāng)時(shí)就一臉懵圈了,主要是時(shí)間還很急。
后來(lái)是用的這么一個(gè)思路解決了它。大致做出了這么個(gè)樣子吧。
這里我就按我的這個(gè)思路來(lái)說(shuō)一下是怎么做的吧。
后面的顏色條,我是直接找UI 要的一張圖。然后小圓圈懟一個(gè)拖拽手勢(shì),獲取imgView上的顏色。小圓圈每次的位置都是計(jì)算的·=-= 有點(diǎn)苦逼。當(dāng)然了 我只是提供這一種搞法而已咯。
獲取view上的顏色:

- (UIColor *)colorOfPoint:(CGPoint)point {
    unsigned char pixel[4] = {0};
    CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB();
    CGContextRef context = CGBitmapContextCreate(pixel, 1, 1, 8, 4, colorSpace, (CGBitmapInfo)kCGImageAlphaPremultipliedLast);
    
    CGContextTranslateCTM(context, -point.x, -point.y);
    
    [self.imgView.layer renderInContext:context];
    
    CGContextRelease(context);
    CGColorSpaceRelease(colorSpace);
    
    UIColor *color = [UIColor colorWithRed:pixel[0]/255.0 green:pixel[1]/255.0 blue:pixel[2]/255.0 alpha:pixel[3]/255.0];
    if (pixel[0]==0&&pixel[1]==0&&pixel[2]==0) {
        return [UIColor clearColor];
    }
    return color;
}

我這邊取顏色加了個(gè)判斷,UI給的圖中間都是透明背景的,所以中間不是彩色的部分我就用這個(gè)來(lái)判斷的。
給圓圈加一個(gè)拖拽手勢(shì):

-(void)panBtn:(UIPanGestureRecognizer *)pan
{
    CGPoint loc = [pan locationInView:self.imgView];
    CGFloat radius=W(107);
    CGFloat imgRadius=self.imgView.width/2;
    NSLog(@"--hj%@",[self colorOfPoint:loc]);
     //判斷是否在彩色圓上
    if (!CGColorEqualToColor([self colorOfPoint:loc].CGColor, [UIColor clearColor].CGColor)) {
        CGFloat currentX=fabs(loc.x-imgRadius);
        CGFloat currentY=fabs(loc.y-imgRadius);
        CGFloat z= hypotf(currentX,currentY);
        CGFloat x=(currentX/z)*radius;
        CGFloat y=(currentY/z)*radius;
        CGFloat btnX,btnY;
        if (loc.x>=imgRadius) {
            btnX=x+imgRadius;
        }else
        {
            btnX=imgRadius-x;
        }
        if (loc.y>=imgRadius) {
            btnY=y+imgRadius;
        }else
        {
            btnY=imgRadius-y;
        }
        self.sliderBtn.center=CGPointMake(btnX, btnY);
    }
    if (pan.state == UIGestureRecognizerStateEnded) {
        [self colorOfPoint:self.sliderBtn.center];
    }
}

radius 這個(gè)是彩色圓圈中間的點(diǎn)到它中心的距離,用來(lái)算小圓圈的中心位置。
里面的算法也就是根據(jù)什么斜邊啊等等,算出小圓圈的中心坐標(biāo)位置,因?yàn)槟憧赡芡系狞c(diǎn)不在中心,所以你的把小圓圈的中心調(diào)整到正確的位置, 這個(gè)算法解釋的好累,自己研究吧,就是三角函數(shù)來(lái)的嘛。這個(gè)時(shí)候才覺(jué)得讀點(diǎn)書(shū)還是不錯(cuò)的。哈哈。
然后你可以在手勢(shì)結(jié)束后,或者實(shí)時(shí)拿到小圓圈所在的顏色了。這個(gè)就看各自的需求了。
做出來(lái)是這么個(gè)樣子:

image.png

一點(diǎn)偏差不用在意這些細(xì)節(jié),或或或。
這就結(jié)束了, 好像也不難, 還是自己技術(shù)不夠強(qiáng)勢(shì)喲。
思路,思路 很重要啊·阿西吧。
-------------大佬勿噴。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容