Como posso usar UIColorFromRGB em Swift?


110

Em Objective-C, usamos este código para definir códigos de cores RGB para visualizações:

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

Como posso usar isso no Swift?


Respostas:


169

Esta é uma versão Swift dessa função (para obter uma representação UIColor de um 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
Se você passar uma constante de cor definida para esta função, não se esqueça de converter o tipo de constante para: UInt. por exemplo, struct Color {static let DarkBlue: UInt = 0x1f5e75 static let Blue: UInt = 0x3f7589 static let LightBlue: UInt = 0x7fa3b0}
Javier Calatrava Llavería

129

Eu queria colocar

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

mas isso não funcionou.

Então eu usei:
For Swift

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

Portanto, esta é a solução alternativa que encontrei.


33
deixe a cor: UIColor = UIColor (vermelho: CGFloat (0 / 255.0), verde: CGFloat (110 / 255.0), azul: CGFloat (255 / 255.0), alfa: CGFloat (1.0))
Vadym

1
O original teria funcionado se você o colocasse entre parênteses (como o segundo) e colocasse os primeiros números na frente do sinal "/" como um número decimal para que não trunque para um inteiro.
Andy Lebowitz

64

Gostei muito da resposta de Nate Cook, mas queria algo um pouco mais idiomático. Acredito que este seja um caso de uso muito bom para um inicializador de conveniência por meio de uma extensão 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)
        )
    }
}

Isso agora pode ser usado da seguinte forma:

view.backgroundColor = UIColor(rgb: 0x209624)

Eu recomendaria apenas fazer patch de classes UIKit como essa em seu próprio código de cliente, não em bibliotecas.


Onde obtenho o valor rgb 0x209624?
Cons Bulaquena

@ConsBulaquena é apenas 0xseguido por qualquer cor hexadecimal - color-hex.com
bloudermilk

Entendo. Muito útil! Obrigado @bloudermilk
Cons Bulaquena

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

38

A maneira mais simples de adicionar cores programaticamente é usando ColorLiteral .

Basta adicionar a propriedade ColorLiteral conforme mostrado no exemplo, o Xcode irá apresentar uma lista completa de cores para você escolher. A vantagem de fazer isso é menos código, adicione valores HEX ou RGB . Você também obterá as cores usadas recentemente no storyboard.

Exemplo: self.view.backgroundColor = ColorLiteralinsira a descrição da imagem aqui


5
isso é incrível!
Vaibhav Saran

obrigado por compartilhar esta mão rápida .. novo aprendizado .. :)
Ameer

32

Se você está começando com uma string (não hex), esta é uma função que pega uma string hexadecimal e retorna um UIColor.
(Você pode inserir strings hexadecimais com o formato: #ffffffou ffffff)

Uso:

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



Fonte: arshad / gist: de147c42d7b3063ef7bc


13

Para Xcode 9 , use UIColorcom valores RGB.

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

Antevisão:

visualização do botão com cor RGB personalizada

Consulte a documentação adicional da Apple sobre UIColor .


6

UIColorFromRGB em Swift 4

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

5

Eu usei o seguinte rapidamente.

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)

Usei o seguinte no swift: let isItAnswer = false;
Alexander Volkov

4

solução para o 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

Isso funcionou para mim rapidamente. Tente isto

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

3

adicionando uma opção 3 rápida:

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

2

Você não pode usar macros complexas como #define UIColorFromRGB(rgbValue)no swift. A substituição de macro simples em swift são constantes globais como

let FADE_ANIMATION_DURATION = 0.35

Mesmo assim, as macros complexas que aceitam parâmetros não são suportadas pelo swift. você poderia usar funções ao invés

Macros complexas são usadas em C e Objective-C, mas não têm contrapartida em Swift. Macros complexas são macros que não definem constantes, incluindo macros entre parênteses e semelhantes a funções. Você usa macros complexas em C e Objective-C para evitar restrições de verificação de tipo ou para evitar redigitar grandes quantidades de código clichê. No entanto, as macros podem dificultar a depuração e a refatoração. No Swift, você pode usar funções e genéricos para alcançar os mesmos resultados sem quaisquer compromissos. Portanto, as macros complexas que estão nos arquivos de origem C e Objective-C não são disponibilizadas para o seu código Swift.

Trecho de Using swift with cacau e objetivo C

Verifique a resposta de @Nate Cooks para a versão Swift dessa função a ser usada aqui


2

Você pode usar isto:

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

1

A resposta de Nate Cook está absolutamente correta. Apenas para maior flexibilidade, mantenho as seguintes funções em meu pacote:

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

E é assim que eu os 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 isso ajude. Tudo é testado com Swift 3 / Xcode 8.



0

Eu posso ver que já foi respondido, mas ainda espero que um liner ajude melhor.

import UIKit

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

Atualizado:: Mudanças feitas de acordo com o exemplo explicado pelo autor da pergunta para fornecer valores hexadecimais


0

No Swift3, se você está começando com uma cor que você já escolheu, você pode obter o valor RGB online ( http://imagecolorpicker.com ) e usar esses valores definidos como UIColor. Esta solução os implementa como pano de fundo:

    @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 mencionou isso acima nos comentários e é importante definir o CGFloat com uma única casa 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

Isso pode ser feito simplesmente usando esta inicialização

view.backgroundColor = UIColor(hex: "067AB5")
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.