web-dev-qa-db-fra.com

Comment utiliser UIColorFromRGB dans Swift?

En Objective-C, nous utilisons ce code pour définir des codes de couleur RVB pour les vues:

#define UIColorFromRGB(rgbValue)        
[UIColor colorWithRed:((float)((rgbValue & 0xFF0000) >> 16))/255.0 green:((float)((rgbValue & 0xFF00) >> 8))/255.0 blue:((float)(rgbValue & 0xFF))/255.0 alpha:1.0]

view.backgroundColor=UIColorFromRGB(0x209624);

Comment puis-je l'utiliser dans Swift?

98
NANNAV

Voici une version Swift de cette fonction (pour obtenir une représentation UIColor d'une valeur UInt):

func UIColorFromRGB(rgbValue: UInt) -> UIColor {
    return UIColor(
        red: CGFloat((rgbValue & 0xFF0000) >> 16) / 255.0,
        green: CGFloat((rgbValue & 0x00FF00) >> 8) / 255.0,
        blue: CGFloat(rgbValue & 0x0000FF) / 255.0,
        alpha: CGFloat(1.0)
    )
}

view.backgroundColor = UIColorFromRGB(0x209624)
160
Nate Cook

Je voulais mettre 

cell.backgroundColor = UIColor.colorWithRed(125/255.0, green: 125/255.0, blue: 125/255.0, alpha: 1.0)  

mais ça n'a pas marché.

Alors j'ai utilisé:
Pour Swift

cell.backgroundColor = UIColor(red: 0.5, green: 0.5, blue: 0.5, alpha: 1.0)  

C'est donc la solution de contournement que j'ai trouvée.

115
user3153627

J'ai bien aimé la réponse de Nate Cook mais je voulais quelque chose d'un peu plus idiomatique. Je pense que c'est un très bon cas d'utilisation pour un initialiseur de commodité via une extension personnalisée.

// UIColorExtensions.Swift
import Foundation
import UIKit

extension UIColor {
    convenience init(rgb: UInt) {
        self.init(
            red: CGFloat((rgb & 0xFF0000) >> 16) / 255.0,
            green: CGFloat((rgb & 0x00FF00) >> 8) / 255.0,
            blue: CGFloat(rgb & 0x0000FF) / 255.0,
            alpha: CGFloat(1.0)
        )
    }
}

Cela peut maintenant être utilisé comme ceci:

view.backgroundColor = UIColor(rgb: 0x209624)

Je ne recommanderais que les correctifs des classes UIKit comme ceci dans votre propre code client, pas dans les bibliothèques.

61
bloudermilk
myLabel.backgroundColor = UIColor(red: 50.0/255, green: 150.0/255, blue: 65.0/255, alpha: 1.0)
42
Ankit Goyal

La méthode la plus simple pour ajouter des couleurs par programme consiste à utiliser ColorLiteral.

Il suffit d’ajouter la propriété ColorLiteral comme indiqué dans l’exemple, Xcode vous invitera à choisir toute une liste de couleurs. L'avantage de cela est un code inférieur, add HEX ou RGB. Vous obtiendrez également les couleurs récemment utilisées à partir du storyboard.

Exemple: Self.view.backgroundColor = ColorLiteral  enter image description here

30
puneeth

Si vous partez d'une chaîne (pas hex), il s'agit d'une fonction qui prend une chaîne hex et renvoie une UIColor.
(vous pouvez entrer des chaînes hexadécimales avec le format suivant: #ffffff ou ffffff)

Utilisation:

var color1 = hexStringToUIColor("#d3d3d3")

Swift 4:

func hexStringToUIColor (hex:String) -> UIColor {
    var cString:String = hex.trimmingCharacters(in: .whitespacesAndNewlines).uppercased()

    if (cString.hasPrefix("#")) {
        cString.remove(at: cString.startIndex)
    }

    if ((cString.count) != 6) {
        return UIColor.gray
    }

    var rgbValue:UInt32 = 0
    Scanner(string: cString).scanHexInt32(&rgbValue)

    return UIColor(
        red: CGFloat((rgbValue & 0xFF0000) >> 16) / 255.0,
        green: CGFloat((rgbValue & 0x00FF00) >> 8) / 255.0,
        blue: CGFloat(rgbValue & 0x0000FF) / 255.0,
        alpha: CGFloat(1.0)
    )
}

Swift 3:

func hexStringToUIColor (hex:String) -> UIColor {
    var cString:String = hex.trimmingCharacters(in: .whitespacesAndNewlines).uppercased()

    if (cString.hasPrefix("#")) {
        cString.remove(at: cString.startIndex)
    }

    if ((cString.characters.count) != 6) {
        return UIColor.gray
    }

    var rgbValue:UInt32 = 0
    Scanner(string: cString).scanHexInt32(&rgbValue)

    return UIColor(
        red: CGFloat((rgbValue & 0xFF0000) >> 16) / 255.0,
        green: CGFloat((rgbValue & 0x00FF00) >> 8) / 255.0,
        blue: CGFloat(rgbValue & 0x0000FF) / 255.0,
        alpha: CGFloat(1.0)
    )
}

Swift 2:

func hexStringToUIColor (hex:String) -> UIColor {
    var cString:String = hex.stringByTrimmingCharactersInSet(NSCharacterSet.whitespaceAndNewlineCharacterSet() as NSCharacterSet).uppercaseString

    if (cString.hasPrefix("#")) {
      cString = cString.substringFromIndex(cString.startIndex.advancedBy(1))
    }

    if ((cString.characters.count) != 6) {
      return UIColor.grayColor()
    }

    var rgbValue:UInt32 = 0
    NSScanner(string: cString).scanHexInt(&rgbValue)

    return UIColor(
        red: CGFloat((rgbValue & 0xFF0000) >> 16) / 255.0,
        green: CGFloat((rgbValue & 0x00FF00) >> 8) / 255.0,
        blue: CGFloat(rgbValue & 0x0000FF) / 255.0,
        alpha: CGFloat(1.0)
    )
}



Source: arshad/Gist: de147c42d7b3063ef7bc

26
Ethan Strider

Pour Xcode 9, utilisez UIColor avec les valeurs RVB.

shareBtn.backgroundColor = UIColor( red: CGFloat(92/255.0), green: CGFloat(203/255.0), blue: CGFloat(207/255.0), alpha: CGFloat(1.0) )

Aperçu:

 button preview with custom RGB color

Voir la documentation supplémentaire Apple sur UIColor .

10
Cons Bulaquena

J'ai utilisé ce qui suit dans Swift.

let appRedColor = UIColor(red: 200.0/255.0, green: 16.0/255.0, blue: 46.0/255.0, alpha: 1.0)
let appSilverColor = UIColor(red: 236.0/255.0, green: 236.0/255.0, blue: 236.0/255.0, alpha: 1.0)
let appWhiteColor = UIColor(red: 255.0/255.0, green: 255.0/255.0, blue: 255.0/255.0, alpha: 1.0)
let appNavyColor = UIColor(red: 19.0/255.0, green: 41.0/255.0, blue: 75.0/255.0, alpha: 1.0)
5
Imtee

UIColorFromRGB dans Swift 4

button.layer.backgroundColor = UIColor(red: 112.0/255, green: 86.0/255, blue: 164.0/255, alpha: 1.0).cgColor
3
Mahesh Chaudhari

ajout d'une option Swift 3:

cell.layer.borderColor = UIColor (red: 192.0/255.0, green: 192.0/255.0, blue: 197/255.0, alpha: 1.0).cgColor
3
David Sanford

Cela a fonctionné pour moi à Swift. Essaye ça

bottomBorder.borderColor = UIColor (red: 255.0/255.0, green: 215.0/255.0, blue: 60/255.0, alpha: 1.0).CGColor
3

solution pour le format argb:

//  UIColorExtensions.Swift
import UIKit
extension UIColor {

    convenience init(argb: UInt) {
        self.init(
            red: CGFloat((argb & 0xFF0000) >> 16) / 255.0,
            green: CGFloat((argb & 0x00FF00) >> 8) / 255.0,
            blue: CGFloat(argb & 0x0000FF) / 255.0,
            alpha: CGFloat((argb & 0xFF000000) >> 24) / 255.0
        )
    }
}

usage:

var clearColor: UIColor = UIColor.init(argb: 0x00000000)
var redColor: UIColor = UIColor.init(argb: 0xFFFF0000)
3
Vyacheslav

Vous pouvez utiliser ceci:

//The color RGB #85CC4B
let newColor = UIColor(red: CGFloat(0x85)/255
                      ,green: CGFloat(0xCC)/255
                      ,blue: CGFloat(0x4B)/255
                      ,alpha: 1.0)
2
atiruz

Vous ne pouvez pas utiliser de macros complexes telles que #define UIColorFromRGB(rgbValue) dans Swift. Le remplacement de la macro simple dans Swift est des constantes globales comme 

let FADE_ANIMATION_DURATION = 0.35

Néanmoins, les macros complexes acceptant les paramètres ne sont pas prises en charge par Swift. vous pouvez utiliser des fonctions à la place 

Les macros complexes sont utilisées en C et Objective-C mais n'ont pas d'équivalent en Swift. Les macros complexes sont des macros qui ne définissent pas de constantes, y compris des macros entre parenthèses, de type fonction. Vous utilisez des macros complexes en C et en Objective-C pour éviter les contraintes de vérification de type ou éviter de ressaisir de grandes quantités de code standard. Cependant, les macros peuvent rendre le débogage et le refactoring difficiles. Dans Swift, vous pouvez utiliser des fonctions et des génériques pour obtenir les mêmes résultats sans aucun compromis. Par conséquent, les macros complexes contenues dans les fichiers source C et Objective-C ne sont pas mises à la disposition de votre code Swift.

Extrait de Utilisation de Swift avec du cacao et de l’Objectif C

Vérifiez la réponse de @Nate Cooks pour que la version Swift de cette fonction soit utilisée ici 

2
Anil Varghese

La réponse de Nate Cook est tout à fait juste… .. Pour plus de souplesse, je garde les fonctions suivantes dans mon pack:

func getUIColorFromRGBThreeIntegers(red: Int, green: Int, blue: Int) -> UIColor {
    return UIColor(red: CGFloat(Float(red) / 255.0),
        green: CGFloat(Float(green) / 255.0),
        blue: CGFloat(Float(blue) / 255.0),
        alpha: CGFloat(1.0))
}

func getUIColorFromRGBHexValue(value: Int) -> UIColor {
    return getUIColorFromRGBThreeIntegers(red: (value & 0xFF0000) >> 16,
        green: (value & 0x00FF00) >> 8,
        blue: value & 0x0000FF)
}

func getUIColorFromRGBString(value: String) -> UIColor {
    let str = value.lowercased().replacingOccurrences(of: "#", with: "").
        replacingOccurrences(of: "0x", with: "");
        return getUIColorFromRGBHexValue(value: Int(str, radix: 16)!);
}

Et voici comment je les utilise:

// All three of them are identical:
let myColor1 = getUIColorFromRGBHexValue(value: 0xd5a637)
let myColor2 = getUIColorFromRGBString(value: "#D5A637")
let myColor3 = getUIColorFromRGBThreeIntegers(red: 213, green: 166, blue: 55)

J'espère que cela vous aidera ... Tout est testé avec Swift 3/Xcode 8.

1
Nick Ivanov

Je peux voir que sa réponse a déjà été donnée, mais j'espère toujours qu'un seul paquebot aidera de manière plus efficace.

import UIKit

let requiredColor = UIColor(red: CGFloat((rgbValue & 0xFF0000) >> 16)/255, 
                            green: CGFloat((rgbValue & 0x00FF00) >> 8)/255, 
                            blue: CGFloat(rgbValue & 0x0000FF)/255, alpha :1)

Mise à jour: : Modifications apportées conformément à l'exemple expliqué par l'auteur de la question afin de fournir des valeurs hexadécimales 

0
Ravindra Shekhawat

Dans Swift3, si vous commencez avec une couleur que vous avez déjà choisie, vous pouvez obtenir la valeur RVB en ligne ( http://imagecolorpicker.com ) et utiliser les valeurs définies comme UIColor. Cette solution les implémente en arrière-plan:

    @IBAction func blueBackground(_ sender: Any) {
        let blueColor = UIColor(red: CGFloat(160/255), green: CGFloat(183.0/255), blue: CGFloat(227.0/255), alpha: 1)
        view.backgroundColor = blueColor

@Vadym a mentionné ce qui précède dans les commentaires et il est important de définir le CGFloat avec un seul point décimal.

0
RandallShanePhD