148

任意の UIColor をグラデーションに変換できるようにしたいと考えていました。これを行う方法は、Core Graphics を使用してグラデーションを描画することです。私がやろうとしているのは、色を取得することです。

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

いくつかの色合いが暗く、いくつかの色合いが明るい UIColor を取得します。誰もこれを行う方法を知っていますか? ありがとうございました。

4

19 に答える 19

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

EDIT : @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
于 2012-07-22T06:11:43.357 に答える
59

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;
}
于 2014-04-16T21:42:26.427 に答える
34

RGBで同じ結果を出したかっただけです

  • 白い背景の上にアルファ x% の色を配置して明るくする
  • 黒の背景の上にアルファ x% の色を配置して暗くする

グラデーションサイズのx%で、グラデーション「白から黒への色」または「黒への色」で色を選択するよりも、同じ結果が得られます。

そのための計算は簡単です。

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

ここにいくつかの色の例があります

例 より暗く、より明るく

于 2016-03-11T21:20:27.153 に答える
24

Swift での 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()
}
于 2014-12-09T19:53:24.307 に答える
14

RGBカラーをHSLカラーモデルに変換する場合、L=明度成分をL= 0.0(黒)からL = 0.5(自然色)からL = 1.0(白)に変更できます。UIColorHSLを直接処理することはできませんが、RGB<->HSLを変換するための式があります。

于 2012-07-22T06:39:16.593 に答える
6

投稿されたソリューションはどれも、すべての色と色合いでうまく機能しませんでしたが、UIColor に非常によく実装された一連の拡張機能を提供するこのライブラリに出くわしました。

具体的には、HSL 実装の一部として軽量化機能があり(UIColor *)lighten:(CGFloat)amountます。これは完全に機能します。

于 2014-11-19T23:47:44.457 に答える
2

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()
  }
}
于 2015-02-27T14:07:58.023 に答える
1

ある種の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];

それはあなたが探しているような効果ですか?

于 2012-07-22T06:10:31.890 に答える
0

ステータス値に基づいて色付きのセルをレンダリングします。

ステータス画像

このために、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です。

于 2016-01-29T18:39:28.093 に答える
0

理想的には、関数は と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()
  }

}
于 2015-05-14T06:48:02.810 に答える
0

これは、色の変化量も制御できる 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;
}
于 2017-12-02T02:45:00.680 に答える