¿Cómo puedo usar UIColorFromRGB en Swift?


110

En Objective-C, usamos este código para establecer códigos de color RGB para las vistas:

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

¿Cómo puedo usar esto en Swift?


Respuestas:


169

Aquí hay una versión Swift de esa función (para obtener una representación UIColor de un UIntvalor):

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)

1
Si pasa una constante de color definida a esta función, no olvide convertir el tipo constante en: UInt. por ejemplo, struct {color estática dejó DarkBlue: uint = 0x1f5e75 estática deje Azul: uint = 0x3f7589 estática dejó LightBlue: uint = 0x7fa3b0}
Javier Calatrava Llavería

129

Yo quería poner

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

pero eso no funcionó.

Entonces usé:
para Swift

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

Así que esta es la solución que encontré.


33
dejar color: UIColor = UIColor (rojo: CGFloat (0 / 255.0), verde: CGFloat (110 / 255.0), azul: CGFloat (255 / 255.0), alpha: CGFloat (1.0))
Vadym

1
El original habría funcionado si lo pusieras entre paréntesis (como el segundo) y pusieras los primeros números delante del signo "/" como un número decimal para que no se trunque a un número entero.
Andy Lebowitz

64

Me gustó mucho la respuesta de Nate Cook, pero quería algo un poco más idiomático. Creo que este es un caso de uso realmente bueno para un inicializador conveniente a través de una extensión personalizada.

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

Esto ahora se puede usar así:

view.backgroundColor = UIColor(rgb: 0x209624)

Solo recomendaría a monkey parchear clases UIKit como esta en su propio código de cliente, no en bibliotecas.


¿Dónde obtengo el valor rgb 0x209624?
Cons Bulaquena

@ConsBulaquena es 0xseguido por cualquier color hexadecimal - color-hex.com
bloudermilk

Veo. ¡Muy útil! Gracias @bloudermilk
Cons Bulaquena

46
myLabel.backgroundColor = UIColor(red: 50.0/255, green: 150.0/255, blue: 65.0/255, alpha: 1.0)

38

La forma más sencilla de agregar color mediante programación es mediante ColorLiteral .

Simplemente agregue la propiedad ColorLiteral como se muestra en el ejemplo, Xcode le mostrará una lista completa de colores que puede elegir. La ventaja de hacerlo es un código menor, agregue valores HEX o RGB . También obtendrá los colores usados ​​recientemente del guión gráfico.

Ejemplo: self.view.backgroundColor = ColorLiteralingrese la descripción de la imagen aquí


5
esto es increíble !
Vaibhav Saran

gracias por compartir esta mano rápida .. nuevo aprendizaje .. :)
Ameer

32

Si está comenzando desde una cadena (no hexadecimal), esta es una función que toma una cadena hexadecimal y devuelve un UIColor.
(Puede ingresar cadenas hexadecimales con cualquier formato: #ffffffo ffffff)

Uso:

var color1 = hexStringToUIColor("#d3d3d3")

Rápido 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)
    )
}

Rápido 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)
    )
}



Fuente: arshad / gist: de147c42d7b3063ef7bc



6

UIColorFromRGB en Swift 4

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

5

He usado lo siguiente en 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)

He usado lo siguiente en swift: let isItAnswer = false;
Alexander Volkov

4

solución para formato 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
        )
    }
}

uso:

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

3

Esto funcionó para mí en rápido. Prueba esto

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

3

agregando una opción rápida 3:

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

2

No puede usar macros complejas como #define UIColorFromRGB(rgbValue)en Swift. El reemplazo de macro simple en swift es constantes globales como

let FADE_ANIMATION_DURATION = 0.35

Aún así, las complejas macros que aceptan parámetros no son compatibles con swift. podrías usar funciones en su lugar

Las macros complejas se utilizan en C y Objective-C, pero no tienen contrapartida en Swift. Las macros complejas son macros que no definen constantes, incluidas las macros parecidas a funciones entre paréntesis. Utiliza macros complejas en C y Objective-C para evitar restricciones de verificación de tipos o para evitar volver a escribir grandes cantidades de código repetitivo. Sin embargo, las macros pueden dificultar la depuración y la refactorización. En Swift, puede usar funciones y genéricos para lograr los mismos resultados sin ningún compromiso. Por lo tanto, las macros complejas que se encuentran en los archivos fuente C y Objective-C no están disponibles para su código Swift.

Extracto de Uso de swift con cacao y objetivo C

Verifique la respuesta de @Nate Cooks para ver la versión Swift de esa función que se usará aquí


2

Puedes usar esto:

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

1

La respuesta de Nate Cook es absolutamente correcta. Solo para mayor flexibilidad, guardo las siguientes funciones en mi paquete:

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

Y así es como los uso:

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

Espero que esto ayude. Todo se prueba con Swift 3 / Xcode 8.


0

Esta es una buena extensión para UIColor. Puede usar valores de enumeración (hexadecimal, cadena) y valores de cadena directa al crear objetos UIColor.

La extensión que nos merecemos https://github.com/ioramashvili/UsefulExtensions/blob/master/Extensions.playground/Pages/UIColor.xcplaygroundpage/Contents.swift


Si bien esto teóricamente puede responder a la pregunta, sería preferible incluir aquí las partes esenciales de la respuesta y proporcionar el enlace como referencia.
Tobi Nary

0

Puedo ver que ya ha sido respondido, pero aún espero que una línea ayude de una mejor manera.

import UIKit

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

Actualizado: Cambios realizados según el ejemplo explicado por el autor de la pregunta para proporcionar valores hexadecimales


0

En Swift3, si está comenzando con un color que ya ha elegido, puede obtener el valor RGB en línea ( http://imagecolorpicker.com ) y usar esos valores definidos como UIColor. Esta solución los implementa como fondo:

    @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 mencionó esto anteriormente en los comentarios y es importante definir el CGFloat con un solo punto decimal


0
import Cocoa
class ViewController: NSViewController{
     override func viewDidLoad() {
            super.viewDidLoad()
    self.view.wantsLayer = true
    self.view.layer?.backgroundColor = NSColor(hexString: "#4d9b48").cgColor

}
extension NSColor {

            convenience init(hexString: String, alpha: CGFloat = 1.0) {
                  let hexString: String = hexString.trimmingCharacters(in: CharacterSet.whitespacesAndNewlines)
                  let scanner = Scanner(string: hexString)
                  if (hexString.hasPrefix("#")) {
                      scanner.scanLocation = 1
                  }
                  var color: UInt32 = 0
                  scanner.scanHexInt32(&color)
                  let mask = 0x000000FF
                  let r = Int(color >> 16) & mask
                  let g = Int(color >> 8) & mask
                  let b = Int(color) & mask
                  let red   = CGFloat(r) / 255.0
                  let green = CGFloat(g) / 255.0
                  let blue  = CGFloat(b) / 255.0
                  self.init(red:red, green:green, blue:blue, alpha:alpha)
              }
              func toHexString() -> String {
                  var r:CGFloat = 0
                  var g:CGFloat = 0
                  var b:CGFloat = 0
                  var a:CGFloat = 0
                  getRed(&r, green: &g, blue: &b, alpha: &a)
                  let rgb:Int = (Int)(r*255)<<16 | (Int)(g*255)<<8 | (Int)(b*255)<<0
                  return String(format:"#%06x", rgb)

            }
        }

-3

Eso se puede hacer simplemente usando esta inicialización

view.backgroundColor = UIColor(hex: "067AB5")
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.