Comment convertir UIColor en HEX et afficher dans NSLog
j'ai vérifié plusieurs liens sur la façon de convertir les codes UIColor en HEX mais je ne suis pas sûr sur la façon d'appeler à la méthode pour les afficher dans NSLog. Je n'ai pas la réputation de commentaire, donc l'affectation en question est mon dernier recours. je veux qu'il affiche quand je lance mon application dans le journal.
Deuxièmement, Où dois-je entrer le numéro de couleur RGB ( R = 30, G = 171, B = 13)? Je vois que tous les exemples utilisent le tableau [0], [1], [2] qui se réfère normalement à position de l'index, alors Où dois-je ajouter les valeurs de couleur?
j'ai ce code:
- (NSString *) hexFromUIColor:(UIColor *)color {
if (CGColorGetNumberOfComponents(color.CGColor) < 4) {
const CGFloat *components = CGColorGetComponents(color.CGColor);
color = [UIColor colorWithRed:components[30] green:components[141] blue:components[13] alpha:components[1]];
}
if (CGColorSpaceGetModel(CGColorGetColorSpace(color.CGColor)) != kCGColorSpaceModelRGB) {
return [NSString stringWithFormat:@"#FFFFFF"];
}
return [NSString stringWithFormat:@"#%02X%02X%02X", (int)((CGColorGetComponents(color.CGColor))[0]*255.0), (int)((CGColorGetComponents(color.CGColor))[1]*255.0), (int)((CGColorGetComponents(color.CGColor))[2]*255.0)];
}
liens que j'ai cochés:
hexadécimal de la couleur de uicolor
comment convertir les codes de couleur HEX RGB en UIColor?
j'ai essayé d'appeler la méthode en viewDidLoad mais elle ne fonctionne pas sans UIColor. Je suis sûr que c'est quelque chose de simple.
merci à tous ceux qui répondent.
Quel est le code que j'utilise dans ma viewDidLoad pour appeler cette méthode afin de l'afficher dans NSLog?
8 réponses
utiliser le code ci-dessous:
- (NSString *)hexStringFromColor:(UIColor *)color {
const CGFloat *components = CGColorGetComponents(color.CGColor);
CGFloat r = components[0];
CGFloat g = components[1];
CGFloat b = components[2];
return [NSString stringWithFormat:@"#%02lX%02lX%02lX",
lroundf(r * 255),
lroundf(g * 255),
lroundf(b * 255)];
}
après avoir obtenu la chaîne de codes hexadécimaux, appeler la méthode ci-dessous pour obtenir UIColor
- (UIColor *) colorWithHexString: (NSString *) hexString
{
NSString *colorString = [[hexString stringByReplacingOccurrencesOfString: @"#" withString: @""] uppercaseString];
NSLog(@"colorString :%@",colorString);
CGFloat alpha, red, blue, green;
// #RGB
alpha = 1.0f;
red = [self colorComponentFrom: colorString start: 0 length: 2];
green = [self colorComponentFrom: colorString start: 2 length: 2];
blue = [self colorComponentFrom: colorString start: 4 length: 2];
return [UIColor colorWithRed: red green: green blue: blue alpha: alpha];
}
"
- (CGFloat) colorComponentFrom: (NSString *) string start: (NSUInteger) start length: (NSUInteger) length {
NSString *substring = [string substringWithRange: NSMakeRange(start, length)];
NSString *fullHex = length == 2 ? substring : [NSString stringWithFormat: @"%@%@", substring, substring];
unsigned hexComponent;
[[NSScanner scannerWithString: fullHex] scanHexInt: &hexComponent];
return hexComponent / 255.0;
}
USAGE
// ( R = 30, G = 171, B = 13)?
CGFloat red = 30.0;
CGFloat green = 171.0;
CGFloat blue = 13.0;
CGFloat alpha = 255.0
UIColor *color = [UIColor colorWithRed:(red/255.0) green:(green/255.0) blue:(blue/255.0) alpha:(alpha/255.0)];
NSString *colorCode = [self hexStringFromColor:color];
NSLog(@"Color Code: %@", colorCode);
UIColor *resultColor = [self colorWithHexString:colorCode];
Kampai la réponse de travaux pour les couleurs RVB, mais pas pour monochrome (UIColor colorWithWhite:alpha:). Il ne gère pas non plus alpha, que HEX supporte. Voici une version légèrement modifiée de hexStringFromColor:
+ (NSString *)hexStringFromColor:(UIColor *)color
{
CGColorSpaceModel colorSpace = CGColorSpaceGetModel(CGColorGetColorSpace(color.CGColor));
const CGFloat *components = CGColorGetComponents(color.CGColor);
CGFloat r, g, b, a;
if (colorSpace == kCGColorSpaceModelMonochrome) {
r = components[0];
g = components[0];
b = components[0];
a = components[1];
}
else if (colorSpace == kCGColorSpaceModelRGB) {
r = components[0];
g = components[1];
b = components[2];
a = components[3];
}
return [NSString stringWithFormat:@"#%02lX%02lX%02lX%02lX",
lroundf(r * 255),
lroundf(g * 255),
lroundf(b * 255),
lroundf(a * 255)];
}
et enfin la version qui fonctionne avec alpha - composant et utilise le multiplicateur droit
extension UIColor {
var hexString: String? {
var red: CGFloat = 0
var green: CGFloat = 0
var blue: CGFloat = 0
var alpha: CGFloat = 0
let multiplier = CGFloat(255.999999)
guard self.getRed(&red, green: &green, blue: &blue, alpha: &alpha) else {
return nil
}
if alpha == 1.0 {
return String(
format: "#%02lX%02lX%02lX",
Int(red * multiplier),
Int(green * multiplier),
Int(blue * multiplier)
)
}
else {
return String(
format: "#%02lX%02lX%02lX%02lX",
Int(red * multiplier),
Int(green * multiplier),
Int(blue * multiplier),
Int(alpha * multiplier)
)
}
}
}
dans Swift, j'ai simplement créé une extension à UIColor...
extension UIColor
{
var hexString:NSString {
let colorRef = CGColorGetComponents(self.CGColor)
let r:CGFloat = colorRef[0]
let g:CGFloat = colorRef[1]
let b:CGFloat = colorRef[2]
return NSString(format: "#%02lX%02lX%02lX", lroundf(Float(r * 255)), lroundf(Float(g * 255)), lroundf(Float(b * 255)))
}
}
autres réponses SWIFT crash pour UIColors comme white, où il n'y a que 2 composants retournés par CGColor.
Voici une version Swift 4 qui n'a pas ce problème et renvoie également des informations de transparence à la fin de la chaîne si cela est nécessaire (format web).
par exemple:
Blanc retournera #fffff
blanc avec une opacité de 50% retournera #FFFFFF7F
extension UIColor {
var hexString: String {
let colorRef = cgColor.components
let r = colorRef?[0] ?? 0
let g = colorRef?[1] ?? 0
let b = ((colorRef?.count ?? 0) > 2 ? colorRef?[2] : g) ?? 0
let a = cgColor.alpha
var color = String(
format: "#%02lX%02lX%02lX",
lroundf(Float(r * 255)),
lroundf(Float(g * 255)),
lroundf(Float(b * 255))
)
if a < 1 {
color += String(format: "%02lX", lroundf(Float(a)))
}
return color
}
}
version Swift 2 de la réponse acceptée. J'ai converti en une extension UIColor
.
extension UIColor {
var hexString: String {
let components = CGColorGetComponents(self.CGColor)
let red = Float(components[0])
let green = Float(components[1])
let blue = Float(components[2])
return String(format: "#%02lX%02lX%02lX", lroundf(red * 255), lroundf(green * 255), lroundf(blue * 255))
}
}
la réponse swift 2 convertie en swift 3
var hexString: String {
let components = self.cgColor.components
let red = Float((components?[0])!)
let green = Float((components?[1])!)
let blue = Float((components?[2])!)
return String(format: "#%02lX%02lX%02lX", lroundf(red * 255), lroundf(green * 255), lroundf(blue * 255))
}
piège potentiel Lorsqu'il S'agit D'Alpha : les chaînes hexadécimales sont disponibles dans différents formats, certains ont leur alpha au début de la chaîne hexadécimale et d'autres formats l'ont à la fin. Selon votre contexte, vous pouvez avoir une idée différente de la façon dont la chaîne de caractères hexadécimaux est formatée. Pour les développeurs Android, il sera probablement avec l'alpha au début, pour les développeurs Web, il sera probablement à la fin de la chaîne. DONC TOUJOURS INDIQUER LE FORMAT DE LA CHAÎNE HEXADÉCIMALE pour éviter toute confusion. Les chaînes HEX Android sont nécessaires pour avoir l'alpha au début. Donc c'est un piège dans lequel les gens peuvent tomber quand il s'agit de chaînes hexadécimales (Je l'ai fait) et est donc important de dire ce qu'est le format attendu. Donc, si vous développez une application pour iOS et Android ce pour ce piège.
liens: https://en.wikipedia.org/wiki/RGBA_color_space pour plus de détails sur les raisons pour lesquelles une chaîne hexagonale peut être formatée de différentes façons, dans certains cas avec l'alpha au début. Liens Android https://developer.android.com/reference/android/graphics/Color.html et https://gist.github.com/lopspower/03fb1cc0ac9f32ef38f4
PLEASE NOTE FOR #AARRGGBB Hex string format Utilisez le code suivant si l'Alpha est au début de la chaîne.
(Note: si color == null
noir est retourné).
+(NSString*)hexStringFromColor:(UIColor *)color
{
CGFloat r = 0, g = 0, b = 0, a = 1;
if (color) {
[color getRed:&r green:&g blue:&b alpha:&a];
}
return [NSString stringWithFormat:@"#%02lX%02lX%02lX%02lX",
lroundf(a * 255.0),
lroundf(r * 255.0),
lroundf(g * 255.0),
lroundf(b * 255.0)
];
}