2015-06-01 54 views
0

我正在研究一个需要能够支持大量部分的圆环图。从一系列颜色中快速动态变换颜色

为此,每一节当然需要它自己的颜色。为此,我需要一种方法为每个部分动态创建一种新颜色。这很容易。但它也需要使用startColor和EndColor,因此它可以使用例如只有蓝色的颜色。

我没有管理这个使用下面的代码:

var rStartValue: CGFloat = 16 
var gStartValue: CGFloat = 177 
var bStartValue: CGFloat = 216 

var rEndValue: CGFloat = 30 
var gEndValue: CGFloat = 30 
var bEndValue: CGFloat = 38 

    for percentFill in percentFills { 

     let progressLine = CAShapeLayer() 

     if rStartValue < rEndValue { 
      rStartValue += 1 
     } else if rStartValue > rEndValue { 
      rStartValue -= 1 
     } 

     if gStartValue < gEndValue { 
      gStartValue += 1 
     } else if gStartValue > gEndValue { 
      gStartValue -= 1 
     } 

     if bStartValue < bEndValue { 
      bStartValue += 1 
     } else if bStartValue > bEndValue { 
      bStartValue -= 1 
     } 
} 

不过。这还不是理想的结果。

我需要它适当地进行。现在它在每个循环中只有1个值。如果有很多部分,哪个是可以的,但有时候只有17个左右。

所以我需要它来计算基于节的数量多少步。

经过与百分比填充/各种相关变量的各种版本搞乱之后。

我最终在这里,希望有人能帮助我弄清楚如何使这些颜色正确步​​骤。

这里是什么,我一直想一个例子:

var rJump = CGFloat(percentFills.count)/(rStartValue-rEndValue) 
var gJump = CGFloat(percentFills.count)/(gStartValue-gEndValue) 
var bJump = CGFloat(percentFills.count)/(bStartValue-bEndValue) 

然后与rJump,gJump或bJump循环替换1。但是我试图用percentFills.count(总节数)来划分的每个变量都不能提供期望的结果。

startValue应始终为第一种颜色,endValue应始终为最后一种颜色。然后尽可能均匀地从头到尾。

任何帮助越过这个障碍将不胜感激!

+4

而不是使用RGB,你可能会更好地使用HSL,其中H是色调,其实质上是颜色。 – zaph

+0

我从来没有与HSL合作过。你如何在UIColor中使用HSL? –

回答

2

而不是使用RGB,你可能会更好地使用HSL,其中H是色相,其实质上是颜色。

您可以使用:

斯威夫特:

init(hue hue: CGFloat, saturation saturation: CGFloat, brightness brightness: CGFloat, alpha alpha: CGFloat) 

的ObjectiveC:

+ (UIColor *)colorWithHue:(CGFloat)hue saturation:(CGFloat)saturation brightness:(CGFloat)brightness alpha:(CGFloat)alpha 

所有值的范围是0.0 - 1.0。
请参阅Apple Docs

HSL接近我们体验颜色的方式,RGB是大多数硬件显示颜色的方式。

这里是从界面生成器的例子,该值是0 - 360: enter image description here

+1

HSL用于色相饱和度和亮度 –

+0

好吧,所以这不能回答我的实际问题。我有颜色工作,他们只是不正确步骤。无论哪种方式,我一直试图将它改为HSL,只是因为它看起来像更好的解决方案,但我在这里错过了一些东西。这里是我尝试过的:'UIColor(hue:startHue,saturation:startSat,brightness:startB,alpha:1.0)',其中hue始于192(或192/359),坐标为0.86(也试过86),亮度为0.45 (也试过45)。但它使我的整个圆环图变成红色。我打印出UIColor并得到了这个? 'UIDeviceRGBColorSpace 0.45 0 0 1'只显示红色。 –

+1

基本上只是改变色调。在Interface Builder或图形程序中使用HSL颜色播放。 – zaph

0

我计算出来。

这是我的数学“小”的问题。而不是做:

var rJump = CGFloat(percentFills.count)/(rStartValue-rEndValue) 
var gJump = CGFloat(percentFills.count)/(gStartValue-gEndValue) 
var bJump = CGFloat(percentFills.count)/(bStartValue-bEndValue) 

我只是需要把它改成这样:

var rJump = (rStartValue-rEndValue)/CGFloat(percentFills.count) 
var gJump = (gStartValue-gEndValue)/CGFloat(percentFills.count) 
var bJump = (bStartValue-bEndValue)/CGFloat(percentFills.count) 

这需要在价值观的差异。例如。如果你的红色开始是100,你的结束红色是200,你有10个部分(或步骤),它看起来像这样:

100-50 = 50(这是两者之间的差异。)

50/10(然后50由部分(步骤的量除以)= 5

其中5是红色需要改变用于每个步骤的量:

if rStartValue < rEndValue { 
    rStartValue += 5 
} else if rStartValue > rEndValue { 
    rStartValue -= 5 
} 

当然应该使用变量rJump来代替数字。

希望如果有人遇到类似的问题,帮助其他人。

另请参阅Zaph的回答。正如他提到的那样使用HBS,您可能只需要为每个循环更改1个值而不是3个。