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?

NANNAV
fonte

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

user3153627
fonte
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.

bloudermilk
fonte
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)
Ankit Goyal
fonte
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

puneeth
fonte
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

Ethan Strider
fonte
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 .

Cons Bulaquena
fonte
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
Mahesh Chaudhari
fonte
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)
Imtee
fonte
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)
Vyacheslav
fonte
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
Narasimha Nallamsetty
fonte
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
David Sanford
fonte
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

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

Nick Ivanov
fonte
0

Esta é uma boa extensão para UIColor. Você pode usar valores enum (hex, string) e valores de string diretos ao criar objetos UIColor.

A extensão que merecemos https://github.com/ioramashvili/UsefulExtensions/blob/master/Extensions.playground/Pages/UIColor.xcplaygroundpage/Contents.swift

shota
fonte
Embora isso possa teoricamente responder à pergunta, seria preferível incluir as partes essenciais da resposta aqui e fornecer o link para referência.
Tobi Nary
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

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

RandallShanePhD
fonte
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
fonte
-3

Isso pode ser feito simplesmente usando esta inicialização

view.backgroundColor = UIColor(hex: "067AB5")
Den
fonte