UIColor를 그라디언트로 바꿀 수 있기를 원했습니다. 내가하려고하는 방식은 Core Graphics를 사용하여 그라디언트를 그리는 것입니다. 내가하려고하는 것은 색상을 얻는 것입니다.
[UIColor colorWithRed:0.5 green:0.5 blue:0.5 alpha:1.0];
그리고 몇 가지 색조가 더 어둡고 몇 가지 색조가 더 밝은 UIColor를 얻습니다. 누구든지 이것을하는 방법을 알고 있습니까? 감사합니다.
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
getHue:saturation:brightness
UIKit 의 서명 에도 불구하고 HSB 대신 HSV에서 작동하는 것 같습니다. 이 컨텍스트에서 밝기 (실제로 값)를 변경하면 작동하지 않습니다. 예를 들어 순수한 빨강 (rgb (255,0,0))은 밝기 / 값이 1이므로 밝기를 통한 조명이 불가능합니다. 대신 RGB 값을 변경하여 작업했습니다.
getHue:saturation:brightness:alpha
FALSE를 반환합니다.
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
- (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()
샘플 :
let color = usingColorSpaceName(NSCalibratedRGBColorSpace)
다음 을 추가하여 문제를 해결 한 다음 getHue
통화를 색상 통화로 교체합니다 .color?.getHue(&hue, saturation: &saturation, brightness: &brightness, alpha: &alpha)
_
단어 양 앞에 함수가 누락되었습니다 . private func hueColorWithBrightnessAmount(_ amount: CGFloat) -> PXColor {
RGB와 동일한 결과를 원했습니다.
그래디언트 크기의 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()
}
var darker: UIColor
예를 들어 UIColor 클래스의 확장으로 선언 된 것이 더 편리하다는 것을 제외하고는 좋은 대답 입니다.
RGB 색상을 HSL 색상 모델 로 변환하면 L = 밝기 구성 요소를 L = 0.0 (검정)에서 L = 0.5 (자연 색상) 이상 L = 1.0 (흰색)으로 변경할 수 있습니다. UIColor
HSL을 직접 처리 할 수 없지만 RGB <-> HSL을 변환하는 공식이 있습니다.
Sebyddd
확장으로서의 솔루션 :
extension UIColor {
func darker() -> 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: 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 lighter() -> 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 + 0.2, 1.0), green: min(g + 0.2, 1.0), blue: min(b + 0.2, 1.0), alpha: a)
}
return UIColor()
}
}
용법:
let darkerYellow = UIColor.yellow.darker()
let lighterYellow = UIColor.yellow.lighter()
당신은 같은 회색 음영 작업 (에 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 확장 및 고정 라이터
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()
}
}
이 스레드의 다른 모든 답변 은 RGB 색상 시스템을 사용 하거나 HSB 시스템 의 색조 또는 밝기 값을 간단히 변경합니다 . 에서 자세히 설명한 바와 같이 이 위대한 블로그 게시 정확한 색상이 밝거나 어둡게은 변경하는 것입니다 만드는 방법 luminance
값입니다. 다른 답변은 없습니다. 제대로하고 싶다면 블로그 게시물을 읽은 후 내 솔루션 을 사용 하거나 직접 작성하십시오 .
불행히도 기본적으로 UIColor의 속성을 변경하는 것은 상당히 번거 롭습니다 . 또한 Apple은 클래스의 HCL과 같은 LAB 기반 색 공간도 지원하지 않습니다 ( LAB는 우리가 찾고 있는 가치입니다).UIColor
L
luminance
HandyUIKit (Carthage를 통해 설치)을 사용하면 HCL에 대한 지원이 추가 되고 인생 이 훨씬 쉬워집니다 .
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)
상대 변경 을 적용하는 옵션도 있습니다 (권장).
// create a new UIColor object with slightly darker color
color.change(.luminance, by: -0.2)
HandyUIKit은 프로젝트에 다른 편리한 UI 기능 도 추가합니다 . 자세한 내용 은 GitHub 의 README 를 확인하십시오.
도움이 되길 바랍니다!
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];
당신이 찾고있는 그런 종류의 효과입니까?
iOS 12 용 Swift 4.x로 Xcode 10에서 테스트
색상으로 UIColor로 시작하고 어둡게하는 요소 (CGFloat로)를 선택하십시오.
let baseColor = UIColor.red
let darkenFactor: CGFloat = 2
CGColor 유형에는 components
RGBA로 색상을 세분화 하는 선택적 값 이 있습니다 (0과 1 사이의 값을 갖는 CGFloat 배열로). 그런 다음 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 valuse를 각각 2로 나눠서 이전보다 절반 정도 어둡게 만들었습니다. 알파 값은 동일하게 유지되었지만 RGB 대신 알파 값에 더 어두운 요소를 적용 할 수도 있습니다.
스위프트 5
extension UIColor {
func lighter(by percentage:CGFloat=30.0) -> UIColor? {
return self.adjust(by: abs(percentage) )
}
func darker(by percentage:CGFloat=30.0) -> UIColor? {
return self.adjust(by: -1 * abs(percentage) )
}
func adjust(by percentage:CGFloat=30.0) -> 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 + percentage/100, 1.0),
green: min(g + percentage/100, 1.0),
blue: min(b + percentage/100, 1.0),
alpha: a)
}else{
return nil
}
}
}
이상적으로는 함수가 UIColor
확장명 안에 캡슐화 UIColor+Brightness.swift
되고 구성 가능한 밝기가 있어야합니다 (아래 예 참조).
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()
}
}
상태 값을 기준으로 컬러 셀을 렌더링합니다.
이를 위해 CryingHippo의 제안을 사용하여 오류가 발생한 후 오래된 objc 코드를 기반으로 신속한 확장 기능을 작성했습니다.
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 범주입니다.
- (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;
}
@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()
}
}