Wie kann ich UIColorFromRGB in Swift verwenden?

110

In Objective-C verwenden wir diesen Code, um RGB-Farbcodes für Ansichten festzulegen:

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

Wie kann ich das in Swift verwenden?

NANNAV
quelle

Antworten:

169

Hier ist eine Swift-Version dieser Funktion (zum Abrufen einer UIColor-Darstellung eines UIntWerts):

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
quelle
1
Wenn Sie dieser Funktion eine definierte Farbkonstante übergeben, vergessen Sie nicht, den Konstantentyp in: UInt umzuwandeln. zB struct Color {statisch let DarkBlue: UInt = 0x1f5e75 static let Blue: UInt = 0x3f7589 static let LightBlue: UInt = 0x7fa3b0}
Javier Calatrava Llavería
129

Ich wollte setzen

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

aber das hat nicht funktioniert.

Also habe ich verwendet:
Für Swift

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

Das ist also die Problemumgehung, die ich gefunden habe.

user3153627
quelle
33
Farbe lassen: UIColor = UIColor (rot: CGFloat (0 / 255.0), grün: CGFloat (110 / 255.0), blau: CGFloat (255 / 255.0), alpha: CGFloat (1.0))
Vadym
1
Das Original hätte funktioniert, wenn Sie es in Klammern gesetzt hätten (wie das zweite) und die ersten Zahlen als Dezimalzahl vor das "/" -Zeichen gesetzt hätten, damit es nicht auf eine Ganzzahl abgeschnitten wird.
Andy Lebowitz
64

Die Antwort von Nate Cook hat mir sehr gut gefallen, aber ich wollte etwas Idiotischeres. Ich glaube, dies ist ein wirklich guter Anwendungsfall für einen praktischen Initialisierer über eine benutzerdefinierte Erweiterung.

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

Dies kann nun folgendermaßen verwendet werden:

view.backgroundColor = UIColor(rgb: 0x209624)

Ich würde nur empfehlen, UIKit-Klassen wie diese in Ihrem eigenen Client-Code zu patchen, nicht in Bibliotheken.

Blutmilch
quelle
Woher bekomme ich den RGB-Wert 0x209624?
Nachteile Bulaquena
@ConsBulaquena es 0xfolgt nur eine beliebige Hex-Farbe - color-hex.com
Bloudermilk
Aha. Sehr hilfreich! Danke @bloudermilk
Nachteile Bulaquena
46
myLabel.backgroundColor = UIColor(red: 50.0/255, green: 150.0/255, blue: 65.0/255, alpha: 1.0)
Ankit Goyal
quelle
37

Der einfachste Weg, Farbe programmgesteuert hinzuzufügen, ist die Verwendung von ColorLiteral .

Fügen Sie einfach die Eigenschaft ColorLiteral hinzu, wie im Beispiel gezeigt. Xcode fordert Sie mit einer ganzen Liste von Farben auf, die Sie auswählen können. Dies hat den Vorteil, dass weniger Code, HEX-Werte oder RGB hinzugefügt werden . Sie erhalten auch die kürzlich verwendeten Farben aus dem Storyboard.

Beispiel: self.view.backgroundColor = ColorLiteralGeben Sie hier die Bildbeschreibung ein

Puneeth
quelle
5
das ist großartig !
Vaibhav Saran
32

Wenn Sie von einer Zeichenfolge (nicht hexadezimal) ausgehen, ist dies eine Funktion, die eine hexadezimale Zeichenfolge verwendet und eine UIColor zurückgibt.
(Sie können Hex-Zeichenfolgen in folgenden Formaten eingeben: #ffffffoder ffffff)

Verwendung:

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



Quelle: arshad / gist: de147c42d7b3063ef7bc

Ethan Strider
quelle
13

Verwenden Sie für Xcode 9UIColor RGB-Werte.

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

Vorschau:

Tastenvorschau mit benutzerdefinierter RGB-Farbe

Weitere Apple-Dokumentation zu UIColor finden Sie hier .

Nachteile Bulaquena
quelle
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
Mahesh Chaudhari
quelle
5

Ich habe das Folgende in Kürze verwendet.

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
quelle
Ich habe in Kürze Folgendes verwendet: let isItAnswer = false;
Alexander Volkov
4

Lösung für das Argb-Format:

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

Verwendung:

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

Das ist für mich schnell erledigt. Versuche dies

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

Hinzufügen einer schnellen 3-Option:

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

Sie können keine komplexen Makros wie #define UIColorFromRGB(rgbValue)in Swift verwenden. Das Ersetzen eines einfachen Makros in Swift erfolgt durch globale Konstanten wie

let FADE_ANIMATION_DURATION = 0.35

Die komplexen Makros, die Parameter akzeptieren, werden von swift jedoch nicht unterstützt. Sie könnten stattdessen Funktionen verwenden

Komplexe Makros werden in C und Objective-C verwendet, haben jedoch kein Gegenstück in Swift. Komplexe Makros sind Makros, die keine Konstanten definieren, einschließlich funktionsähnlicher Makros in Klammern. Sie verwenden komplexe Makros in C und Objective-C, um Einschränkungen bei der Typprüfung zu vermeiden oder um zu vermeiden, dass große Mengen von Boilerplate-Code erneut eingegeben werden. Makros können jedoch das Debuggen und Refactoring erschweren. In Swift können Sie Funktionen und Generika verwenden, um dieselben Ergebnisse ohne Kompromisse zu erzielen. Daher werden die komplexen Makros in C- und Objective-C-Quelldateien Ihrem Swift-Code nicht zur Verfügung gestellt.

Auszug aus der Verwendung von Swift mit Kakao und Ziel C.

Überprüfen Sie die Antwort von @Nate Cooks auf die Swift-Version dieser Funktion, die hier verwendet werden soll

Anil Varghese
quelle
2

Sie können dies verwenden:

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

Die Antwort von Nate Cook ist absolut richtig. Aus Gründen der Flexibilität behalte ich die folgenden Funktionen in meinem Paket:

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

Und so benutze ich sie:

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

Hoffe das wird helfen. Alles wird mit Swift 3 / Xcode 8 getestet.

Nick Ivanov
quelle
0

Dies ist eine schöne Erweiterung für UIColor. Sie können beim Erstellen von UIColor-Objekten Enum-Werte (Hex, String) und direkte String-Werte verwenden.

Die Erweiterung verdienen wir https://github.com/ioramashvili/UsefulExtensions/blob/master/Extensions.playground/Pages/UIColor.xcplaygroundpage/Contents.swift

shota
quelle
Während dies theoretisch die Frage beantworten kann, wäre es vorzuziehen , die wesentlichen Teile der Antwort hier aufzunehmen und den Link als Referenz bereitzustellen.
Tobi Nary
0

Ich kann sehen, dass es bereits beantwortet wurde, hoffe aber immer noch, dass ein Liner besser hilft.

import UIKit

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

Aktualisiert :: Änderungen gemäß dem vom Autor der Frage erläuterten Beispiel, um Hex-Werte bereitzustellen

Ravindra Shekhawat
quelle
0

Wenn Sie in Swift3 mit einer bereits ausgewählten Farbe beginnen, können Sie den RGB-Wert online abrufen ( http://imagecolorpicker.com ) und die als UIColor definierten Werte verwenden. Diese Lösung implementiert sie als Hintergrund:

    @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 hat dies oben in den Kommentaren erwähnt und es ist wichtig, den CGFloat mit einem einzelnen Dezimalpunkt zu definieren

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

Dies kann einfach mithilfe dieser Initialisierung erfolgen

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