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で使用するにはどうすればよいですか?


回答:


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íaDec

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
let color:UIColor = UIColor(red:CGFloat(0 / 255.0)、green:CGFloat(110 / 255.0)、blue:CGFloat(255 / 255.0)、alpha:CGFloat(1.0))
Vadym

1
(2番目のように)かっこで囲み、最初の数値を10進数として「/」記号の前に置くと、整数に切り捨てられないので、オリジナルは機能します。
アンディレボウィッツ

64

私はネイトクックの答えが本当に好きだったが、もう少し慣用的なものが欲しかった。これは、カスタム拡張機能による便利なイニシャライザの本当に良いユースケースだと思います。

// 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 2018年

@ConsBulaquena 0x任意の16進数の色が続く-color-hex.com
bloudermilk

そうですか。非常に便利!ありがとう@bloudermilk
コンスブラケナ


38

プログラムで色を追加する最も簡単な方法は、ColorLiteralを使用することです

例に示すようにプロパティColorLiteralを追加するだけで、Xcodeは選択可能な色のリスト全体を表示します。そうすることの利点は、より少ないコードであり、HEX値またはRGBを追加します。また、ストーリーボードから最近使用した色を取得します。

例: self.view.backgroundColor = ColorLiteralここに画像の説明を入力してください


5
これは素晴らしいです !
Vaibhav Saran 2018

この素早い手を共有してくれてありがとう..新しい学習.. :)
Ameer

32

文字列(16進数ではない)から始めている場合、これは16進数の文字列を取り、UIColorを返す関数です。
(16進文字列は、次の形式で入力できます:#ffffffまたは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




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

3

これは私のために迅速に働いています。これを試して

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


2

Swiftのような複雑なマクロは使用できません#define UIColorFromRGB(rgbValue)。Swiftの単純なマクロの置き換えは、次のようなグローバル定数です

let FADE_ANIMATION_DURATION = 0.35

それでも、パラメーターを受け入れる複雑なマクロは、swiftではサポートされていません。代わりに関数を使用できます

複雑なマクロは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

ネイトクックの答えは完全に正しいです。柔軟性を高めるために、次の機能をパックに入れています。

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の優れた拡張機能です。UIColorオブジェクトを作成するときに、列挙値(16進数、文字列)と直接文字列値を使用できます。

私たちが値する拡張機能 https://github.com/ioramashvili/UsefulExtensions/blob/master/Extensions.playground/Pages/UIColor.xcplaygroundpage/Contents.swift


これにより理論的には質問に答えることができますが、ここに答えの本質的な部分を含め、参照用のリンクを提供することが望ましいでしょう
Tobi Nary

0

私はそれがすでに答えられているのを見ることができますが、それでも1つのライナーがより良い方法で役立つことを願っています。

import UIKit

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

更新: 16進数の値を提供するために、質問の作成者が説明した例に従って行われた変更


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.