UIColor를 그라디언트로 바꿀 수 있기를 원했습니다. 내가하려고하는 방식은 Core Graphics를 사용하여 그라디언트를 그리는 것입니다. 내가하려고하는 것은 색상을 얻는 것입니다.
[UIColor colorWithRed:0.5 green:0.5 blue:0.5 alpha:1.0];
그리고 몇 가지 색조가 더 어둡고 몇 가지 색조가 더 밝은 UIColor를 얻습니다. 누구든지 이것을하는 방법을 알고 있습니까? 감사합니다.
답변
- (UIColor *)lighterColorForColor:(UIColor *)c
{
CGFloat r, g, b, a;
if ([c getRed:&r green:&g blue:&b alpha:&a])
return [UIColor colorWithRed:MIN(r + 0.2, 1.0)
green:MIN(g + 0.2, 1.0)
blue:MIN(b + 0.2, 1.0)
alpha:a];
return nil;
}
- (UIColor *)darkerColorForColor:(UIColor *)c
{
CGFloat r, g, b, a;
if ([c getRed:&r green:&g blue:&b alpha:&a])
return [UIColor colorWithRed:MAX(r - 0.2, 0.0)
green:MAX(g - 0.2, 0.0)
blue:MAX(b - 0.2, 0.0)
alpha:a];
return nil;
}
다음과 같이 사용하십시오.
UIColor *baseColor = // however you obtain your color
UIColor *lighterColor = [self lighterColorForColor:baseColor];
UIColor *darkerColor = [self darkerColorForColor:baseColor];
편집 : @Anchu Chimala가 지적했듯이 최대한의 유연성을 위해 이러한 메서드는 UIColor 범주로 구현해야합니다. 또한 @Riley의 아이디어에서 상수 값을 더하거나 빼는 대신 색상을 비례 적으로 더 어둡거나 밝게 만드는 것이 좋습니다. @jrturton이 지적했듯이 RGB 구성 요소를 조작 할 필요는 없습니다. 밝기 속성 자체를 수정하는 것이 좋습니다. 전체적으로 :
@implementation UIColor (LightAndDark)
- (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];
return nil;
}
- (UIColor *)darkerColor
{
CGFloat h, s, b, a;
if ([self getHue:&h saturation:&s brightness:&b alpha:&a])
return [UIColor colorWithHue:h
saturation:s
brightness:b * 0.75
alpha:a];
return nil;
}
@end
답변
TL; DR :
빠른:
extension UIColor {
var lighterColor: UIColor {
return lighterColor(removeSaturation: 0.5, resultAlpha: -1)
}
func lighterColor(removeSaturation val: CGFloat, resultAlpha alpha: CGFloat) -> UIColor {
var h: CGFloat = 0, s: CGFloat = 0
var b: CGFloat = 0, a: CGFloat = 0
guard getHue(&h, saturation: &s, brightness: &b, alpha: &a)
else {return self}
return UIColor(hue: h,
saturation: max(s - val, 0.0),
brightness: b,
alpha: alpha == -1 ? a : alpha)
}
}
용법:
let lightColor = somethingDark.lighterColor
목표 -C :
- (UIColor *)lighterColorRemoveSaturation:(CGFloat)removeS
resultAlpha:(CGFloat)alpha {
CGFloat h,s,b,a;
if ([self getHue:&h saturation:&s brightness:&b alpha:&a]) {
return [UIColor colorWithHue:h
saturation:MAX(s - removeS, 0.0)
brightness:b
alpha:alpha == -1? a:alpha];
}
return nil;
}
- (UIColor *)lighterColor {
return [self lighterColorRemoveSaturation:0.5
resultAlpha:-1];
}
@rchampourlier는 @ user529758에 대한 그의 의견에 옳았습니다 (허용 된 답변)-HSB (또는 HSV) 및 RGB 솔루션은 완전히 다른 결과를 제공합니다. RGB는 단지 흰색을 추가하거나 (또는 색상을 더 가깝게 만듭니다) HSB 솔루션은 Brigtness 스케일의 가장자리에 더 가깝게 색상을 가져옵니다. 기본적으로 검은 색으로 시작하고 순수한 색상으로 끝납니다 …
기본적으로 밝기 (값)는 색상을 검은 색에 가깝게 또는 더 가깝게 만들고 채도는 흰색에 가깝거나 더 가깝게 만듭니다 …
여기에서 볼 수 있듯이 :
따라서 실제로 색상을 더 밝게 (즉, 흰색에 더 가깝게) 만드는 솔루션 은 채도 값을 더 작게 만들어이 솔루션 을 만듭니다 .
- (UIColor *)lighterColor {
CGFloat h,s,b,a;
if ([self getHue:&h saturation:&s brightness:&b alpha:&a]) {
return [UIColor colorWithHue:h
saturation:MAX(s - 0.3, 0.0)
brightness:b /*MIN(b * 1.3, 1.0)*/
alpha:a];
}
return nil;
}
답변
getHue를 사용하여 iOS 및 OS X 용 Swift 범용 확장 :
#if os(OSX)
import Cocoa
public typealias PXColor = NSColor
#else
import UIKit
public typealias PXColor = UIColor
#endif
extension PXColor {
func lighter(amount : CGFloat = 0.25) -> PXColor {
return hueColorWithBrightnessAmount(1 + amount)
}
func darker(amount : CGFloat = 0.25) -> PXColor {
return hueColorWithBrightnessAmount(1 - amount)
}
private func hueColorWithBrightnessAmount(amount: CGFloat) -> PXColor {
var hue : CGFloat = 0
var saturation : CGFloat = 0
var brightness : CGFloat = 0
var alpha : CGFloat = 0
#if os(iOS)
if getHue(&hue, saturation: &saturation, brightness: &brightness, alpha: &alpha) {
return PXColor( hue: hue,
saturation: saturation,
brightness: brightness * amount,
alpha: alpha )
} else {
return self
}
#else
getHue(&hue, saturation: &saturation, brightness: &brightness, alpha: &alpha)
return PXColor( hue: hue,
saturation: saturation,
brightness: brightness * amount,
alpha: alpha )
#endif
}
}
사용법 :
let color = UIColor(red: 0.5, green: 0.8, blue: 0.8, alpha: 1.0)
color.lighter(amount:0.5)
color.darker(amount:0.5)
OR (기본값) :
color.lighter()
color.darker()
샘플 :
답변
RGB와 동일한 결과를 원했습니다.
- 흰색 배경 위에 알파 x %로 색상을 배치하여 밝게
- 검정색 배경 위에 알파 x %로 색상을 배치하여 어둡게
그래디언트 크기의 x %에서 ‘컬러 투 화이트’또는 ‘컬러 투 블랙’그라디언트에서 색상을 선택하는 것과 동일한 결과 인 AFAIK를 제공합니다.
이를 위해 수학은 간단합니다.
extension UIColor {
func mix(with color: UIColor, amount: CGFloat) -> UIColor {
var red1: CGFloat = 0
var green1: CGFloat = 0
var blue1: CGFloat = 0
var alpha1: CGFloat = 0
var red2: CGFloat = 0
var green2: CGFloat = 0
var blue2: CGFloat = 0
var alpha2: CGFloat = 0
getRed(&red1, green: &green1, blue: &blue1, alpha: &alpha1)
color.getRed(&red2, green: &green2, blue: &blue2, alpha: &alpha2)
return UIColor(
red: red1 * (1.0 - amount) + red2 * amount,
green: green1 * (1.0 - amount) + green2 * amount,
blue: blue1 * (1.0 - amount) + blue2 * amount,
alpha: alpha1
)
}
}
다음은 일부 색상의 예입니다
답변
스위프트에서의 user529758의 솔루션 :
어두운 색 :
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()
}
밝은 색 :
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){
return UIColor(red: min(r + 0.2, 1.0), green: min(g + 0.2, 1.0), blue: min(b + 0.2, 1.0), alpha: a)
}
return UIColor()
}
답변
RGB 색상을 HSL 색상 모델 로 변환하면 L = 밝기 구성 요소를 L = 0.0 (검정)에서 L = 0.5 (자연 색상) 이상 L = 1.0 (흰색)으로 변경할 수 있습니다. UIColor
HSL을 직접 처리 할 수 없지만 RGB <-> HSL을 변환하는 공식이 있습니다.
답변
솔루션의 아무도는 게시 된 아주 모든 색상과 음영을 위해 일하지,하지만 난 운 좋게 발견 한 이 라이브러리 UIColor에 아주 잘 구현 확장 세트를 제공합니다.
특히 HSL 구현의 일부로 밝게 기능합니다 (UIColor *)lighten:(CGFloat)amount
.-완벽하게 작동합니다.