【问题标题】:Function to return colour based on value passed根据传递的值返回颜色的函数
【发布时间】:2015-10-07 17:57:27
【问题描述】:

我想创建一个函数,该函数将根据插入的值返回颜色。理想情况下,我想要做的是具有三种不同的颜色(例如红色、绿色、蓝色)和一个范围(例如 1 到 100),因此如果您将 80 传递给函数,它将返回绿色之间的颜色和蓝色(显然更接近蓝色)。

通常我会在寻求帮助之前尝试编写一些代码,但我不确定从哪里开始。

有人有什么建议吗?

谢谢。

【问题讨论】:

  • 想法.... 如果要在单个(色调)轴上表达颜色,则需要对亮度和饱和度做出一些决定。我不知道+ colorWithHue:saturation:brightness:alpha: 中的 H 值代表哪些色调,但如果您可以将域中的数字 1 到 100 映射到其 0.0 到 1.0,这可能是最简单的答案。
  • 我不明白你为什么说三种不同的颜色。听起来您想要的是两种颜色之间的线性插值。
  • 这是一个可以帮助您前进的答案,尽管代码是 C++。 stackoverflow.com/a/13489050

标签: ios swift uicolor


【解决方案1】:

您的意思是 0 = 红色、50 = 绿色和 100 = 蓝色吗?

如果数字 = 40,这意味着它有很多红色,一些绿色,没有蓝色?我说的对吗?

我用记事本写的,请重新检查一下

func getColorFromNumber(number: Int) -> UIColor { 
    // case of color between RED and GREEN
    if number <= 50 {
        // get color 1, base on 50 - number
        let rColor1 = 0
        let gColor1 = CGFloat( Double(50 - number) * 157 / 50 )
        let bColor1 = CGFloat( Double(50 - number) * 29 / 50 )

        // get color 2, base on number
        let rColor2 = CGFloat( Double( number ) * 255 / 50 )
        let gColor2 = CGFloat( Double( number ) * 148 / 50 )
        let bColor2 = 0

        let avgR = (rColor1 + rColor2) / 2
        let avgG = (gColor1 + gColor2) / 2
        let avgB = (bColor1 + bColor2) / 2

        return UIColor(red: avgR , green: avgG, blue: avgB, alpha: 1.0)
    }
    // case of color between GREEN and BLUE
    else if number > 50 {
        // get color 2, base on 100 - number 
        let rColor2 = CGFloat( Double( 100 - number ) * 255 / 50 )
        let gColor2 = CGFloat( Double( 100 - number ) * 148 / 50 )
        let bColor2 = 0

        // get color 3, base on number - 50
        let rColor3 = CGFloat( Double( number - 50 ) * 255 / 50 )
        let gColor3 = CGFloat( Double( number - 50 ) * 87 / 50 )
        let bColor3 = CGFloat( Double( number - 50 ) * 29 / 50 )

        let avgR = (rColor2 + rColor3) / 2
        let avgG = (gColor2 + gColor3) / 2
        let avgB = (bColor2 + bColor3) / 2

        return UIColor(red: avgR , green: avgG, blue: avgB, alpha: 1.0)
    }

    // this will never called
    return UIColor(red: 1.0 , green: 1.0, blue: 1.0, alpha: 1.0)
}

【讨论】:

  • 是的,就是这样!我尝试了该代码,它在某种程度上有效。 0 或 100 为绿色,1-49 为黄色,51-99 为蓝色,50 为红色。此外,我希望使用的特定颜色是 (0, 157, 29), (255, 148, 0), (255, 87, 29) - 绿色、橙色、红色。
  • 我没有得到您需要的绿色、橙色、红色颜色?
  • 所以不是红色、绿色和蓝色,而是绿色、橙色和红色。
  • 我根据你的需要修改了代码,你可能需要编辑你的问题,因为将来任何人都会明白
  • 想通了!必须将 avgRGB 值除以 100,现在它工作得很好。非常感谢!
【解决方案2】:

这是我的一个想法:

func colorForNumber(number: Int) -> UIColor {
    let colorLevel = CGFloat(number % 256)
    switch (number / 256) {
    case 0:
        return UIColor(red: colorLevel , green: 0.0, blue: 0.0, alpha: 1.0)
    case 1:
        return UIColor(red: 0.0 , green: colorLevel, blue: 0.0, alpha: 1.0)
    default:
        return UIColor(red: 0.0 , green: 0.0, blue: colorLevel, alpha: 1.0)
    }
}

【讨论】:

  • 我一直在玩这个,但我不太清楚如何让它适应我的特殊情况。我的范围在 0 到 80 之间,RGB 颜色是 (255, 87, 29), (255, 148, 0), (0, 157, 29)。如果方便的话,可以将范围更改为 0 到 100。
  • 你能把范围改成0到767吗?
  • 是的,我只是乘以。
猜你喜欢
  • 2021-01-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-11-01
  • 2013-02-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多