programing

UICollor에서 약간 더 밝은 색상과 어두운 색상으로 구현

codeshow 2023. 4. 12. 22:43
반응형

UICollor에서 약간 더 밝은 색상과 어두운 색상으로 구현

나는 어떤 UICollor도 경사면으로 바꿀 수 있기를 바랬다.제가 의도하는 방법은 코어 그래픽스를 사용하여 구배를 그리는 것입니다.제가 하려는 것은 색을 얻는 것입니다. 예를 들어 다음과 같습니다.

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

어두운 색상과 밝은 색상의 UICollor를 구입합니다.이거 할 줄 아는 사람 있어요?감사해요.

- (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가 지적한 바와 같이 유연성을 최대한 높이기 위해 이러한 방법을 UICollor 카테고리로 구현해야 합니다.또, @Rily의 아이디어에서는, 일정한 값을 더하거나 빼는 대신에, 색을 미리 어둡게 하거나 밝게 하는 것이 좋을지도 모릅니다.@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 솔루션은 브릿니스 스케일의 가장자리에 색상을 더 가깝게 만듭니다.이것은 기본적으로 검은색에서 시작하여 순수한 색상으로 끝납니다.

기본적으로 밝기(값)는 색상을 검은색에 더 가깝게 만듭니다. 채도는 색상을 흰색에 더 적게 또는 더 가깝게 만듭니다.

아래 그림과 같이:

HSV 컬러 그래프

따라서 실제로 색을 밝게 하는 솔루션(즉, 흰색에 가까운 것)은 채도값을 작게 하는 것입니다.그 결과, 다음과 같은 솔루션이 실현됩니다.

- (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;
}

get사용하여 iOS 및 OS X를 위한 신속한 범용 확장색상:

#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%의 색을 칠하여 어둡게 하는 것

따라서 AFAIK는 그라데이션 크기의 x%에서 'color to white' 또는 'color to black'으로 색상을 선택하는 것과 동일한 결과를 얻을 수 있습니다.

이를 위해 계산은 간단하다.

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
        )
    }
}

여기 몇 가지 색상의 예가 있습니다.

더 어둡고 밝은 예

사용자 529758의 Swift 솔루션:

어두운 색:

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 = 0.0(검은색)에서 L = 0.5(자연색)에서 L = 1.0(흰색)까지 L = 밝기 성분을 변경할 수 있습니다.UIColor는 HSL을할 수 RGB 이 있습니다.「 HSL 」는, RGB<->HSL >는 HSL을 변환합니다.

이 스레드의 다른 모든 답변은 RGB 컬러 시스템을 사용하거나 HSB 시스템의 색상 또는 밝기 값을 단순히 변경합니다.훌륭한 블로그 투고에서 자세히 설명한 바와 같이 색상을 밝게 또는 어둡게 하는 올바른 방법은 색상을 변경하는 것입니다.luminance다른 대답들은 그렇지 않아요제대로 하고 싶다면 내 해결책을 쓰거나 블로그 게시물을 읽고 직접 글을 쓰세요.


안타깝게도 기본적으로 UICollor의 속성을 변경하는 것은 매우 번거로운 일입니다.또한 애플은 HCL과 같은 LAB 기반의 컬러 공간도 지원하지 않습니다.UIColor(클래스)L는 LAB입니다.luminance★★★★★★★★★★★★★★★★★★★★★★★」

핸디 사용UIKit(Karto 경유로 설치)는 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)

Handy에 주의해 주세요.UIKit은 프로젝트에 다른 편리한 UI 기능도 추가하였습니다.자세한 내용은 GitHub에서 README를 확인하십시오.

도움이 됐으면 좋겠네요!

면책사항:저는 핸디의 작가입니다.UIKit.

투고된 솔루션 중 어느 것도 모든 색상과 색조에 대해 효과가 있는 것은 아니지만, UICollor에 매우 잘 구현된 확장 기능을 제공하는 이 라이브러리를 우연히 발견했습니다.

있습니다.HSL은 HSL을 구현하고 있습니다.(UIColor *)lighten:(CGFloat)amount딱. - 딱 들어맞다.

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()

스위프트 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
     }
   }
}

음영: "529758:[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 확장 및 고정 라이트 Color For Color

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];

다른 척도 요인(0.8):

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

그게 당신이 찾고 있는 효과인가요?

iOS 12용 Swift 4.x에서 Xcode 10으로 테스트 완료

UIColor 색상부터 시작하여 감광 요인(CG Float)을 선택합니다.

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

CGCollor 유형에 옵션 값이 있습니다.components이는 색상을 RGBA로 분해합니다(값이 0 ~1인 CGFloat 배열).그런 다음 CGCollor에서 가져온 RGBA 값을 사용하여 UICollor를 재구성하고 조작할 수 있습니다.

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로 분할되어 색이 이전과 같이 절반으로 어두워졌습니다.알파 값은 그대로 유지되지만 RGB가 아닌 알파 값에 어두운 계수를 적용할 수도 있습니다.

이상적으로는 이 함수는 capsulation의 내부로 캡슐화되어 있어야 합니다.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.

색상의 변화량도 제어할 수 있는 UICollor 카테고리가 여기에 있습니다.

- (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;
}

@Sebydd 응답을 기반으로 한 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()
    }
}

어두운 색상의 경우 가장 간단합니다. 색상 = [the Color shadowWithLevel:s]; //s:0.0 ~ 1.0

언급URL : https://stackoverflow.com/questions/11598043/get-slightly-lighter-and-darker-color-from-uicolor

반응형