Поиск…
Создание 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]