UIColorFromRGB'yi Swift'de nasıl kullanabilirim?


110

Objective-C'de, görünümler için RGB renk kodlarını ayarlamak için bu kodu kullanırız:

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

Bunu Swift'de nasıl kullanabilirim?


Yanıtlar:


169

İşte bu işlevin bir Swift sürümü (bir UIntdeğerin UIColor temsilini elde etmek için ):

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
Bu işleve tanımlı bir renk sabiti iletirseniz, sabit türü şu konuma dönüştürmeyi unutmayın: UInt. eg struct Color {static let DarkBlue: UInt = 0x1f5e75 static let Blue: UInt = 0x3f7589 static let LightBlue: UInt = 0x7fa3b0}
Javier Calatrava Llavería

129

Koymak istedim

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

ama bu işe yaramadı.

Ben de kullandım:
Swift için

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

İşte bulduğum geçici çözüm bu.


33
let color: UIColor = UIColor (kırmızı: CGFloat (0 / 255.0), yeşil: CGFloat (110 / 255.0), mavi: CGFloat (255 / 255.0), alfa: CGFloat (1.0))
Vadym

1
Orijinali, parantez içine koyarsanız (ikinci gibi) ve ilk sayıları "/" işaretinin önüne ondalık sayı olarak koyarsanız işe yarardı, böylece tam sayıya kadar kesilmez.
Andy Lebowitz

64

Nate Cook'un cevabını gerçekten beğendim ama biraz daha deyimsel bir şey istedim. Bunun, özel bir uzantı aracılığıyla kullanışlı bir başlatıcı için gerçekten iyi bir kullanım durumu olduğuna inanıyorum.

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

Bu artık şu şekilde kullanılabilir:

view.backgroundColor = UIColor(rgb: 0x209624)

Ben sadece kendi istemci kodunuzda bu gibi UIKit sınıflarını kitaplıklarda değil maymunlara yamalamanızı tavsiye ederim.


0x209624 rgb değerini nereden alabilirim?
Eksileri Bulaquena

@ConsBulaquena, 0xardından herhangi bir onaltılık renk geliyor - color-hex.com
bloudermilk

Anlıyorum. Çok kullanışlı! Teşekkürler @bloudermilk
Cons Bulaquena

46
myLabel.backgroundColor = UIColor(red: 50.0/255, green: 150.0/255, blue: 65.0/255, alpha: 1.0)

38

Programlı olarak renk eklemenin en basit yolu ColorLiteral kullanmaktır .

Örnekte gösterildiği gibi ColorLiteral özelliğini eklemeniz yeterlidir, Xcode size seçebileceğiniz tam bir renk listesi verecektir. Bunu yapmanın avantajı daha az kod, HEX değerleri veya RGB eklemektir . Son zamanlarda kullanılan renkleri film şeridinden de alacaksınız.

Örnek: self.view.backgroundColor = ColorLiteralgörüntü açıklamasını buraya girin


5
bu harika !
Vaibhav Saran

1
bu hızlı eli paylaştığınız için teşekkürler .. yeni öğrenim .. :)
Ameer

32

Bir dizeden (onaltılık değil) başlıyorsanız, bu, onaltılık bir dize alan ve bir UIColor döndüren bir işlevdir.
(Onaltılık dizeleri şu formatlardan birinde girebilirsiniz: #ffffffveya ffffff)

Kullanımı:

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



Kaynak: arshad / gist: de147c42d7b3063ef7bc



7

Swift 4'te UIColorFromRGB

button.layer.backgroundColor = UIColor(red: 112.0/255, green: 86.0/255, blue: 164.0/255, alpha: 1.0).cgColor

5

Aşağıdakileri hızlı bir şekilde kullandım.

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)

Aşağıdakileri swift'te kullandım: let isItAnswer = false;
Alexander Volkov

4

argb formatı için çözüm:

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

kullanımı:

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

3

Bu benim için hızlı bir şekilde çalıştı. Bunu dene

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

3

hızlı bir 3 seçeneği eklemek:

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

2

Swift'deki gibi karmaşık bir makro kullanamazsınız #define UIColorFromRGB(rgbValue). Basit makronun hızlı bir şekilde değiştirilmesi gibi küresel sabitler

let FADE_ANIMATION_DURATION = 0.35

Yine de parametreleri kabul eden karmaşık makrolar swift tarafından desteklenmemektedir. bunun yerine fonksiyonları kullanabilirsin

Karmaşık makrolar C ve Objective-C'de kullanılır ancak Swift'de karşılıkları yoktur. Karmaşık makrolar, parantezli, işlev benzeri makrolar dahil olmak üzere sabitleri tanımlamayan makrolardır. Yazım denetimi kısıtlamalarını önlemek veya büyük miktarlarda standart kodun yeniden yazılmasını önlemek için C ve Objective-C'de karmaşık makrolar kullanırsınız. Ancak, makrolar hata ayıklamayı ve yeniden düzenlemeyi zorlaştırabilir. Swift'de, hiçbir ödün vermeden aynı sonuçları elde etmek için işlevleri ve jenerikleri kullanabilirsiniz. Bu nedenle, C ve Objective-C kaynak dosyalarındaki karmaşık makrolar Swift kodunuz için kullanılamaz.

Kaynaktan alıntı Swift ile kakao kullanımından ve C hedefi

Burada kullanılacak bu işlevin Swift sürümü için @Nate Cooks yanıtını kontrol edin


2

Bunu kullanabilirsiniz:

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

1

Nate Cook'un cevabı kesinlikle doğru. Daha fazla esneklik için, aşağıdaki işlevleri paketimde tutuyorum:

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

Ve onları böyle kullanıyorum:

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

Umarım bu yardımcı olur. Her şey Swift 3 / Xcode 8 ile test edildi.



0

Zaten yanıtlanmış olduğunu görebiliyorum, ancak yine de bir astarın daha iyi bir şekilde yardımcı olacağını umuyorum.

import UIKit

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

Güncellenmiş:: Onaltılık değerler sağlamak için soru yazarı tarafından açıklanan örneğe göre yapılan değişiklikler


0

Swift3'te, önceden seçtiğiniz bir renkle başlıyorsanız, RGB değerini çevrimiçi olarak ( http://imagecolorpicker.com ) alabilir ve UIColor olarak tanımlanan değerleri kullanabilirsiniz. Bu çözüm onları bir arka plan olarak uygular:

    @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, yukarıdaki yorumlarda bundan bahsetti ve CGFloat'ı tek bir ondalık nokta ile tanımlamak önemlidir


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

Bu, bu başlatma kullanılarak basitçe yapılabilir

view.backgroundColor = UIColor(hex: "067AB5")
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.