ฉันจะใช้ UIColorFromRGB ใน Swift ได้อย่างไร


110

ใน Objective-C เราใช้รหัสนี้เพื่อตั้งรหัสสี RGB สำหรับมุมมอง:

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

ฉันจะใช้สิ่งนี้ใน Swift ได้อย่างไร


คำตอบ:


169

นี่คือเวอร์ชัน Swift ของฟังก์ชันนั้น (สำหรับการแสดงUIntค่า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
หากคุณส่งค่าคงที่ของสีที่กำหนดไปยังฟังก์ชันนี้อย่าลืมส่งประเภทค่าคงที่ไปที่: UInt เช่น struct Color {static ให้ DarkBlue: UInt = 0x1f5e75 static ให้ Blue: UInt = 0x3f7589 static ให้ LightBlue: UInt = 0x7fa3b0}
Javier Calatrava Llavería

129

ฉันต้องการที่จะใส่

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

แต่ไม่ได้ผล

ดังนั้นฉันจึงใช้:
สำหรับ Swift

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

นี่คือวิธีแก้ปัญหาที่ฉันพบ


33
ให้สี: UIColor = UIColor (สีแดง: CGFloat (0 / 255.0), สีเขียว: CGFloat (110/255.0), สีน้ำเงิน: CGFloat (255 / 255.0), อัลฟา: CGFloat (1.0))
Vadym

1
ต้นฉบับจะใช้งานได้ถ้าคุณใส่ไว้ในวงเล็บ (เช่นตัวที่สอง) และใส่ตัวเลขแรกหน้าเครื่องหมาย "/" เป็นเลขฐานสิบเพื่อที่จะไม่ตัดทอนเป็นจำนวนเต็ม
Andy Lebowitz

64

ฉันชอบคำตอบของ Nate Cook มาก แต่ฉันต้องการอะไรที่เป็นสำนวนมากกว่านี้ ฉันเชื่อว่านี่เป็นกรณีการใช้งานที่ดีจริงๆสำหรับตัวเริ่มต้นที่สะดวกสบายผ่านส่วนขยายที่กำหนดเอง

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

ตอนนี้สามารถใช้งานได้ดังนี้:

view.backgroundColor = UIColor(rgb: 0x209624)

ฉันอยากจะแนะนำให้ลิงแก้ไขคลาส UIKit เช่นนี้ในรหัสไคลเอนต์ของคุณเองไม่ใช่ไลบรารี


ฉันจะรับค่า rgb 0x209624 ได้ที่ไหน
Cons Bulaquena

@ConsBulaquena 0xตามด้วยสี hex ใดก็ได้ - color-hex.com
bloudermilk

ฉันเห็น. มีประโยชน์มาก! ขอบคุณ @bloudermilk
Cons Bulaquena


38

วิธีที่ง่ายที่สุดในการเพิ่มสีโดยใช้โปรแกรมคือการใช้ColorLiteral ColorLiteral

เพียงเพิ่มคุณสมบัติ ColorLiteral ตามที่แสดงในตัวอย่าง Xcode จะแจ้งรายการสีทั้งหมดที่คุณสามารถเลือกได้ ประโยชน์ของการทำเช่นนั้นเป็นรหัสที่น้อยกว่าค่าเพิ่ม HEX หรือ RGB นอกจากนี้คุณยังจะได้รับสีที่ใช้ล่าสุดจากกระดานเรื่องราว

ตัวอย่าง: self.view.backgroundColor = ColorLiteralใส่คำอธิบายภาพที่นี่


5
สิ่งนี้ช่างมหัศจรรย์ !
Vaibhav Saran

1
ขอบคุณที่แบ่งปัน.. การเรียนรู้ใหม่ .. :)
Ameer

32

หากคุณเริ่มต้นจากสตริง (ไม่ใช่เลขฐานสิบหก) ฟังก์ชันนี้จะใช้สตริงเลขฐานสิบหกและส่งคืน UIColor
(คุณสามารถป้อนสตริงเลขฐานสิบหกด้วยรูปแบบใดก็ได้: #ffffffหรือffffff)

การใช้งาน:

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



ที่มา: arshad / gist: de147c42d7b3063ef7bc




5

ฉันได้ใช้สิ่งต่อไปนี้อย่างรวดเร็ว

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)

ฉันได้ใช้สิ่งต่อไปนี้อย่างรวดเร็ว: ให้ isItAnswer = false;
Alexander Volkov

4

โซลูชันสำหรับรูปแบบ 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
        )
    }
}

การใช้งาน:

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



2

คุณไม่สามารถใช้มาโครที่ซับซ้อนได้#define UIColorFromRGB(rgbValue)อย่างรวดเร็ว การแทนที่มาโครธรรมดาอย่างรวดเร็วคือค่าคงที่ทั่วโลกเช่น

let FADE_ANIMATION_DURATION = 0.35

ยังคงไม่รองรับมาโครที่ซับซ้อนที่ยอมรับพารามิเตอร์อย่างรวดเร็ว คุณสามารถใช้ฟังก์ชันแทนได้

มาโครที่ซับซ้อนใช้ใน C และ Objective-C แต่ไม่มีคู่ใน Swift มาโครที่ซับซ้อนคือมาโครที่ไม่ได้กำหนดค่าคงที่รวมถึงมาโครที่เหมือนฟังก์ชันในวงเล็บ คุณใช้มาโครที่ซับซ้อนใน C และ Objective-C เพื่อหลีกเลี่ยงข้อ จำกัด ในการตรวจสอบประเภทหรือเพื่อหลีกเลี่ยงการพิมพ์รหัสสำเร็จรูปจำนวนมาก อย่างไรก็ตามมาโครสามารถทำให้การดีบักและการปรับโครงสร้างใหม่ทำได้ยาก ใน Swift คุณสามารถใช้ฟังก์ชันและข้อมูลทั่วไปเพื่อให้ได้ผลลัพธ์เดียวกันโดยไม่มีการประนีประนอมใด ๆ ดังนั้นมาโครที่ซับซ้อนที่อยู่ในซอร์สไฟล์ C และ Objective-C จะไม่สามารถใช้ได้กับโค้ด Swift ของคุณ

ตัดตอนมาจากการใช้อย่างรวดเร็วกับโกโก้และวัตถุประสงค์ C

ตรวจสอบคำตอบของ @Nate Cooks สำหรับเวอร์ชัน Swift ของฟังก์ชันนั้นที่จะใช้ที่นี่


2

คุณสามารถใช้สิ่งนี้:

//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 นั้นถูกต้องที่สุด เพื่อความยืดหยุ่นที่มากขึ้นฉันเก็บฟังก์ชันต่อไปนี้ไว้ในชุดของฉัน:

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

และนี่คือวิธีที่ฉันใช้:

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

หวังว่านี่จะช่วยได้ ทุกอย่างผ่านการทดสอบด้วย Swift 3 / Xcode 8


0

นี่เป็นส่วนขยายที่ดีสำหรับ UIColor คุณสามารถใช้ค่า enum (เลขฐานสิบหกสตริง) และค่าสตริงโดยตรงเมื่อคุณสร้างวัตถุ UIColor

ส่วนขยายที่เราสมควรได้รับ https://github.com/ioramashvili/UsefulExtensions/blob/master/Extensions.playground/Pages/UIColor.xcplaygroundpage/Contents.swift


ในขณะนี้อาจตอบคำถามในทางทฤษฎีได้ แต่ควรรวมส่วนสำคัญของคำตอบไว้ที่นี่และระบุลิงก์สำหรับการอ้างอิง
Tobi Nary

0

ฉันเห็นคำตอบแล้ว แต่ก็ยังหวังว่าซับหนึ่งจะช่วยในทางที่ดีขึ้น

import UIKit

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

อัปเดต::การเปลี่ยนแปลงที่ทำตามตัวอย่างที่ผู้เขียนคำถามอธิบายเพื่อระบุค่าฐานสิบหก


0

ใน Swift3 หากคุณเริ่มต้นด้วยสีที่คุณเลือกแล้วคุณสามารถรับค่า RGB ทางออนไลน์ ( http://imagecolorpicker.com ) และใช้ค่าเหล่านั้นที่กำหนดเป็น UIColor โซลูชันนี้ใช้เป็นพื้นหลัง:

    @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 กล่าวถึงสิ่งนี้ข้างต้นในความคิดเห็นและเป็นสิ่งสำคัญที่จะต้องกำหนด CGFloat ด้วยจุดทศนิยมเดียว


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

ซึ่งสามารถทำได้ง่ายๆโดยใช้การเริ่มต้นนี้

view.backgroundColor = UIColor(hex: "067AB5")
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.