从UIColor获取稍微浅一些和稍微深一些的颜色

151

我希望能够将任何UIColor转换为渐变色。我的想法是使用Core Graphics来绘制一个渐变。我想做的是获取一种颜色,比如:

[UIColor colorWithRed:0.5 green:0.5 blue:0.5 alpha:1.0];

如何获取一个颜色比原来深或浅几个阴影。有谁知道怎么做吗?谢谢。


1
“渐变”意味着图像的一部分将成为某种颜色的阴影,而另一部分将成为更暗或更浅的阴影。这是您想要做的另一种定义方式吗? - Michael Dautermann
2
看一下这个库 https://github.com/yannickl/DynamicColor - onmyway133
Swift使用色相、饱和度和亮度 - Leo Dabus
19个回答

3

如果你想让user529758的解决方案适用于灰色调(例如[UIColor lightGrayColor][UIColor darkGrayColor]),你需要像这样进行改进:

- (UIColor *)lighterColor
{
    CGFloat h, s, b, a;
    if ([self getHue:&h saturation:&s brightness:&b alpha:&a]) {
        return [UIColor colorWithHue:h
                          saturation:s
                          brightness:MIN(b * 1.3, 1.0)
                               alpha:a];
    }

    CGFloat white, alpha;
    if ([self getWhite:&white alpha:&alpha]) {
        white = MIN(1.3*white, 1.0);
        return [UIColor colorWithWhite:white alpha:alpha];
    }

    return nil;
}

getHue:saturation:brightness:alpha在调用灰色阴影时会失败(并返回false),因此您需要使用getWhite:alpha


2

UIColor扩展和修复lighterColorForColor

extension UIColor {
  class func darkerColorForColor(color: UIColor) -> UIColor {
    var r:CGFloat = 0, g:CGFloat = 0, b:CGFloat = 0, a:CGFloat = 0
    if color.getRed(&r, green: &g, blue: &b, alpha: &a){
      return UIColor(red: max(r - 0.2, 0.0), green: max(g - 0.2, 0.0), blue: max(b - 0.2, 0.0), alpha: a)
    }
    return UIColor()
  }

  class func lighterColorForColor(color: UIColor) -> UIColor {
    var r:CGFloat = 0, g:CGFloat = 0, b:CGFloat = 0, a:CGFloat = 0
    if color.getRed(&r, green: &g, blue: &b, alpha: &a){
      let tmpColor = UIColor(red: min(r + 0.2, 1.0), green: min(g + 0.2, 1.0), blue: min(b + 0.2, 1.0), alpha: a)
      println(tmpColor)
      return tmpColor
    }
    return UIColor()
  }
}

1

我不确定您是否在寻找某种Objective-C答案,但基于RGBA指定的颜色工作方式,我认为您可以根据任意因素简单地缩放RGB值以获得“浅色”或“深色”阴影。例如,您可能有一个蓝色:

[UIColor colorWithRed:0.0 green:0.0 blue:1.0 alpha:1.0];

想要更深的蓝色吗?将RGB值乘以0.9:

[UIColor colorWithRed:0.0 green:0.0 blue:0.9 alpha:1.0];

看这里,或者你有一个橙子:

[UIColor colorWithRed:1.0 green:0.4 blue:0.0 alpha:1.0];

请选择另一个比例因子,例如0.8:
[UIColor colorWithRed:0.8 green:0.32 blue:0.0 alpha:1.0];

这是你想要的效果吗?


好的,是的,那是我需要的一半。如果蓝色为1(最大值),有没有办法得到一个更浅的颜色? - CoreCode
@CoreCode 不是的,除非你想改变设备屏幕的亮度 :) 请看我的回答。 - user529758

1

Xcode 10中使用Swift 4.x进行iOS 12测试

从UIColor开始,选择一个降低亮度的因子(作为CGFloat)

let baseColor = UIColor.red
let darkenFactor: CGFloat = 2

类型CGColor具有一个可选值components,它将颜色分解为RGBA(作为CGFloat数组,其值介于0和1之间)。然后,您可以使用从CGColor获取的RGBA值重构UIColor并操纵它们。
let darkenedBase = UIColor(displayP3Red: startColor.cgColor.components![0] / darkenFactor, green: startColor.cgColor.components![1] / darkenFactor, blue: startColor.cgColor.components![2] / darkenFactor, alpha: 1)

在这个例子中,RGB值每个都被除以2,使颜色变暗了一半。Alpha值保持不变,但你也可以将变暗因素应用于Alpha值而不是RGB值。

0

基于 @Sebyddd 的答案,一个基于 Swift 扩展:

import Foundation
import UIKit

extension UIColor{
    func colorWith(brightness: CGFloat) -> UIColor{
        var r:CGFloat = 0, g:CGFloat = 0, b:CGFloat = 0, a:CGFloat = 0

        if getRed(&r, green: &g, blue: &b, alpha: &a){
            return UIColor(red: max(r + brightness, 0.0), green: max(g + brightness, 0.0), blue: max(b + brightness, 0.0), alpha: a)
        }

        return UIColor()
    }
}

0
这里有一个UIColor类别,还允许对颜色变化的程度进行控制。
- (UIColor *)lighterColorWithDelta:(CGFloat)delta
{
    CGFloat r, g, b, a;
    if ([self getRed:&r green:&g blue:&b alpha:&a])
        return [UIColor colorWithRed:MIN(r + delta, 1.0)
                               green:MIN(g + delta, 1.0)
                                blue:MIN(b + delta, 1.0)
                               alpha:a];
    return nil;
}

- (UIColor *)darkerColorWithDelta:(CGFloat)delta
{
    CGFloat r, g, b, a;
    if ([self getRed:&r green:&g blue:&b alpha:&a])
        return [UIColor colorWithRed:MAX(r - delta, 0.0)
                               green:MAX(g - delta, 0.0)
                                blue:MAX(b - delta, 0.0)
                               alpha:a];
    return nil;
}

0
我根据状态值来渲染带有颜色的单元格。

status-images

为此,我编写了一个基于旧的Objective-C代码的Swift扩展,因为在使用CryingHippo的建议时出现了错误。
extension UIColor{

    func darker(darker: CGFloat) -> UIColor{

        var red: CGFloat = 0.0
        var green: CGFloat = 0.0
        var blue: CGFloat = 0.0

        if self.colorSpace == UIColorSpace.genericGrayColorSpace(){

            red =  whiteComponent - darker
            green = whiteComponent - darker
            blue  = whiteComponent - darker
        } else {
            red = redComponent - darker
            green = greenComponent - darker
            blue = blueComponent - darker
        }

        if red < 0{
            green += red/2
            blue += red/2
        }

        if green < 0{
            red += green/2
            blue += green/2
        }

        if blue < 0{
            green += blue/2
            red += blue/2
        }

        return UIColor(
            calibratedRed: red,
            green: green,
            blue: blue,
            alpha: alphaComponent
        )
    }

    func lighter(lighter: CGFloat) -> UIColor{
        return darker(-lighter)
    }
}

对于NSColor也是一样的。只需将UIColor替换为NSColor即可。


0
理想情况下,这些函数应该封装在一个名为UIColor+Brightness.swiftUIColor扩展中,并具有可配置的亮度 - 请参见以下示例:
import UIKit

extension UIColor {

  func lighterColorWithBrightnessFactor(brightnessFactor:CGFloat) -> UIColor {
    var r:CGFloat = 0, g:CGFloat = 0, b:CGFloat = 0, a:CGFloat = 0
    if self.getRed(&r, green:&g, blue:&b, alpha:&a) {
      return UIColor(red:min(r + brightnessFactor, 1.0),
        green:min(g + brightnessFactor, 1.0),
        blue:min(b + brightnessFactor, 1.0),
        alpha:a)
    }
    return UIColor()
  }

}

-1

对于更暗的颜色,这是最简单的方法: theColor = [theColor shadowWithLevel:s]; //s:0.0到1.0


这个方法只能在 NSColor 上使用,不能在 UIColor 上使用。 - followben

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接