Come posso usare UIColorFromRGB in Swift?


110

In Objective-C, usiamo questo codice per impostare i codici colore RGB per le viste:

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

Come posso usarlo in Swift?


Risposte:


169

Ecco una versione Swift di quella funzione (per ottenere una rappresentazione UIColor di un UIntvalore):

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 si passa una costante di colore definita a questa funzione, non dimenticare di eseguire il cast del tipo di costante a: UInt. es. struct Color {static let DarkBlue: UInt = 0x1f5e75 static let Blue: UInt = 0x3f7589 static let LightBlue: UInt = 0x7fa3b0}
Javier Calatrava Llavería

129

Ho voluto mettere

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

ma non ha funzionato.

Quindi ho usato:
per Swift

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

Quindi questa è la soluzione alternativa che ho trovato.


33
lascia il colore: UIColor = UIColor (rosso: CGFloat (0 / 255.0), verde: CGFloat (110 / 255.0), blu: CGFloat (255 / 255.0), alpha: CGFloat (1.0))
Vadym

1
L'originale avrebbe funzionato se lo mettessi tra parentesi (come il secondo) e mettessi i primi numeri davanti al segno "/" come numero decimale in modo che non venga troncato a un numero intero.
Andy Lebowitz

64

Mi è piaciuta molto la risposta di Nate Cook ma volevo qualcosa di un po 'più idiomatico. Credo che questo sia un ottimo caso d'uso per un inizializzatore di convenienza tramite un'estensione personalizzata.

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

Questo può ora essere usato in questo modo:

view.backgroundColor = UIColor(rgb: 0x209624)

Consiglierei di applicare patch alle scimmie solo alle classi UIKit come questa nel tuo codice client, non nelle librerie.


Dove ottengo il valore rgb 0x209624?
Contro Bulaquena

@ConsBulaquena è appena 0xseguito da qualsiasi colore esadecimale - color-hex.com
bloudermilk

Vedo. Molto utile! Grazie @bloudermilk
Contro Bulaquena

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

38

Il modo più semplice per aggiungere colore a livello di codice è usare ColorLiteral .

Basta aggiungere la proprietà ColorLiteral come mostrato nell'esempio, Xcode ti chiederà un intero elenco di colori che puoi scegliere. Il vantaggio di farlo è un codice inferiore, aggiungere valori HEX o RGB . Otterrai anche i colori usati di recente dallo storyboard.

Esempio: self.view.backgroundColor = ColorLiteralinserisci qui la descrizione dell'immagine


5
questo è fantastico!
Vaibhav Saran

grazie per aver condiviso questa mano veloce .. nuovo apprendimento .. :)
Ameer

32

Se stai partendo da una stringa (non esadecimale) questa è una funzione che accetta una stringa esadecimale e restituisce un UIColor.
(Puoi inserire stringhe esadecimali con il formato: #ffffffo 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

Per Xcode 9 , usa UIColorcon valori RGB.

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

Anteprima:

anteprima del pulsante con colore RGB personalizzato

Consulta la documentazione Apple aggiuntiva su UIColor .


6

UIColorFromRGB in Swift 4

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

5

Ho usato quanto segue in 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)

Ho usato quanto segue in swift: let isItAnswer = false;
Alexander Volkov

4

soluzione per il 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
        )
    }
}

utilizzo:

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

3

Questo ha funzionato per me in fretta. Prova questo

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

3

aggiunta di un'opzione rapida 3:

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

2

Non puoi usare macro complesse come #define UIColorFromRGB(rgbValue)in swift. La sostituzione di semplici macro in swift è costituita da costanti globali come

let FADE_ANIMATION_DURATION = 0.35

Tuttavia, le macro complesse che accettano parametri non sono supportate da swift. potresti invece usare le funzioni

Le macro complesse vengono utilizzate in C e Objective-C ma non hanno controparti in Swift. Le macro complesse sono macro che non definiscono costanti, incluse le macro di tipo funzione tra parentesi. Si utilizzano macro complesse in C e Objective-C per evitare vincoli di controllo del tipo o per evitare di ridigitare grandi quantità di codice boilerplate. Tuttavia, le macro possono rendere difficile il debug e il refactoring. In Swift, puoi utilizzare funzioni e generici per ottenere gli stessi risultati senza alcun compromesso. Pertanto, le macro complesse che si trovano nei file sorgente C e Objective-C non vengono rese disponibili per il codice Swift.

Estratto dall'Uso rapido con cacao e obiettivo C

Controlla la risposta di @Nate Cooks per la versione Swift di quella funzione da utilizzare qui


2

Puoi usare questo:

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

1

La risposta di Nate Cook è assolutamente corretta. Solo per una maggiore flessibilità, mantengo le seguenti funzioni nel mio pacchetto:

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

Ed è così che li 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)

Spero che questo ti aiuti. Tutto è testato con Swift 3 / Xcode 8.


0

Questa è una bella estensione per UIColor. È possibile utilizzare valori enum (esadecimale, stringa) e valori stringa diretti quando si creano oggetti UIColor.

L'estensione che ci meritiamo https://github.com/ioramashvili/UsefulExtensions/blob/master/Extensions.playground/Pages/UIColor.xcplaygroundpage/Contents.swift


Sebbene questo possa teoricamente rispondere alla domanda, sarebbe preferibile includere qui le parti essenziali della risposta e fornire il collegamento per riferimento.
Tobi Nary

0

Vedo che è già stata data una risposta, ma spero ancora che una linea possa aiutare in modo migliore.

import UIKit

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

Aggiornato:: modifiche apportate secondo l'esempio spiegato dall'autore della domanda per fornire valori esadecimali


0

In Swift3, se stai iniziando con un colore che hai già scelto, puoi ottenere il valore RGB online ( http://imagecolorpicker.com ) e utilizzare quei valori definiti come UIColor. Questa soluzione li implementa come sfondo:

    @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 lo ha menzionato sopra nei commenti ed è importante definire CGFloat con un singolo punto decimale


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

Ciò può essere fatto semplicemente utilizzando questa inizializzazione

view.backgroundColor = UIColor(hex: "067AB5")
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.