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?


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)

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.


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.


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)

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


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



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

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)

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)

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

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

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


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)

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.


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


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


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


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

Dies kann einfach mithilfe dieser Initialisierung erfolgen

view.backgroundColor = UIColor(hex: "067AB5")
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.