如何在Swift中使用UIColorFromRGB?


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中使用它?


Answers:


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 let DarkBlue:UInt = 0x1f5e75 static let Blue:UInt = 0x3f7589 static let LightBlue:UInt = 0x7fa3b0}
Javier CalatravaLlavería2015年

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
如果将其放在括号中(如第二个括号),然后将第一个数字作为十进制数字放在“ /”符号前面,则原始格式会起作用,因此它不会截断为整数。
安迪·莱博维茨

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之后是任何十六进制颜色-color-hex.com
bloudermilk

我懂了。很有用!感谢@bloudermilk
Cons Bulaquena


38

以编程方式添加颜色的最简单方法是使用ColorLiteral

只需添加示例中所示的ColorLiteral属性,Xcode就会提示您完整的颜色列表,供您选择。这样做的好处是更少的代码,添加HEX值或RGB。您还将从情节提要中获得最近使用的颜色。

示例: self.view.backgroundColor = ColorLiteral在此处输入图片说明


5
这真太了不起了 !
Vaibhav Saran '18

感谢您分享此快速手..新的学习.. :)
Ameer

32

如果您从字符串(而不是十六进制)开始,则此函数需要一个十六进制字符串并返回UIColor。
(您可以输入以下格式的十六进制字符串:#ffffffffffff

用法:

var color1 = hexStringToUIColor("#d3d3d3")

斯威夫特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)
    )
}

斯威夫特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)
    )
}

斯威夫特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


13

对于Xcode 9,使用UIColorRGB值。

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

预习:

具有自定义RGB颜色的按钮预览

请参阅有关UIColor的其他Apple文档



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)

我迅速使用了以下内容:let isItAnswer = false;
亚历山大·沃尔科夫

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)

3

这很快为我工作。试试这个

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

3

添加快速3选项:

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

2

您不能像#define UIColorFromRGB(rgbValue)swift 那样使用复杂的宏。快速替换简单宏是全局常量,例如

let FADE_ANIMATION_DURATION = 0.35

swift仍然不支持接受参数的复杂宏。你可以改用功能

复杂宏用于C和Objective-C,但在Swift中却没有。复杂宏是不定义常量的宏,包括带括号的类似于函数的宏。您可以在C和Objective-C中使用复杂的宏,以避免类型检查约束或避免重新键入大量样板代码。但是,宏会使调试和重构变得困难。在Swift中,您可以使用函数和泛型来获得相同的结果而不会做出任何妥协。因此,C和Objective-C源文件中的复杂宏无法用于您的Swift代码。

摘自将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

内特·库克的答案是绝对正确的。为了获得更大的灵活性,我在包装中保留了以下功能:

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

我可以看到它已经得到答复,但仍然希望一支班轮能够以更好的方式提供帮助。

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")
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.