Як я можу використовувати 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. напр. структура Колір {статичний нехай DarkBlue: UInt = 0x1f5e75 статичний нехай синій: UInt = 0x3f7589 статичний нехай LightBlue: UInt = 0x7fa3b0}
Хав'єр Калатрава Льєверія

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))
Вадим,

1
Оригінал би спрацював, якби ви ввели його в дужки (як друге), а перші цифри перед знаком "/" поставили як десятковий номер, щоб він не скорочувався до цілого числа.
Енді Лебовіц

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?
Мінуси Булакена

@ConsBulaquena за нею 0xслідує будь-який шістнадцятковий колір - color-hex.com
bloudermilk

Я бачу. Дуже корисний! Дякуємо @bloudermilk
Мінуси Булакена


38

Найпростіший спосіб додавання кольору програмно - це за допомогою ColorLiteral .

Просто додайте властивість ColorLiteral, як показано в прикладі, Xcode запропонує вам весь список кольорів, які ви можете вибрати. Перевага цього - менший код, додавання значень HEX або RGB . Ви також отримаєте нещодавно використані кольори з розкадрівки.

Приклад: self.view.backgroundColor = ColorLiteralвведіть тут опис зображення


5
це дивно !
Вайбхав Саран

спасибі за обмін цієї швидкої рукою .. нові знання .. :)
Ameer

32

Якщо ви починаєте з рядка (не шістнадцятковий), це функція, яка приймає шістнадцяткову рядок і повертає UIColor.
(Ви можете вводити шістнадцяткові рядки в будь-якому форматі: #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)
    )
}



Джерело: arrshad / 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;
Олександр Волков

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

Відповідь Нейт Кука абсолютно правильна. Для більшої гнучкості я зберігаю в своїй упаковці такі функції:

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


Хоча це теоретично може відповісти на питання, бажано було б сюди включити істотні частини відповіді та надати посилання для довідки.
Тобі Нарі

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")
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.