Подтвердить что ты не робот

Как получить обратный цвет от UIColor?

например. Обратный цвет черного цвета должен быть белым.

4b9b3361

Ответ 1

---- РЕДАКТИРОВАТЬ ----

Основываясь на ответе @amleszk, я обновил расширение/категорию UIColor следующим способом:

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

    var white: CGFloat = 0.0
    if self.getWhite(&white, alpha: &alpha) {
        return UIColor(white: 1.0 - white, 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 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)
    }

    return self
}

// Objective-C
- (UIColor *)inverseColor {
    CGFloat alpha;

    CGFloat white;
    if ([self getWhite:&white alpha:&alpha]) {
        return [UIColor colorWithWhite:1.0 - white 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 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];
    }

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

Ответ 2

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

Ответ 3

Это должно работать:

// 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?

Ответ 4

Быстрый способ - расширить 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
    }
}

Ответ 5

Решение от GRC имеет проблему: CGColorGetComponents возвращает в масштабе 0.0-1.0, а не от 2-255. Поэтому вы должны использовать

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

вместо этого. Иначе все будет белым (1.0 и lager)

то же самое, что и amleszk, там также 1.-color, а не 255. Btw, что 1. представляет float 1.0, вы должны скорее ввести 1.0 вместо 1., чтобы избежать путаницы

Ответ 6

Поэтому, чтобы быть полезными для всех swifters пришли сюда, ища ответ - вот как это должно выглядеть в быстрой:

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

Ответ 7

Вы не получили обратные цвета для Серых. Таким образом, эффекты, когда вы используете серое заднее основание и его обратный цвет как цвет текста

ЭТО работает даже для серого цвета, я просто добавил дополнительный код в код @iWills.

//====== TO GET THE OPPOSIT COLORS =====
-(UIColor *)reverseColorOf :(UIColor *)oldColor
{
    CGColorRef oldCGColor = oldColor.CGColor;

    int numberOfComponents = CGColorGetNumberOfComponents(oldCGColor);
    // can not invert - the only component is the alpha
    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);

    //=====For the GRAY colors 'Middle level colors'
    CGFloat white = 0;
    [oldColor getWhite:&white alpha:nil];

    if(white>0.3 && white < 0.67)
    {
        if(white >= 0.5)
            newColor = [UIColor darkGrayColor];
        else if (white < 0.5)
            newColor = [UIColor blackColor];

    }
    return newColor;
}

Ответ 8

Я использовал ответ 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()

даст вам белый на черном ярлыке. Попробуйте другие цвета, и вы увидите интересные результаты:)

Возможно, это не то, что вы искали, но оно дает интересные результаты для цветов "Текст вперед/назад".

Просто поделитесь

Ответ 9

Быстрое решение, расширяющее UIColor для добавления вычисляемого свойства в inverted:

extension UIColor {
    var inverted: UIColor {
        var a: CGFloat = 0.0, r: CGFloat = 0.0, g: CGFloat = 0.0, b: CGFloat = 0.0
        return getRed(&r, green: &g, blue: &b, alpha: &a) ? UIColor(red: 1.0-r, green: 1.0-g, blue: 1.0-b, alpha: a) : .black
    }
}

Используйте на любом экземпляре UIColor (.red, .blue, .white и т.д.), Например:

view.backgroundColor = UIColor.blue.inverted //Results in yellow background
view.backgroundColor = UIColor.black.inverted //Results in white background