Поиск…


Создание UIColor

Существует множество способов создания UIColor :

стриж

  • Используя один из предопределенных цветов:

    let redColor = UIColor.redColor()
    let blueColor: UIColor = .blueColor()
    
    // In Swift 3, the "Color()" suffix is removed:
    let redColor = UIColor.red
    let blueColor: UIColor = .blue
    

    Если компилятор уже знает, что переменная является экземпляром UIColor вы можете пропустить тип все вместе:

    let view = UIView()
    view.backgroundColor = .yellowColor()
    
  • Использование значения оттенков серого и альфа:

    let grayscaleColor = UIColor(white: 0.5, alpha: 1.0)
    
  • Использование оттенка, насыщенности, яркости и альфа:

    let hsbColor = UIColor(
        hue: 0.4,
        saturation: 0.3,
        brightness: 0.7,
        alpha: 1.0
    )
    
  • Использование значений RGBA:

    let rgbColor = UIColor(
        red: 30.0 / 255, 
        green: 70.0 / 255, 
        blue: 200.0 / 255, 
        alpha: 1.0
    )
    
  • Использование рисунка:

    let patternColor = UIColor(patternImage: UIImage(named: "myImage")!)
    

Objective-C

  • Используя один из предопределенных цветов:

    UIColor *redColor = [UIColor redColor];
    
  • Использование значения оттенков серого и альфа:

    UIColor *grayscaleColor = [UIColor colorWithWhite: 0.5 alpha: 1.0];
    
  • Использование оттенка, насыщенности, яркости и альфа:

    UIColor *hsbColor = [UIColor
        colorWithHue: 0.4
        saturation: 0.3
        brightness: 0.7
        alpha: 1.0
    ];
    
  • Использование значений RGBA:

    UIColor *rgbColor = [UIColor
        colorWithRed: 30.0 / 255.0
        green: 70.0 / 255.0
        blue: 200.0 / 255.0 
        alpha: 1.0
    ];
    
  • Использование рисунка:

    UIColor *pattenColor = [UIColor colorWithPatternImage:[UIImage imageNamed:@"myImage.png"]];
    

Недокументированные методы

На UIColor существует множество недокументированных методов, которые предоставляют альтернативные цвета или функциональные возможности. Их можно найти в личном заголовочном файле UIColor . Я буду документировать использование двух частных методов, styleString() и _systemDestructiveTintColor() .

styleString

Начиная с iOS 2.0 существует частный метод экземпляра в UIColor называемый styleString который возвращает строковое представление RGB или RGBA для цвета, даже для цветов типа whiteColor вне пространства RGB.

Objective-C:

@interface UIColor (Private)

- (NSString *)styleString;

@end

// ...

[[UIColor whiteColor] styleString]; // rgb(255,255,255)
[[UIColor redColor] styleString]; // rgb(255,0,0)
[[UIColor lightTextColor] styleString]; // rgba(255,255,255,0.600000)

В Swift вы можете использовать заголовок для моста, чтобы открыть интерфейс. С чистым Swift вам нужно будет создать протокол @objc с помощью частного метода и unsafeBitCast UIColor с протоколом:

@objc protocol  UIColorPrivate {
    func styleString() -> String
}

let white = UIColor.whiteColor()
let red = UIColor.redColor()
let lightTextColor = UIColor.lightTextColor()

let whitePrivate = unsafeBitCast(white, UIColorPrivate.self)
let redPrivate = unsafeBitCast(red, UIColorPrivate.self)
let lightTextColorPrivate = unsafeBitCast(lightTextColor, UIColorPrivate.self)

whitePrivate.styleString() // rgb(255,255,255)
redPrivate.styleString() // rgb(255,0,0)
lightTextColorPrivate.styleString() // rgba(255,255,255,0.600000)

_systemDestructiveTintColor()

Существует недокументированный метод класса в UIColor называемый _systemDestructiveTintColor который возвращает красный цвет, используемый деструктивными системными кнопками:

let red = UIColor.performSelector("_systemDestructiveTintColor").takeUnretainedValue()

Он возвращает неуправляемый объект, который вы должны вызывать .takeUnretainedValue() , поскольку .takeUnretainedValue() цвета не было передано нашему собственному объекту.

Как и в случае любого недокументированного API, вы должны проявлять осторожность при попытке использовать этот метод:

if UIColor.respondsToSelector("_systemDestructiveTintColor") {
    if let red = UIColor.performSelector("_systemDestructiveTintColor").takeUnretainedValue() as? UIColor {
        // use the color
    }
}

или с использованием протокола:

@objc protocol UIColorPrivateStatic {
    func _systemDestructiveTintColor() -> UIColor
}

let privateClass = UIColor.self as! UIColorPrivateStatic
privateClass._systemDestructiveTintColor() // UIDeviceRGBColorSpace 1 0.231373 0.188235 1

Цвет с альфа-компонентом

Вы можете установить непрозрачность для определенного UIColor не создавая новый, используя init(red:_,green:_,blue:_,alpha:_) .

стриж

let colorWithAlpha = UIColor.redColor().colorWithAlphaComponent(0.1)

Swift 3

//In Swift Latest Version
_ colorWithAlpha = UIColor.red.withAlphaComponent(0.1)

Objective-C

UIColor * colorWithAlpha = [[UIColor redColor] colorWithAlphaComponent:0.1];

Создание пользовательских атрибутов применяется к типу данных CGColor

По умолчанию Interface Builder не принимает тип данных CGColor , поэтому позволяет добавлять CGColor с использованием пользовательских атрибутов в построителе интерфейса; можно использовать расширение следующим образом:

Быстрое расширение:

extension CALayer {
    func borderUIColor() -> UIColor? {
        return borderColor != nil ? UIColor(CGColor: borderColor!) : nil
    }
    
    func setBorderUIColor(color: UIColor) {
        borderColor = color.CGColor
    }
}

Новый пользовательский атрибут (borderUIColor) будет распознаваться и применяться без проблем.

введите описание изображения здесь

Создание UIColor из шестнадцатеричного числа или строки

Вы можете создать UIColor из шестнадцатеричного числа или строки, например 0xff00cc, "#FFFFFF"

стриж

Int Value

extension UIColor {
    convenience init(hex: Int, alpha: CGFloat = 1.0) {
        let r = CGFloat((hex >> 16) & 0xff) / 255
        let g = CGFloat((hex >> 08) & 0xff) / 255
        let b = CGFloat((hex >> 00) & 0xff) / 255
        self.init(red: r, green: g, blue: b, alpha: alpha)
    }
}

Пример:

let color = UIColor(hex: 0xff00cc, alpha: 1.0)

Обратите внимание, что для alpha предоставляется значение по умолчанию 1.0 , поэтому его можно использовать следующим образом:

let color = UIColor(hex: 0xff00cc)

Строковое значение

extension UIColor {
    convenience init(hexCode: String) {
        let hex = hexCode.stringByTrimmingCharactersInSet(NSCharacterSet.alphanumericCharacterSet().invertedSet)
        var int = UInt32()
        NSScanner(string: hex).scanHexInt(&int)
        let a, r, g, b: UInt32

        switch hex.characters.count {
        case 3:
            (a, r, g, b) = (255, (int >> 8) * 17, (int >> 4 & 0xF) * 17, (int & 0xF) * 17)
        case 6:
            (a, r, g, b) = (255, int >> 16, int >> 8 & 0xFF, int & 0xFF)
        case 8:
            (a, r, g, b) = (int >> 24, int >> 16 & 0xFF, int >> 8 & 0xFF, int & 0xFF)
        default:
            (a, r, g, b) = (1, 1, 1, 0)
        }
    
        self.init(red: CGFloat(r) / 255, green: CGFloat(g) / 255, blue: CGFloat(b) / 255, alpha: CGFloat(a) / 255)
    }
}

Пример использования:

Шестигранник с альфой

let color = UIColor("#80FFFFFF")

Hex без альфы ( color альфа будет равна 1,0)

let color = UIColor("#FFFFFF")
let color = UIColor("#FFF")

Objective-C

Int Value

@interface UIColor (Hex)
+ (UIColor *)colorWithHex:(NSUInteger)hex alpha:(CGFloat)alpha;
@end

@implementation UIColor (Hex)
+ (UIColor *)colorWithHex:(NSUInteger)hex alpha:(CGFloat)alpha {
    return [UIColor colorWithRed:((CGFloat)((hex & 0xFF0000) >> 16))/255.0
                           green:((CGFloat)((hex & 0xFF00) >> 8))/255.0
                            blue:((CGFloat)(hex & 0xFF))/255.0
                           alpha:alpha];
}
@end

Пример:

UIColor *color = [UIColor colorWithHex:0xff00cc alpha:1.0];

Строковое значение

- (UIColor*) hex:(NSString*)hexCode {
    
    NSString *noHashString = [hexCode stringByReplacingOccurrencesOfString:@"#" withString:@""];
    NSScanner *scanner = [NSScanner scannerWithString:noHashString];
    [scanner setCharactersToBeSkipped:[NSCharacterSet symbolCharacterSet]];
    
    unsigned hex;
    if (![scanner scanHexInt:&hex]) return nil;
    int a;
    int r;
    int g;
    int b;

    switch (noHashString.length) {
        case 3:
            a = 255;
            r = (hex >> 8) * 17;
            g = ((hex >> 4) & 0xF) * 17;
            b = ((hex >> 0) & 0xF) * 17;
            break;
        case 6:
            a = 255;
            r = (hex >> 16);
            g = (hex >> 8) & 0xFF;
            b = (hex) & 0xFF;
            break;
        case 8:
            a = (hex >> 24);
            r = (hex >> 16) & 0xFF;
            g = (hex >> 8) & 0xFF;
            b = (hex) & 0xFF;
            break;
            
        default:
            a = 255.0;
            r = 255.0;
            b = 255.0;
            g = 255.0;
            break;
    }

    return [UIColor colorWithRed:r / 255.0f green:g / 255.0f blue:b / 255.0f alpha:a / 255];
}

Пример использования:

Шестигранник с альфой

UIColor* color = [self hex:@"#80FFFFFF"];

Hex без альфы ( color альфа будет равна 1)

UIColor* color = [self hex:@"#FFFFFF"];
UIColor* color = [self hex:@"#FFF"];

Регулировка яркости цвета от UIColor

В приведенном ниже примере кода вы получите скорректированную версию этого цвета, где более высокий процент будет ярче, а более низкий процент будет темнее.

Objective-C

+ (UIColor *)adjustedColorForColor:(UIColor *)c : (double)percent
{
    if (percent < 0) percent = 0;
    
    CGFloat r, g, b, a;
    if ([c getRed:&r green:&g blue:&b alpha:&a])
        return [UIColor colorWithRed:MAX(r * percent, 0.0)
                               green:MAX(g * percent, 0.0)
                                blue:MAX(b * percent, 0.0)
                               alpha:a];
    return nil;
}

стриж

func adjustedColorForColor( c: UIColor, var percent: CGFloat) -> UIColor {
    if percent < 0 {
        percent = 0
    }

    var r,g,b,a: CGFloat
    r = 0.0
    g = 0.0
    b = 0.0
    a = 0.0

    if c.getRed(&r, green: &g, blue: &b, alpha: &a) {
        return UIColor(red: max(r * percent, 0.0), green: max(g * percent, 0.0), blue: max(b * percent, 0.0), alpha: a)
    }

    return UIColor()
}

UIColor из шаблона изображения

Вы можете создать объект UIColor используя шаблон изображения, используя метод UIColor(patternImage:_) .

btn.backgroundColor = UIColor(patternImage: UIImage(named: "image")!)

введите описание изображения здесь

Более светлый и темный оттенок данного UIColor

В приведенном ниже примере кода показано, как вы можете получить более светлый и темный оттенок заданного цвета, полезный в приложениях с динамическими темами

Для темного цвета

+ (UIColor *)darkerColorForColor:(UIColor *)c
{
    CGFloat r, g, b, a;
    if ([c getRed:&r green:&g blue:&b alpha:&a])
        return [UIColor colorWithRed:MAX(r - 0.2, 0.0)
                               green:MAX(g - 0.2, 0.0)
                                blue:MAX(b - 0.2, 0.0)
                               alpha:a];
    return nil;
}

Для более светлых цветов

+ (UIColor *)lighterColorForColor:(UIColor *)c
{
    CGFloat r, g, b, a;
    if ([c getRed:&r green:&g blue:&b alpha:&a])
        return [UIColor colorWithRed:MIN(r + 0.2, 1.0)
                               green:MIN(g + 0.2, 1.0)
                                blue:MIN(b + 0.2, 1.0)
                               alpha:a];
    return nil;
}

См. Раздел «Визуальные различия» ниже, учитывая, что данный цвет [UIColor orangeColor]

Визуальная демонстрация



Modified text is an extract of the original Stack Overflow Documentation
Лицензировано согласно CC BY-SA 3.0
Не связан с Stack Overflow