Làm cách nào để sử dụng UIColorFromRGB trong Swift?


110

Trong Objective-C, chúng tôi sử dụng mã này để đặt mã màu RGB cho các chế độ xem:

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

Làm cách nào để sử dụng nó trong Swift?


Câu trả lời:


169

Đây là phiên bản Swift của hàm đó (để nhận biểu diễn UIColor của một UIntgiá trị):

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
Nếu bạn truyền một hằng số màu đã xác định cho hàm này, đừng quên ép kiểu hằng số thành: UInt. ví dụ: struct Color {static let DarkBlue: UInt = 0x1f5e75 static let Blue: UInt = 0x3f7589 static let LightBlue: UInt = 0x7fa3b0}
Javier Calatrava Llavería

129

Tôi muốn đặt

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

nhưng điều đó đã không hoạt động.

Vì vậy, tôi đã sử dụng:
Đối với Swift

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

Vì vậy, đây là cách giải quyết mà tôi đã tìm thấy.


33
hãy để màu: UIColor = UIColor (màu đỏ: CGFloat (0 / 255,0), xanh lá cây: CGFloat (110 / 255,0), màu xanh: CGFloat (255 / 255,0), alpha: CGFloat (1,0))
Vadym

1
Bản gốc sẽ hoạt động nếu bạn đặt nó trong dấu ngoặc đơn (như số thứ hai) và đặt các số đầu tiên trước dấu "/" dưới dạng số thập phân để nó không bị cắt bớt thành số nguyên.
Andy Lebowitz

64

Tôi thực sự thích câu trả lời của Nate Cook nhưng tôi muốn điều gì đó thành ngữ hơn một chút. Tôi tin rằng đây là một trường hợp sử dụng thực sự tốt cho một trình khởi tạo tiện lợi thông qua một phần mở rộng tùy chỉnh.

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

Điều này bây giờ có thể được sử dụng như vậy:

view.backgroundColor = UIColor(rgb: 0x209624)

Tôi chỉ khuyên bạn nên vá các lớp UIKit như thế này trong mã máy khách của riêng bạn, không phải thư viện.


Tôi lấy giá trị rgb 0x209624 ở đâu?
Nhược điểm Bulaquena

@ConsBulaquena nó chỉ 0xtiếp theo bất kỳ màu hex - color-hex.com
bloudermilk

Tôi hiểu rồi. Rất hữu ích! Cảm ơn @bloudermilk
Cons Bulaquena Ngày

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

38

Cách đơn giản nhất để thêm màu theo chương trình là sử dụng ColorLiteral .

Chỉ cần thêm thuộc tính ColorLiteral như được hiển thị trong ví dụ, Xcode sẽ nhắc bạn với toàn bộ danh sách các màu mà bạn có thể chọn. Lợi thế của việc làm như vậy là ít mã hơn, thêm giá trị HEX hoặc RGB . Bạn cũng sẽ nhận được các màu được sử dụng gần đây từ bảng phân cảnh.

Ví dụ: self.view.backgroundColor = ColorLiteralnhập mô tả hình ảnh ở đây


5
Thật đáng kinh ngạc !
Vaibhav Saran

cảm ơn vì đã chia sẻ nhanh tay này .. học mới .. :)
Ameer

32

Nếu bạn đang bắt đầu từ một chuỗi (không phải hex) thì đây là một hàm nhận một chuỗi hex và trả về một UIColor.
(Bạn có thể nhập chuỗi hex với một trong hai định dạng: #ffffffhoặc ffffff)

Sử dụng:

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



Nguồn: arshad / gist: de147c42d7b3063ef7bc



6

UIColorFromRGB trong Swift 4

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

5

Tôi đã sử dụng những điều sau đây một cách nhanh chóng.

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)

Tôi đã sử dụng như sau trong nhanh chóng: let isItAnswer = false;
Alexander Volkov

4

giải pháp cho định dạng 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
        )
    }
}

sử dụng:

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

3

Điều này được làm cho tôi nhanh chóng. Thử cái này

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

3

thêm tùy chọn 3 nhanh chóng:

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

2

Bạn không thể sử dụng một macro phức tạp như #define UIColorFromRGB(rgbValue)nhanh chóng. Sự thay thế của macro đơn giản trong nhanh chóng là các hằng số toàn cầu như

let FADE_ANIMATION_DURATION = 0.35

Tuy nhiên, các macro phức tạp chấp nhận tham số không được hỗ trợ bởi swift. bạn có thể sử dụng các chức năng thay thế

Các macro phức tạp được sử dụng trong C và Objective-C nhưng không có đối tác trong Swift. Macro phức tạp là các macro không xác định các hằng số, bao gồm các macro được đặt trong ngoặc đơn, giống như hàm. Bạn sử dụng macro phức tạp trong C và Objective-C để tránh các ràng buộc kiểm tra kiểu hoặc để tránh nhập lại một lượng lớn mã soạn sẵn. Tuy nhiên, macro có thể gây khó khăn cho việc gỡ lỗi và cấu trúc lại. Trong Swift, bạn có thể sử dụng các hàm và generic để đạt được kết quả tương tự mà không có bất kỳ sự thỏa hiệp nào. Do đó, các macro phức tạp trong các tệp nguồn C và Objective-C không được cung cấp cho mã Swift của bạn.

Trích từ Sử dụng yến với ca cao và vật kính C

Kiểm tra câu trả lời của @Nate Cooks để biết phiên bản Swift của hàm đó sẽ được sử dụng tại đây


2

Bạn có thể sử dụng cái này:

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

1

Câu trả lời của Nate Cook là hoàn toàn chính xác. Chỉ để linh hoạt hơn, tôi giữ các chức năng sau trong gói của mình:

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

Và đây là cách tôi sử dụng chúng:

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

Hy vọng điều này sẽ giúp ích. Mọi thứ đều được thử nghiệm với Swift 3 / Xcode 8.


0

Đây là một phần mở rộng tuyệt vời cho UIColor. Bạn có thể sử dụng các giá trị enum (hex, string) và các giá trị chuỗi trực tiếp khi bạn tạo các đối tượng UIColor.

Tiện ích mở rộng mà chúng tôi đáng có https://github.com/ioramashvili/UsefulExtensions/blob/master/Extensions.playground/Pages/UIColor.xcplaygroundpage/Contents.swift


Mặc dù về mặt lý thuyết, điều này có thể trả lời câu hỏi, nhưng tốt hơn hết bạn nên đưa các phần thiết yếu của câu trả lời vào đây và cung cấp liên kết để tham khảo.
Tobi Nary

0

Tôi có thể thấy nó đã được trả lời nhưng vẫn hy vọng một lớp lót sẽ giúp theo cách tốt hơn.

import UIKit

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

Đã cập nhật:: Các thay đổi được thực hiện theo ví dụ được Tác giả câu hỏi giải thích để cung cấp giá trị hex


0

Trong Swift3, nếu bạn đang bắt đầu với màu mà bạn đã chọn, bạn có thể lấy giá trị RGB trực tuyến ( http://imagecolorpicker.com ) và sử dụng các giá trị đó được xác định là UIColor. Giải pháp này thực hiện chúng làm nền:

    @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 đã đề cập điều này ở trên trong các nhận xét và điều quan trọng là phải xác định CGFloat bằng một dấu thập phân duy nhất


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

Điều đó có thể được thực hiện đơn giản bằng cách sử dụng khởi tạo này

view.backgroundColor = UIColor(hex: "067AB5")
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.