Jak mogę używać UIColorFromRGB w Swift?

110

W Objective-C używamy tego kodu do ustawiania kodów kolorów RGB dla widoków:

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

Jak mogę tego używać w Swift?

NANNAV
źródło

Odpowiedzi:

169

Oto wersja tej funkcji w języku Swift (w celu uzyskania reprezentacji UIntwartości w formacie UIColor ):

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
źródło
1
Jeśli przekażesz zdefiniowaną stałą koloru do tej funkcji, nie zapomnij o rzutowaniu stałego typu na: UInt. np. struct Color {static let DarkBlue: UInt = 0x1f5e75 static let Blue: UInt = 0x3f7589 static let LightBlue: UInt = 0x7fa3b0}
Javier Calatrava Llavería
129

Chciałem położyć

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

ale to nie zadziałało.

Więc użyłem:
dla Swift

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

To jest obejście, które znalazłem.

user3153627
źródło
33
let color: UIColor = UIColor (czerwony: CGFloat (0 / 255,0), zielony: CGFloat (110 / 255,0), niebieski: CGFloat (255 / 255,0), alpha: CGFloat (1.0))
Vadym
1
Oryginał zadziałałby, gdybyśmy umieścili go w nawiasach (podobnie jak druga) i umieściliby pierwsze liczby przed znakiem „/” jako liczbę dziesiętną, aby nie zostały obcięte do liczby całkowitej.
Andy Lebowitz
64

Bardzo podobała mi się odpowiedź Nate'a Cooka, ale chciałem czegoś bardziej idiomatycznego. Uważam, że jest to naprawdę dobry przypadek użycia wygodnego inicjatora za pomocą niestandardowego rozszerzenia.

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

Teraz można tego użyć w następujący sposób:

view.backgroundColor = UIColor(rgb: 0x209624)

Zalecałbym małpę łatanie takich klas UIKit w swoim własnym kodzie klienta, a nie w bibliotekach.

bloudermilk
źródło
Gdzie znajdę wartość rgb 0x209624?
Cons Bulaquena
@ConsBulaquena po 0xnim następuje dowolny kolor szesnastkowy - color-hex.com
bloudermilk
Widzę. Bardzo przydatne! Dzięki @bloudermilk
Cons Bulaquena
46
myLabel.backgroundColor = UIColor(red: 50.0/255, green: 150.0/255, blue: 65.0/255, alpha: 1.0)
Ankit Goyal
źródło
38

Najprostszym sposobem programowego dodawania kolorów jest użycie ColorLiteral .

Po prostu dodaj właściwość ColorLiteral, jak pokazano w przykładzie, Xcode wyświetli monit z całą listą kolorów, które możesz wybrać. Zaletą takiego rozwiązania jest mniejszy kod, dodanie wartości HEX lub RGB . Otrzymasz również ostatnio używane kolory z storyboardu.

Przykład: self.view.backgroundColor = ColorLiteralwprowadź opis obrazu tutaj

puneeth
źródło
5
to jest niesamowite !
Vaibhav Saran
dzięki za podzielenie się tą szybką ręką .. nowa nauka .. :)
Ameer
32

Jeśli zaczynasz od łańcucha (nie szesnastkowego), jest to funkcja, która pobiera ciąg szesnastkowy i zwraca UIColor.
(Ciągi szesnastkowe można wprowadzić w dowolnym formacie: #fffffflub ffffff)

Stosowanie:

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



Źródło: arshad / gist: de147c42d7b3063ef7bc

Ethan Strider
źródło
13

W przypadku Xcode 9 użyj UIColorz wartościami RGB.

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

Zapowiedź:

podgląd przycisków z niestandardowym kolorem RGB

Zobacz dodatkową dokumentację Apple dotyczącą UIColor .

Wady Bulaquena
źródło
6

UIColorFromRGB w Swift 4

button.layer.backgroundColor = UIColor(red: 112.0/255, green: 86.0/255, blue: 164.0/255, alpha: 1.0).cgColor
Mahesh Chaudhari
źródło
5

Szybko użyłem następujących.

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
źródło
W swift użyłem następującego: let isItAnswer = false;
Alexander Volkov
4

rozwiązanie dla formatu 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
        )
    }
}

stosowanie:

var clearColor: UIColor = UIColor.init(argb: 0x00000000)
var redColor: UIColor = UIColor.init(argb: 0xFFFF0000)
Wiaczesław
źródło
3

To działa dla mnie szybko. Spróbuj tego

bottomBorder.borderColor = UIColor (red: 255.0/255.0, green: 215.0/255.0, blue: 60/255.0, alpha: 1.0).CGColor
Narasimha Nallamsetty
źródło
3

dodanie opcji swift 3:

cell.layer.borderColor = UIColor (red: 192.0/255.0, green: 192.0/255.0, blue: 197/255.0, alpha: 1.0).cgColor
David Sanford
źródło
2

Nie możesz używać złożonych makr, jak #define UIColorFromRGB(rgbValue)w swift. Zastąpienie prostego makra w swift to stałe globalne

let FADE_ANIMATION_DURATION = 0.35

Wciąż złożone makra akceptujące parametry nie są obsługiwane przez swift. możesz zamiast tego użyć funkcji

Złożone makra są używane w C i Objective-C, ale nie mają odpowiednika w Swift. Złożone makra to makra, które nie definiują stałych, w tym makra funkcyjne w nawiasach. Używasz złożonych makr w C i Objective-C, aby uniknąć ograniczeń związanych ze sprawdzaniem typu lub aby uniknąć ponownego wpisywania dużych ilości kodu standardowego. Jednak makra mogą utrudniać debugowanie i refaktoryzację. W Swift możesz używać funkcji i typów ogólnych, aby osiągnąć te same wyniki bez żadnych kompromisów. Dlatego złożone makra, które znajdują się w plikach źródłowych C i Objective-C, nie są udostępniane w kodzie Swift.

Fragment z Używanie Swift z kakao i celem C.

Sprawdź odpowiedź @Nate Cooks, aby uzyskać tutaj wersję Swift tej funkcji

Anil Varghese
źródło
2

Możesz użyć tego:

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

Odpowiedź Nate'a Cooka jest całkowicie poprawna. Dla większej elastyczności trzymam w zestawie następujące funkcje:

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

A tak ich używam:

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

Mam nadzieję, że to pomoże. Wszystko jest testowane w Swift 3 / Xcode 8.

Nick Ivanov
źródło
0

To fajne rozszerzenie dla UIColor. Podczas tworzenia obiektów UIColor można używać wartości wyliczeniowych (szesnastkowych, ciągowych) i bezpośrednich wartości ciągu.

Rozszerzenie, na które zasługujemy https://github.com/ioramashvili/UsefulExtensions/blob/master/Extensions.playground/Pages/UIColor.xcplaygroundpage/Contents.swift

shota
źródło
Chociaż może to teoretycznie odpowiedzieć na pytanie, lepiej byłoby zawrzeć tutaj zasadnicze części odpowiedzi i podać link do odniesienia.
Tobi Nary
0

Widzę, że została już udzielona, ​​ale nadal mam nadzieję, że jedna wkładka pomoże w lepszy sposób.

import UIKit

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

Zaktualizowano:: Zmiany dokonane zgodnie z przykładem wyjaśnionym przez autora pytania, aby podać wartości szesnastkowe

Ravindra Shekhawat
źródło
0

W Swift3, jeśli zaczynasz od koloru, który już wybrałeś, możesz pobrać wartość RGB online ( http://imagecolorpicker.com ) i użyć tych wartości zdefiniowanych jako UIColor. To rozwiązanie implementuje je jako tło:

    @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 wspomniał o tym powyżej w komentarzach i ważne jest, aby zdefiniować CGFloat z pojedynczym punktem dziesiętnym

RandallShanePhD
źródło
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
źródło
-3

Można to po prostu zrobić, używając tej inicjalizacji

view.backgroundColor = UIColor(hex: "067AB5")
Legowisko
źródło