Question Comment obtenir une couleur inverse de UIColor?


par exemple. La couleur inverse du noir devrait être blanche.


19
2018-05-05 05:56


origine


Réponses:


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



Cela devrait fonctionner:

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

La source: Vérifiez si la couleur UIColor est sombre ou brillante?


23
2018-05-05 06:16



---- MODIFIER ----

Basé sur la réponse de @ amleszk, j'ai mis à jour la catégorie UIColor avec cette méthode:

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

---- PÉRIMÉ ----

Basé sur la réponse de @ grc, je crée une catégorie UIColor avec cette méthode:

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



Le moyen le plus rapide est d'étendre 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 solution de GRC présente un problème: CGColorGetComponents renvoie à une échelle de 0,0 à 1,0 et non de 2 à 255. Donc, vous devriez utiliser

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

au lieu. Sinon tout sera blanc (1.0 et lager)

sorte de la même chose que amleszk utilisé, là aussi il est 1.-color, au lieu de 255. Btw que 1. représente le float 1.0, vous devriez plutôt taper 1.0 au lieu de 1., pour éviter toute confusion


7
2018-01-18 18:18



Donc, pour être utile à tous les swifters est venu ici à la recherche de la réponse - voici comment cela devrait ressembler en 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



Vous n'avez pas obtenu de couleurs inverses pour le gris. Donc, des effets lorsque vous utilisez le fond gris et sa couleur inverse en tant que couleur de texte

CECI fonctionne même pour la couleur grise, j'ai juste ajouté un code supplémentaire au code de @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