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?


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)

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.


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.


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)

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


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



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

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)

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)

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

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

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


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)

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.


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


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


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


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

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

view.backgroundColor = UIColor(hex: "067AB5")
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.