我希望能够将任何UIColor转换为渐变色。我的想法是使用Core Graphics来绘制一个渐变。我想做的是获取一种颜色,比如:
[UIColor colorWithRed:0.5 green:0.5 blue:0.5 alpha:1.0];
如何获取一个颜色比原来深或浅几个阴影。有谁知道怎么做吗?谢谢。
我希望能够将任何UIColor转换为渐变色。我的想法是使用Core Graphics来绘制一个渐变。我想做的是获取一种颜色,比如:
[UIColor colorWithRed:0.5 green:0.5 blue:0.5 alpha:1.0];
如何获取一个颜色比原来深或浅几个阴影。有谁知道怎么做吗?谢谢。
如果你想让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
。
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()
}
}
我不确定您是否在寻找某种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];
[UIColor colorWithRed:0.8 green:0.32 blue:0.0 alpha:1.0];
这是你想要的效果吗?
Xcode 10中使用Swift 4.x进行iOS 12测试
从UIColor开始,选择一个降低亮度的因子(作为CGFloat)
let baseColor = UIColor.red
let darkenFactor: CGFloat = 2
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)
基于 @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()
}
}
- (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;
}
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
即可。
UIColor+Brightness.swift
的UIColor
扩展中,并具有可配置的亮度 - 请参见以下示例: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()
}
}
对于更暗的颜色,这是最简单的方法: theColor = [theColor shadowWithLevel:s]; //s:0.0到1.0