Как я могу использовать 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?

НАННАВ
источник
проверьте это developer.apple.com/library/prerelease/ios/documentation/UIKit/…
Нитин Гохель

Ответы:

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}
Хавьер Калатрава Ллаверия
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)  

Итак, это обходной путь, который я нашел.

user3153627
источник
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 только в вашем собственном клиентском коде, а не в библиотеках.

красное молоко
источник
Где я могу получить значение 0x209624 rgb?
Cons Bulaquena 05
@ConsBulaquena, за 0xним просто следует любой шестнадцатеричный цвет - color-hex.com
bloudermilk
Понимаю. Очень полезно! Спасибо @bloudermilk
Cons Bulaquena 09
46
myLabel.backgroundColor = UIColor(red: 50.0/255, green: 150.0/255, blue: 65.0/255, alpha: 1.0)
Анкит Гоял
источник
38

Самый простой способ добавить цвет программным способом - использовать ColorLiteral .

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

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

Puneeth
источник
5
это потрясающе !
Вайбхав Саран
1
спасибо, что поделились этой быстрой рукой .. новое обучение .. :)
Амир
32

Если вы начинаете со строки (не шестнадцатеричной), это функция, которая принимает шестнадцатеричную строку и возвращает UIColor.
(Вы можете вводить шестнадцатеричные строки в любом формате: #ffffffили ffffff)

Использование:

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



Источник: arshad / gist: de147c42d7b3063ef7bc

Итан Страйдер
источник
13

Для Xcode 9 используйте UIColorсо значениями RGB.

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

Предварительный просмотр:

предварительный просмотр кнопки с настраиваемым цветом RGB

См. Дополнительную документацию Apple по UIColor .

Минусы Булакены
источник
7

UIColorFromRGB в Swift 4

button.layer.backgroundColor = UIColor(red: 112.0/255, green: 86.0/255, blue: 164.0/255, alpha: 1.0).cgColor
Махеш Чаудхари
источник
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)
Imtee
источник
Я быстро использовал следующее: 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. Замена простого макроса на 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)
atiruz
источник
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.

Расширение, которого мы заслуживаем https://github.com/ioramashvili/UsefulExtensions/blob/master/Extensions.playground/Pages/UIColor.xcplaygroundpage/Contents.swift

Шота
источник
Хотя теоретически это может дать ответ на вопрос, было бы предпочтительнее включить сюда основные части ответа и предоставить ссылку для справки.
Tobi Nary
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 с одной десятичной точкой

RandallShanePhD
источник
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)

            }
        }
Sawan Cool
источник
-3

Это можно просто сделать, используя эту инициализацию

view.backgroundColor = UIColor(hex: "067AB5")
логово
источник