Domanda Come ottenere il colore inverso da UIColor?


per esempio. Il colore inverso dal nero dovrebbe essere bianco.


19
2018-05-05 05:56


origine


risposte:


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

27
2018-01-08 14:59



Questo dovrebbe funzionare:

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

Fonte: Controlla se UIColor è scuro o luminoso?


23
2018-05-05 06:16



---- MODIFICARE ----

Sulla base della risposta di @ amleszk, ho aggiornato la categoria UIColor con questo metodo:

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

---- DEPRECATED ----

In base alla risposta di @grc, creo una categoria UIColor con questo metodo:

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

21
2018-05-05 17:08



Il modo rapido è di estendere 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
    }
}

11
2017-11-16 09:48



La soluzione di GRC presenta un problema: CGColorGetComponents restituisce una scala di 0.0-1.0 e non di 2-255. Quindi dovresti usare

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

anziché. Altrimenti tutto sarà bianco (1.0 e lager)

come la stessa cosa usata da amleszk, c'è anche 1.-color, invece di 255. A parte 1. che rappresenta il float 1.0, dovresti invece digitare 1.0 invece di 1., per evitare confusione


7
2018-01-18 18:18



Quindi, per essere d'aiuto, tutti gli swifters sono venuti qui a cercare la risposta: ecco come dovrebbe apparire in swift:

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

2
2018-01-29 15:33



Non hai ottenuto colori inversi per Gray .. Quindi effetti quando si usa il terreno grigio e il suo colore inverso come colore del testo

QUESTO Funziona anche per il colore grigio, ho appena aggiunto del codice aggiuntivo al codice @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;
}

1
2017-11-04 12:01



Ho usato la risposta di Dade e l'ho ottimizzata un po 'perché stavo cercando un modo piacevole per calcolare un colore in primo piano del testo dato un colore di sfondo.

Quindi, se volessi ottenere un bel colore del testo per un determinato colore di sfondo, ti suggerirei di farlo. Ti dà il colore più brillante del tuo colore di sfondo dato:

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

Funziona come far scorrere i cursori RGB fino a quando il componente più luminoso raggiunge il massimo.

Esempio:

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

ti darà un bianco su etichetta nera. Prova altri colori e vedrai risultati interessanti :)

Questo potrebbe non essere quello che stavi cercando, ma ha dato risultati interessanti per i colori fronte / retro del testo.

Semplice condivisione


1
2017-09-10 05:01