27

例: 黒の反転色は白にする必要があります。

4

10 に答える 10

36

- - 編集 - -

@amleszkの回答に基づいて、UIColor拡張機能/カテゴリを次のメソッドで更新しました。

迅速

func inverseColor() -> UIColor {
    var alpha: CGFloat = 1.0

    var red: CGFloat = 0.0, green: CGFloat = 0.0, blue: CGFloat = 0.0
    if self.getRed(&red, green: &green, blue: &blue, alpha: &alpha) {
        return UIColor(red: 1.0 - red, green: 1.0 - green, blue: 1.0 - blue, alpha: alpha)
    }

    var hue: CGFloat = 0.0, saturation: CGFloat = 0.0, brightness: CGFloat = 0.0
    if self.getHue(&hue, saturation: &saturation, brightness: &brightness, alpha: &alpha) {
        return UIColor(hue: 1.0 - hue, saturation: 1.0 - saturation, brightness: 1.0 - brightness, alpha: alpha)
    }

    var white: CGFloat = 0.0
    if self.getWhite(&white, alpha: &alpha) {
        return UIColor(white: 1.0 - white, alpha: alpha)
    }

    return self
}

Objective-C

- (UIColor *)inverseColor {
    CGFloat alpha;

    CGFloat red, green, blue;
    if ([self getRed:&red green:&green blue:&blue alpha:&alpha]) {
        return [UIColor colorWithRed:1.0 - red green:1.0 - green blue:1.0 - blue alpha:alpha];
    }

    CGFloat hue, saturation, brightness;
    if ([self getHue:&hue saturation:&saturation brightness:&brightness alpha:&alpha]) {
        return [UIColor colorWithHue:1.0 - hue saturation:1.0 - saturation brightness:1.0 - brightness alpha:alpha];
    }

    CGFloat white;
    if ([self getWhite:&white alpha:&alpha]) {
        return [UIColor colorWithWhite:1.0 - white alpha:alpha];
    }

    return nil;
}

----非推奨----

@grcの回答に基づいて、次のメソッドを使用してUIColorカテゴリを作成します。

- (UIColor *)inverseColor {

    CGColorRef oldCGColor = self.CGColor;

    int numberOfComponents = CGColorGetNumberOfComponents(oldCGColor);

    // can not invert - the only component is the alpha
    // e.g. self == [UIColor groupTableViewBackgroundColor]
    if (numberOfComponents == 1) {
        return [UIColor colorWithCGColor:oldCGColor];
    }

    const CGFloat *oldComponentColors = CGColorGetComponents(oldCGColor);
    CGFloat newComponentColors[numberOfComponents];

    int i = numberOfComponents - 1;
    newComponentColors[i] = oldComponentColors[i]; // alpha
    while (--i >= 0) {
        newComponentColors[i] = 1 - oldComponentColors[i];
    }

    CGColorRef newCGColor = CGColorCreate(CGColorGetColorSpace(oldCGColor), newComponentColors);
    UIColor *newColor = [UIColor colorWithCGColor:newCGColor];
    CGColorRelease(newCGColor);

    return newColor;
}
于 2011-05-05T17:08:50.657 に答える
29

iOS5 +

-(UIColor*) inverseColor
{
    CGFloat r,g,b,a;
    [self getRed:&r green:&g blue:&b alpha:&a];
    return [UIColor colorWithRed:1.-r green:1.-g blue:1.-b alpha:a];
}
于 2013-01-08T14:59:34.780 に答える
25

これはうまくいくはずです:

// oldColor is the UIColor to invert
const CGFloat *componentColors = CGColorGetComponents(oldColor.CGColor);

UIColor *newColor = [[UIColor alloc] initWithRed:(1.0 - componentColors[0])
                                           green:(1.0 - componentColors[1])
                                            blue:(1.0 - componentColors[2])
                                           alpha:componentColors[3]];

ソース: UIColor が暗いか明るいかを確認しますか?

于 2011-05-05T06:16:45.530 に答える
15

迅速な方法は、UIColor を拡張することです。

extension UIColor {
    func inverse () -> UIColor {
        var r:CGFloat = 0.0; var g:CGFloat = 0.0; var b:CGFloat = 0.0; var a:CGFloat = 0.0;
        if self.getRed(&r, green: &g, blue: &b, alpha: &a) {
            return UIColor(red: 1.0-r, green: 1.0 - g, blue: 1.0 - b, alpha: a)
        }
        return .black // Return a default colour
    }
}
于 2014-11-16T09:48:23.293 に答える
7

GRC のソリューションには問題があります。CGColorGetComponents は、2 ~ 255 ではなく、0.0 ~ 1.0 のスケールで返されます。だからあなたは使うべきです

UIColor *newColor = [[UIColor alloc] initWithRed:(1.0 - componentColors[0])
                                           green:(1.0 - componentColors[1])
                                            blue:(1.0 - componentColors[2])
                                           alpha:componentColors[3]];

代わりは。それ以外の場合はすべて白になります (1.0 以降)

amleszk が使用したものと同じようなもので、255 の代わりに 1.-color もあります。ところで、1. は float 1.0 を表します。混乱を避けるために、1. ではなく 1.0 を入力する必要があります。

于 2013-01-18T18:18:36.047 に答える
2

したがって、すべてのスイフターが答えを探してここに来た場合に役立つように-これは、スウィフトでどのように見えるかです:

func inverseColor(color: UIColor) -> UIColor{
    var a: CGFloat = 0.0; var r: CGFloat = 0.0; var g: CGFloat = 0.0; var b: CGFloat = 0.0;
    color.getRed(&r, green: &g, blue: &b, alpha: &a);
    return UIColor(red: -r, green: -g, blue: -b, alpha: a);
}
于 2015-01-29T15:33:08.120 に答える
2

背景色を指定してテキストの前景色を計算する良い方法を探していたので、Dadeの答えを使用して少し調整しました。

したがって、特定の背景色に対して適切なテキスト色を取得したい場合は、これを行うことをお勧めします。指定された背景色の最も明るい色を提供します。

extension UIColor {
    func maxBright() -> UIColor {
        var r:CGFloat = 0.0; var g:CGFloat = 0.0; var b:CGFloat = 0.0; var a:CGFloat = 0.0;
        if self.getRed(&r, green: &g, blue: &b, alpha: &a) {
            let d:CGFloat = 1.0 - max(r,g,b)
            return UIColor(red: r + d, green: g + d , blue: b + d, alpha: 1.0)

        }
        return self
    }
}

最も明るいコンポーネントが最大になるまで、RGB スライダーを上にスライドさせるように機能します。

例:

titleLable.backgroundColor = UIColor.blackColor()
titleLabel.textColor = titleLabel.backgroundColor?.maxBright()

黒地に白のラベルが表示されます。他の色を試してみると、興味深い結果が得られます :)

これはあなたが探していたものではないかもしれませんが、テキストの前後の色について興味深い結果が得られます。

共有するだけ

于 2016-09-10T05:01:13.713 に答える