Recherche…


Créer un UIColor

Vous pouvez créer un UIColor plusieurs manières:

Rapide

  • Utiliser l'une des couleurs prédéfinies:

    let redColor = UIColor.redColor()
    let blueColor: UIColor = .blueColor()
    
    // In Swift 3, the "Color()" suffix is removed:
    let redColor = UIColor.red
    let blueColor: UIColor = .blue
    

    Si le compilateur sait déjà que la variable est une instance de UIColor vous pouvez ignorer le type tous ensemble:

    let view = UIView()
    view.backgroundColor = .yellowColor()
    
  • En utilisant la valeur de niveaux de gris et l'alpha:

    let grayscaleColor = UIColor(white: 0.5, alpha: 1.0)
    
  • En utilisant la teinte, la saturation, la luminosité et l'alpha:

    let hsbColor = UIColor(
        hue: 0.4,
        saturation: 0.3,
        brightness: 0.7,
        alpha: 1.0
    )
    
  • En utilisant les valeurs RGBA:

    let rgbColor = UIColor(
        red: 30.0 / 255, 
        green: 70.0 / 255, 
        blue: 200.0 / 255, 
        alpha: 1.0
    )
    
  • En utilisant une image de motif:

    let patternColor = UIColor(patternImage: UIImage(named: "myImage")!)
    

Objectif c

  • Utiliser l'une des couleurs prédéfinies:

    UIColor *redColor = [UIColor redColor];
    
  • En utilisant la valeur de niveaux de gris et l'alpha:

    UIColor *grayscaleColor = [UIColor colorWithWhite: 0.5 alpha: 1.0];
    
  • En utilisant la teinte, la saturation, la luminosité et l'alpha:

    UIColor *hsbColor = [UIColor
        colorWithHue: 0.4
        saturation: 0.3
        brightness: 0.7
        alpha: 1.0
    ];
    
  • En utilisant les valeurs RGBA:

    UIColor *rgbColor = [UIColor
        colorWithRed: 30.0 / 255.0
        green: 70.0 / 255.0
        blue: 200.0 / 255.0 
        alpha: 1.0
    ];
    
  • En utilisant une image de motif:

    UIColor *pattenColor = [UIColor colorWithPatternImage:[UIImage imageNamed:@"myImage.png"]];
    

Méthodes non documentées

Il existe une variété de méthodes non documentées sur UIColor qui exposent des couleurs ou des fonctionnalités alternatives. Ceux-ci peuvent être trouvés dans le fichier d'en-tête privé UIColor . Je vais documenter l'utilisation de deux méthodes privées, styleString() et _systemDestructiveTintColor() .

styleString

Depuis iOS 2.0, il existe une méthode d'instance privée sur UIColor appelée styleString qui renvoie une représentation de la chaîne RVB ou RGBA, même pour des couleurs comme whiteColor dehors de l'espace RVB.

Objectif c:

@interface UIColor (Private)

- (NSString *)styleString;

@end

// ...

[[UIColor whiteColor] styleString]; // rgb(255,255,255)
[[UIColor redColor] styleString]; // rgb(255,0,0)
[[UIColor lightTextColor] styleString]; // rgba(255,255,255,0.600000)

Dans Swift, vous pouvez utiliser un en-tête de pontage pour exposer l'interface. Avec pure Swift, vous devrez créer un protocole @objc avec la méthode privée et unsafeBitCast UIColor avec le protocole:

@objc protocol  UIColorPrivate {
    func styleString() -> String
}

let white = UIColor.whiteColor()
let red = UIColor.redColor()
let lightTextColor = UIColor.lightTextColor()

let whitePrivate = unsafeBitCast(white, UIColorPrivate.self)
let redPrivate = unsafeBitCast(red, UIColorPrivate.self)
let lightTextColorPrivate = unsafeBitCast(lightTextColor, UIColorPrivate.self)

whitePrivate.styleString() // rgb(255,255,255)
redPrivate.styleString() // rgb(255,0,0)
lightTextColorPrivate.styleString() // rgba(255,255,255,0.600000)

_systemDestructiveTintColor()

Il existe une méthode de classe non documentée sur UIColor appelée _systemDestructiveTintColor qui renvoie la couleur rouge utilisée par les boutons système destructeurs:

let red = UIColor.performSelector("_systemDestructiveTintColor").takeUnretainedValue()

Il retourne un objet non géré, que vous devez appeler .takeUnretainedValue() car la propriété de couleur n'a pas été transférée à notre propre objet.

Comme avec toute API non documentée, vous devez faire attention lorsque vous essayez d'utiliser cette méthode:

if UIColor.respondsToSelector("_systemDestructiveTintColor") {
    if let red = UIColor.performSelector("_systemDestructiveTintColor").takeUnretainedValue() as? UIColor {
        // use the color
    }
}

ou en utilisant un protocole:

@objc protocol UIColorPrivateStatic {
    func _systemDestructiveTintColor() -> UIColor
}

let privateClass = UIColor.self as! UIColorPrivateStatic
privateClass._systemDestructiveTintColor() // UIDeviceRGBColorSpace 1 0.231373 0.188235 1

Couleur avec composant Alpha

Vous pouvez définir l'opacité sur un certain UIColor sans en créer un en utilisant l' init(red:_,green:_,blue:_,alpha:_) .

Rapide

let colorWithAlpha = UIColor.redColor().colorWithAlphaComponent(0.1)

Swift 3

//In Swift Latest Version
_ colorWithAlpha = UIColor.red.withAlphaComponent(0.1)

Objectif c

UIColor * colorWithAlpha = [[UIColor redColor] colorWithAlphaComponent:0.1];

Faire en sorte que les attributs définis par l'utilisateur appliquent le type de données CGColor

Par défaut, Interface Builder n'accepte pas le CGColor données CGColor , de sorte que vous CGColor ajouter un CGColor aide des attributs définis par l'utilisateur dans le générateur d'interface. on peut vouloir utiliser une extension comme ceci:

Extension rapide:

extension CALayer {
    func borderUIColor() -> UIColor? {
        return borderColor != nil ? UIColor(CGColor: borderColor!) : nil
    }
    
    func setBorderUIColor(color: UIColor) {
        borderColor = color.CGColor
    }
}

Le nouvel attribut défini par l'utilisateur (borderUIColor) sera reconnu et appliqué sans problème.

entrer la description de l'image ici

Créer un UIColor à partir d'un nombre hexadécimal ou d'une chaîne

Vous pouvez créer une UIColor partir d'un nombre hexadécimal ou d'une chaîne, par exemple 0xff00cc, "#FFFFFF"

Rapide

Valeur Int

extension UIColor {
    convenience init(hex: Int, alpha: CGFloat = 1.0) {
        let r = CGFloat((hex >> 16) & 0xff) / 255
        let g = CGFloat((hex >> 08) & 0xff) / 255
        let b = CGFloat((hex >> 00) & 0xff) / 255
        self.init(red: r, green: g, blue: b, alpha: alpha)
    }
}

Exemple:

let color = UIColor(hex: 0xff00cc, alpha: 1.0)

Notez que pour alpha la valeur par défaut de 1.0 est fournie, elle peut donc être utilisée comme suit:

let color = UIColor(hex: 0xff00cc)

Valeur de chaîne

extension UIColor {
    convenience init(hexCode: String) {
        let hex = hexCode.stringByTrimmingCharactersInSet(NSCharacterSet.alphanumericCharacterSet().invertedSet)
        var int = UInt32()
        NSScanner(string: hex).scanHexInt(&int)
        let a, r, g, b: UInt32

        switch hex.characters.count {
        case 3:
            (a, r, g, b) = (255, (int >> 8) * 17, (int >> 4 & 0xF) * 17, (int & 0xF) * 17)
        case 6:
            (a, r, g, b) = (255, int >> 16, int >> 8 & 0xFF, int & 0xFF)
        case 8:
            (a, r, g, b) = (int >> 24, int >> 16 & 0xFF, int >> 8 & 0xFF, int & 0xFF)
        default:
            (a, r, g, b) = (1, 1, 1, 0)
        }
    
        self.init(red: CGFloat(r) / 255, green: CGFloat(g) / 255, blue: CGFloat(b) / 255, alpha: CGFloat(a) / 255)
    }
}

Exemple d'utilisation:

Hex avec alpha

let color = UIColor("#80FFFFFF")

Hex sans alpha (la color alpha sera égale à 1,0)

let color = UIColor("#FFFFFF")
let color = UIColor("#FFF")

Objectif c

Valeur Int

@interface UIColor (Hex)
+ (UIColor *)colorWithHex:(NSUInteger)hex alpha:(CGFloat)alpha;
@end

@implementation UIColor (Hex)
+ (UIColor *)colorWithHex:(NSUInteger)hex alpha:(CGFloat)alpha {
    return [UIColor colorWithRed:((CGFloat)((hex & 0xFF0000) >> 16))/255.0
                           green:((CGFloat)((hex & 0xFF00) >> 8))/255.0
                            blue:((CGFloat)(hex & 0xFF))/255.0
                           alpha:alpha];
}
@end

Exemple:

UIColor *color = [UIColor colorWithHex:0xff00cc alpha:1.0];

Valeur de chaîne

- (UIColor*) hex:(NSString*)hexCode {
    
    NSString *noHashString = [hexCode stringByReplacingOccurrencesOfString:@"#" withString:@""];
    NSScanner *scanner = [NSScanner scannerWithString:noHashString];
    [scanner setCharactersToBeSkipped:[NSCharacterSet symbolCharacterSet]];
    
    unsigned hex;
    if (![scanner scanHexInt:&hex]) return nil;
    int a;
    int r;
    int g;
    int b;

    switch (noHashString.length) {
        case 3:
            a = 255;
            r = (hex >> 8) * 17;
            g = ((hex >> 4) & 0xF) * 17;
            b = ((hex >> 0) & 0xF) * 17;
            break;
        case 6:
            a = 255;
            r = (hex >> 16);
            g = (hex >> 8) & 0xFF;
            b = (hex) & 0xFF;
            break;
        case 8:
            a = (hex >> 24);
            r = (hex >> 16) & 0xFF;
            g = (hex >> 8) & 0xFF;
            b = (hex) & 0xFF;
            break;
            
        default:
            a = 255.0;
            r = 255.0;
            b = 255.0;
            g = 255.0;
            break;
    }

    return [UIColor colorWithRed:r / 255.0f green:g / 255.0f blue:b / 255.0f alpha:a / 255];
}

Exemple d'utilisation:

Hex avec alpha

UIColor* color = [self hex:@"#80FFFFFF"];

Hex sans alpha (la color alpha sera égale à 1)

UIColor* color = [self hex:@"#FFFFFF"];
UIColor* color = [self hex:@"#FFF"];

Luminosité de couleur ajustée de UIColor

L'exemple de code ci-dessous vous donnera une version ajustée de cette couleur où un pourcentage plus élevé sera plus lumineux et un pourcentage plus faible plus sombre.

Objectif c

+ (UIColor *)adjustedColorForColor:(UIColor *)c : (double)percent
{
    if (percent < 0) percent = 0;
    
    CGFloat r, g, b, a;
    if ([c getRed:&r green:&g blue:&b alpha:&a])
        return [UIColor colorWithRed:MAX(r * percent, 0.0)
                               green:MAX(g * percent, 0.0)
                                blue:MAX(b * percent, 0.0)
                               alpha:a];
    return nil;
}

Rapide

func adjustedColorForColor( c: UIColor, var percent: CGFloat) -> UIColor {
    if percent < 0 {
        percent = 0
    }

    var r,g,b,a: CGFloat
    r = 0.0
    g = 0.0
    b = 0.0
    a = 0.0

    if c.getRed(&r, green: &g, blue: &b, alpha: &a) {
        return UIColor(red: max(r * percent, 0.0), green: max(g * percent, 0.0), blue: max(b * percent, 0.0), alpha: a)
    }

    return UIColor()
}

UIColor à partir d'un motif d'image

Vous pouvez créer un objet UIColor aide d'un motif d'image à l'aide de la UIColor(patternImage:_) .

btn.backgroundColor = UIColor(patternImage: UIImage(named: "image")!)

entrer la description de l'image ici

Ombre plus claire et plus foncée d'une couleur UIC donnée

L'exemple de code ci-dessous montre comment obtenir une nuance plus claire et plus foncée d'une couleur donnée, utile dans les applications ayant des thèmes dynamiques

Pour une couleur plus foncée

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

Pour une couleur plus claire

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

Voir Différences visuelles ci-dessous, en considérant que la couleur donnée est [UIColor orangeColor]

Démo visuelle



Modified text is an extract of the original Stack Overflow Documentation
Sous licence CC BY-SA 3.0
Non affilié à Stack Overflow