UIColor *baseColor = // however you obtain your color
UIColor *lighterColor = [self lighterColorForColor:baseColor];
UIColor *darkerColor = [self darkerColorForColor:baseColor];
EDIT :正如@Anchu Chimala所指出的,为了获得最大的灵活性,这些方法应该作为UIColor类实现 . 另外,@ Riley 's idea, it may be a better idea to make the color proprtionally darker or lighter instead of adding or subtracting constant values. As @jrturton pointed out, it'不需要操纵RGB组件;最好修改亮度属性本身 . 总而言之:
此主题中的所有其他答案都使用 either the RGB color system 或只是更改 hue or brightness value of the HSB system . 正如this great blog post中详细解释的那样,使颜色变浅或变暗的正确方法是更改其 luminance 值 . 没有其他答案那样做 . 如果你想做得对,那么在阅读博客文章后 use my solution 或 write your own .
不幸的是,改变UIColor by default 的任何属性都是 quite a hassle . 此外,Apple甚至不支持 UIColor 类中任何基于LAB的色彩空间,如HCL(LAB中的 L 是我们正在寻找的 luminance 值) .
使用 HandyUIKit (通过Carthage安装)增加了对 HCL 的支持并使你的生活 a lot easier :
import HandyUIKit
let color = UIColor(red: 0.5, green: 0.5, blue: 0.5, alpha: 1.0)
// create a new UIColor object with a specific luminance (slightly lighter)
color.change(.luminance, to: 0.7)
还可以选择应用 relative change (推荐):
// create a new UIColor object with slightly darker color
color.change(.luminance, by: -0.2)
请注意,HandyUIKit还会在项目中添加 some other handy UI features - 有关详细信息,请查看README on GitHub .
17 回答
像这样用它:
EDIT :正如@Anchu Chimala所指出的,为了获得最大的灵活性,这些方法应该作为UIColor类实现 . 另外,@ Riley 's idea, it may be a better idea to make the color proprtionally darker or lighter instead of adding or subtracting constant values. As @jrturton pointed out, it'不需要操纵RGB组件;最好修改亮度属性本身 . 总而言之:
TL; DR:
斯威夫特:
用法:
Objective-C:
@rchampourlier对@ user529758的评论是正确的(接受的答案) - HSB(或HSV)和RGB解决方案给出了完全不同的结果 . RGB只是增加(或使颜色更接近)白色,而HSB解决方案使颜色更接近Brigtness量表的边缘 - 基本上以黑色开始,以纯色结束......
基本上亮度(值)使颜色更接近或更接近黑色,其中饱和度使其更接近白色...
如下所示:
因此,使颜色实际上更亮(即更接近白色......)的解决方案是使其饱和度值 smaller ,从而得到此解决方案:
Swift iOS and OS X 的通用扩展名,使用 getHue :
用法:
或(使用默认值):
样品:
user529758在Swift中的解决方案:
颜色较深:
更浅的颜色:
我只想在RGB中给出相同的结果
将alpha x%的颜色放在白色背景上以减轻亮度
将带有alpha x%的颜色放在黑色背景上以使其变暗
其结果与AFAIK相同,而不是以渐变“颜色变为白色”或“颜色变为黑色”,以渐变大小的x%选择颜色 .
为此,数学很简单:
Here are examples with some colors
如果将RGB颜色转换为HSL color model,则可以将L =亮度分量从L = 0.0(黑色)变为L = 0.5(自然色)到L = 1.0(白色) .
UIColor
不能直接处理HSL,但有转换RGB < - > HSL的公式 .所有解决方案都没有适用于所有颜色和阴影,但随后我偶然发现了this library,它为UIColor提供了一套非常好的实现扩展 .
具体来说,它具有减轻功能,作为其HSL实现的一部分:
(UIColor *)lighten:(CGFloat)amount
- 完美运行 .如果您希望user529758的解决方案使用灰色阴影(例如
[UIColor lightGrayColor]
或[UIColor darkGrayColor]
,您必须改进它:getHue:saturation:brightness:alpha
在灰色阴影上调用时失败(并返回false
),因此您需要使用getWhite:alpha
.UIColor扩展和修复lighterColorForColor
Sebyddd solution as an extension:
Usage:
我不确定你是否正在寻找某种Objective-C答案,但根据RGBA指定的颜色如何工作,我认为你可以根据任意因素简单地缩放RGB值以获得“更轻”或“阴暗”的阴影 . 例如,您可能有一个蓝色:
想要更深的蓝色?将RGB值乘以0.9:
瞧 . 或许你有橙色:
选择另一个比例因子,比如0.8:
这是你正在寻找的那种效果吗?
此主题中的所有其他答案都使用 either the RGB color system 或只是更改 hue or brightness value of the HSB system . 正如this great blog post中详细解释的那样,使颜色变浅或变暗的正确方法是更改其
luminance
值 . 没有其他答案那样做 . 如果你想做得对,那么在阅读博客文章后 use my solution 或 write your own .不幸的是,改变UIColor by default 的任何属性都是 quite a hassle . 此外,Apple甚至不支持
UIColor
类中任何基于LAB的色彩空间,如HCL(LAB中的L
是我们正在寻找的luminance
值) .使用 HandyUIKit (通过Carthage安装)增加了对 HCL 的支持并使你的生活 a lot easier :
还可以选择应用 relative change (推荐):
请注意,HandyUIKit还会在项目中添加 some other handy UI features - 有关详细信息,请查看README on GitHub .
我希望它有所帮助!
理想情况下,函数应封装在名为
UIColor+Brightness.swift
的UIColor
扩展中,并具有可配置的亮度 - 请参见下面的示例:我根据状态值渲染彩色单元格:
为此我在使用CryingHippo的建议收到错误后,根据一些旧的objc代码写了一个swift扩展:
NSColor
的作用相同同样 . 只需将UIColor
替换为NSColor
即可 .这是一个UIColor类别,它还允许控制颜色变化量 .
A Swift extension based on @Sebyddd answer:
Tested in Xcode 10 with Swift 4.x for iOS 12
从你的颜色开始作为UIColor并选择变暗因子(作为CGFloat)
CGColor类型具有可选值
components
,它将颜色分解为RGBA(作为CGFloat数组,其值介于0和1之间) . 然后,您可以使用从CGColor中获取的RGBA值重建UIColor并对其进行操作 .在这个例子中,每个RGB值被除以2,使得颜色一半变暗 . alpha值保持不变,但您可以选择将暗因子应用于alpha值而不是RGB .