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?

NANNAV
sumber
periksa developer
ini.apple.com/library/prerelease/ios/documentation/UIKit/…

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)
Nate Cook
sumber
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.

pengguna3153627
sumber
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.

bloudermilk.dll
sumber
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)
Ankit Goyal
sumber
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

puneeth
sumber
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

Ethan Strider
sumber
13

Untuk Xcode 9 , gunakan UIColordengan nilai RGB.

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

Pratinjau:

pratinjau tombol dengan warna RGB khusus

Lihat dokumentasi Apple tambahan tentang UIColor .

Kontra Bulaquena
sumber
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
Mahesh Chaudhari
sumber
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)
Imtee
sumber
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)
Vyacheslav
sumber
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
Narasimha Nallamsetty
sumber
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
David Sanford
sumber
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

Anil Varghese
sumber
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)
atiruz.dll
sumber
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.

Nick Ivanov
sumber
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

shota
sumber
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

Ravindra Shekhawat
sumber
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

RandallShanePhD
sumber
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
sumber
-3

Itu dapat dilakukan dengan mudah dengan menggunakan inisialisasi ini

view.backgroundColor = UIColor(hex: "067AB5")
Sarang
sumber