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.