¿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?

NANNAV
fuente

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)
Nate Cook
fuente
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é.

usuario3153627
fuente
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.

bloudermilk
fuente
¿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)
Ankit Goyal
fuente
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í

castiga
fuente
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

Ethan Strider
fuente
13

Para Xcode 9 , utilícelo UIColorcon valores RGB.

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

Avance:

vista previa del botón con color RGB personalizado

Consulte la documentación adicional de Apple sobre UIColor .

Contras Bulaquena
fuente
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
Mahesh Chaudhari
fuente
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)
Imtee
fuente
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)
Vyacheslav
fuente
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
Narasimha Nallamsetty
fuente
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
David Sanford
fuente
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í

Anil Varghese
fuente
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)
atiruz
fuente
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.

Nick Ivanov
fuente
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

shota
fuente
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

Ravindra Shekhawat
fuente
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

RandallShanePhD
fuente
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)

            }
        }
Sawan Cool
fuente
-3

Eso se puede hacer simplemente usando esta inicialización

view.backgroundColor = UIColor(hex: "067AB5")
Guarida
fuente