Bagaimana saya bisa menggunakan UIColorFromRGB di Swift?


110

Di Objective-C, kami menggunakan kode ini untuk mengatur kode warna RGB untuk tampilan:

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

Bagaimana saya bisa menggunakan ini di Swift?


Jawaban:


169

Berikut adalah versi Swift dari fungsi itu (untuk mendapatkan representasi UIColor dari sebuah UIntnilai):

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
Jika Anda meneruskan konstanta warna yang ditentukan ke fungsi ini, jangan lupa untuk mengubah tipe konstanta ke: UInt. misalnya warna struct {statis biarkan DarkBlue: UInt = 0x1f5e75 statis biarkan Biru: UInt = 0x3f7589 statis biarkan LightBlue: UInt = 0x7fa3b0}
Javier Calatrava Llavería

129

Saya ingin meletakkan

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

tapi itu tidak berhasil.

Jadi saya menggunakan:
Untuk Swift

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

Jadi ini solusi yang saya temukan.


33
biarkan warna: UIColor = UIColor (merah: CGFloat (0 / 255.0), hijau: CGFloat (110 / 255.0), biru: CGFloat (255 / 255.0), alpha: CGFloat (1.0))
Vadym

1
Kode asli akan berfungsi jika Anda memasukkannya ke dalam tanda kurung (seperti yang kedua), dan meletakkan angka pertama di depan tanda "/" sebagai angka desimal sehingga tidak dipotong menjadi bilangan bulat.
Andy Lebowitz

64

Saya sangat menyukai jawaban Nate Cook tetapi saya menginginkan sesuatu yang lebih idiomatis. Saya yakin ini adalah kasus penggunaan yang sangat bagus untuk penginisialisasi praktis melalui ekstensi khusus.

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

Ini sekarang dapat digunakan seperti ini:

view.backgroundColor = UIColor(rgb: 0x209624)

Saya hanya akan merekomendasikan kelas UIKit menambal monyet seperti ini dalam kode klien Anda sendiri, bukan perpustakaan.


Di mana saya bisa mendapatkan nilai rgb 0x209624?
Kontra Bulaquena

@ConsBulaquena itu hanya 0xdiikuti oleh warna hex apa pun - color-hex.com
bloudermilk

Saya melihat. Sangat berguna! Terima kasih @bloudermilk
Cons Bulaquena

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

38

Cara termudah untuk menambahkan warna secara terprogram adalah dengan menggunakan ColorLiteral .

Cukup tambahkan properti ColorLiteral seperti yang ditunjukkan pada contoh, Xcode akan meminta Anda dengan seluruh daftar warna yang dapat Anda pilih. Keuntungan melakukannya adalah kode yang lebih sedikit, tambahkan nilai HEX atau RGB . Anda juga akan mendapatkan warna yang baru-baru ini digunakan dari storyboard.

Contoh: self.view.backgroundColor = ColorLiteralmasukkan deskripsi gambar di sini


5
ini luar biasa !
Vaibhav Saran

terima kasih telah berbagi panduan cepat ini .. pembelajaran baru .. :)
Ameer

32

Jika Anda memulai dari string (bukan hex), ini adalah fungsi yang mengambil string hex dan mengembalikan UIColor.
(Anda dapat memasukkan string hex dengan salah satu format: #ffffffatau ffffff)

Pemakaian:

var color1 = hexStringToUIColor("#d3d3d3")

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

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

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



Sumber: arshad / gist: de147c42d7b3063ef7bc



6

UIColorFromRGB di Swift 4

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

5

Saya telah menggunakan yang berikut ini dengan cepat.

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)

Saya telah menggunakan yang berikut ini dengan cepat: let isItAnswer = false;
Alexander Volkov

4

solusi untuk format 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
        )
    }
}

pemakaian:

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

3

Ini bekerja untuk saya dengan cepat. Coba ini

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

3

menambahkan opsi 3 cepat:

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

2

Anda tidak dapat menggunakan makro yang kompleks seperti #define UIColorFromRGB(rgbValue)di swift. Penggantian makro sederhana secara cepat seperti konstanta global

let FADE_ANIMATION_DURATION = 0.35

Namun makro kompleks yang menerima parameter tidak didukung oleh swift. Anda bisa menggunakan fungsi sebagai gantinya

Makro kompleks digunakan di C dan Objective-C tetapi tidak memiliki pasangan di Swift. Makro kompleks adalah makro yang tidak mendefinisikan konstanta, termasuk makro yang mirip fungsi dalam tanda kurung. Anda menggunakan makro kompleks di C dan Objective-C untuk menghindari batasan pemeriksaan tipe atau untuk menghindari mengetik ulang kode boilerplate dalam jumlah besar. Namun, makro dapat mempersulit proses debug dan pemfaktoran ulang. Di Swift, Anda dapat menggunakan fungsi dan generik untuk mencapai hasil yang sama tanpa kompromi. Oleh karena itu, makro kompleks yang ada di file sumber C dan Objective-C tidak tersedia untuk kode Swift Anda.

Kutipan dari Menggunakan swift dengan kakao dan tujuan C

Periksa jawaban @Nate Cooks untuk versi Swift dari fungsi yang akan digunakan di sini


2

Anda dapat menggunakan ini:

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

1

Jawaban Nate Cook benar sekali. Hanya untuk fleksibilitas yang lebih besar, saya menyimpan fungsi berikut dalam paket saya:

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

Dan inilah cara saya menggunakannya:

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

Semoga ini bisa membantu. Semuanya diuji dengan Swift 3 / Xcode 8.


0

Ini adalah ekstensi yang bagus untuk UIColor. Anda dapat menggunakan nilai enum (hex, string) dan nilai string langsung saat Anda membuat objek UIColor.

Ekstensi yang layak kami dapatkan https://github.com/ioramashvili/UsefulExtensions/blob/master/Extensions.playground/Pages/UIColor.xcplaygroundpage/Contents.swift


Meskipun ini secara teoritis dapat menjawab pertanyaan, akan lebih baik jika menyertakan bagian penting dari jawaban di sini, dan menyediakan tautan untuk referensi.
Tobi Nary

0

Saya bisa melihat ini sudah dijawab tetapi masih berharap satu liner akan membantu dengan cara yang lebih baik.

import UIKit

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

Diperbarui:: Perubahan dilakukan sesuai contoh yang dijelaskan oleh Penulis pertanyaan untuk memberikan nilai hex


0

Di Swift3, jika Anda memulai dengan warna yang telah Anda pilih, Anda bisa mendapatkan nilai RGB secara online ( http://imagecolorpicker.com ) dan menggunakan nilai tersebut yang didefinisikan sebagai UIColor. Solusi ini mengimplementasikannya sebagai latar belakang:

    @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 menyebutkan ini di atas di komentar dan penting untuk mendefinisikan CGFloat dengan satu titik desimal


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

Itu dapat dilakukan dengan mudah dengan menggunakan inisialisasi ini

view.backgroundColor = UIColor(hex: "067AB5")
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.