如何在 Swift 中使用 UIColorFromRGB?

在 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 里用这个?

222552 次浏览

你不能在 Swift 中使用像 #define UIColorFromRGB(rgbValue)这样的复杂宏。雨燕中简单宏的替换是全局常量,如

let FADE_ANIMATION_DURATION = 0.35

接受参数的复杂宏仍然不能被迅速支持。你可以用函数来代替

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

节选自 Using swift with cocoa and objective C

查看@Nate Cooks,找到这个函数在这里使用的 Swift 版本

下面是该函数的 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)

I wanted to put

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

但是这并没有奏效

所以我用了: < br/> < strong > For Swift

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

这就是我找到的变通方法。

我真的很喜欢内特 · 库克的回答,但是我想要一些更加地道的回答。我相信这是一个通过自定义扩展实现方便的初始化程序的非常好的用例。

// 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 类进行修补,而不是对库进行修补。

如果你从一个字符串(不是十六进制)开始,这是一个接受十六进制字符串并返回 UIColor 的函数。
(You can enter hex strings with either format: #ffffff or ffffff)

用法:

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

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

我已经迅速地使用了以下内容。

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)

You can use this:

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

This is worked for me in swift. Try this

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

这是 UIColor 的一个很好的扩展。在创建 UIColor 对象时,可以使用枚举值(十六进制、字符串)和直接字符串值。

这是我们应得的延期 https://github.com/ioramashvili/UsefulExtensions/blob/master/Extensions.playground/Pages/UIColor.xcplaygroundpage/Contents.swift

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

usage:

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

我可以看到它已经被回答,但仍然希望一个班轮将帮助在更好的方式。

import UIKit


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

Updated: :Changes done as per example explained by Author of question to provide hex values

在 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 非常重要

内特 · 库克的回答完全正确。 为了更加灵活,我在包中保留了以下功能:

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)

希望这个能帮上忙。 Everything is tested with Swift 3/Xcode 8.

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

只需添加属性 ColorLiteral,如示例所示,Xcode 就会提示您可以选择的整个颜色列表。这样做的优点是代码较少,添加十六进制值或 RGB。您还将从故事板中获得最近使用的颜色。

self.view.backgroundColor = ColorLiteral< img src = “ https://i.stack.imgur.com/jH79S.png”alt = “ enter image description here”> < img src = “ https://i.stack.imgur.com/jH79S.png”alt = “ enter image description here”>

增加一个快速的3种选择:

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

对于 Xcode 9,使用具有 RGB 值的 UIColor

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

预览:

button preview with custom RGB color

请参阅附加 关于 UIColor 的 Apple 文档

Swift 4中的 UIColorFromRGB

button.layer.backgroundColor = UIColor(red: 112.0/255, green: 86.0/255, blue: 164.0/255, alpha: 1.0).cgColor
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)


}
}

Https://uiwjs.github.io/ui-color/

SwiftUI

Color(red: 1.33, green: 0.56, blue: 0.56).opacity(0.61)

为 iOS 而奋斗

UIColor(red: 1.33, green: 0.56, blue: 0.56, alpha: 0.61)

MacOS 的 Swift

NSColor(red: 1.33, green: 0.56, blue: 0.56, alpha: 0.61)

用于 iOS 的 Objective-C

[UIColor colorWithRed: 1.33 green: 0.56 blue: 0.56 alpha: 0.61];

Objective-C for macOS

[NSColor colorWithCalibratedRed: 1.33 green: 0.56 blue: 0.56 alpha: 0.61];

enter image description here

Swift 5 + +

只要使用这个扩展

 extension UIColor {
convenience init(r: CGFloat,g:CGFloat,b:CGFloat,a:CGFloat = 1) {
self.init(
red: r / 255.0,
green: g / 255.0,
blue: b / 255.0,
alpha: a
)
}
}

使用

 // Example 1
let color = UIColor(r: 255.0, g: 152.0, b: 56.0)


// Example 2
let color2 = UIColor(r: 255.0, g: 152.0, b: 56.0,a: 1.0)

我在用:

 extension UIColor {
static func rgba(_ red: Int, _ green: Int, _ blue: Int, _ alpha: Double) -> UIColor {
assert(red >= 0 && red <= 255, "Invalid red component")
assert(green >= 0 && green <= 255, "Invalid green component")
assert(blue >= 0 && blue <= 255, "Invalid blue component")
    

return self.init(red: CGFloat(red) / 255.0,
green: CGFloat(green) / 255.0,
blue: CGFloat(blue) / 255.0,
alpha: alpha)
}
}