Ich habe einige Links zum Konvertieren von UIColor-Codes in HEX geprüft. Ich bin jedoch nicht sicher, wie ich die Methode aufrufen soll, um sie in NSLog anzuzeigen. Ich habe nicht den Ruf, einen Kommentar abzugeben, daher ist das Posten als Frage mein letzter Ausweg. Ich möchte, dass es angezeigt wird, wenn ich meine App im Protokoll ausführe.
Zweitens, wo gebe ich die RGB-Farbnummer ein (R = 30, G = 171, B = 13)? Ich sehe, dass alle Beispiele Array [0], [1], [2] verwenden, das sich normalerweise auf die Indexposition bezieht. Wo füge ich dann die Farbwerte hinzu?
Ich habe diesen 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)];
}
Links, die ich überprüft habe:
Wie konvertiere ich HEX RGB-Farbcodes in UIColor?
Ich habe versucht, die Methode in viewDidLoad aufzurufen, funktioniert jedoch nicht ohne UIColor. Ich bin sicher, dass es etwas Einfaches ist.
Danke an alle, die antworten.
Welchen Code verwende ich in viewDidLoad, um diese Methode aufzurufen, um in NSLog angezeigt zu werden?
Verwenden Sie den folgenden Code:
- (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)];
}
Nachdem Sie den Hex-Code-String abgerufen haben, rufen Sie die Methode under auf, um UIColor
zu erhalten
- (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;
}
// ( 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];
Kampais Antwort funktioniert für RGB-Farben, nicht jedoch für Monochrom (UIColor colorWithWhite: alpha :). Es kann auch nicht mit Alpha umgehen, was HEX unterstützt. Hier ist eine leicht modifizierte Version von 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)];
}
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)
)
}
}
}
Andere Swift-Antworten stürzen ab für UIColors wie Weiß, wo nur zwei Komponenten von CGColor zurückgegeben werden.
Hier ist eine Swift 4 -Version, die dieses Problem nicht hat und außerdem Transparenzinformationen am Ende des Strings zurückgibt, falls dies erforderlich ist (Webformat).
Zum Beispiel:
Weiß wird zurückgegeben #FFFFFF
Weiß mit 50% Deckkraft wird zurückgegeben # 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
}
}
In Swift habe ich einfach eine Erweiterung für UIColor erstellt ...
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)))
}
}
Swift 2-Version der akzeptierten Antwort. Ich habe in eine UIColor
-Erweiterung konvertiert.
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))
}
}
Die Antwort von Swift 2 wurde in Swift 3 umgewandelt
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))
}
Dies ist die richtige Reihenfolge, wenn Sie die Farben für Android benötigen. Das Alpha geht vor:
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(alpha * multiplier),
Int(red * multiplier),
Int(green * multiplier),
Int(blue * multiplier)
)
}
}
}
Dann rufen Sie an als:
debugPrint("testColor > ", self.testColor().hexString!)
Mögliche Falle beim Umgang mit Alpha: HEX-Strings gibt es in verschiedenen Formaten, einige haben ihr Alpha am Anfang des Hex-Strings und andere Formate haben es am Ende. Abhängig von Ihrem Hintergrund können Sie eine andere Vorstellung davon haben, wie die Hex-Zeichenfolge formatiert wird. Für Android-Entwickler dürfte es am Anfang das Alpha sein, für Webentwickler am Ende der Zeichenfolge. SO STAATEN SIE IMMER DAS FORMAT DES HEX-STRINGS, um Verwirrung zu vermeiden. Android-Hex-Zeichenfolgen müssen das Alpha am Anfang haben. Das ist also eine Falle, in die die Leute geraten können, wenn es um Hex-Strings geht (ich habe es getan), und es ist daher wichtig zu sagen, welches Format erwartet wird. Also, wenn Sie eine App für iOS und Android entwickeln, was für diese Falle.
Links: https://en.wikipedia.org/wiki/RGBA_color_space für Details, warum eine HEX-Zeichenfolge auf unterschiedliche Weise formatiert werden kann, in einigen Fällen mit dem Alpha am Anfang. Android-Links https://developer.Android.com/reference/Android/graphics/Color.html und https://Gist.github.com/lopspower/03fb1cc0ac9f32ef38f4
BITTE BEACHTEN SIE FÜR #AARRGGBB Hex-String-Format Verwenden Sie den folgenden Code, damit das Alpha am Anfang des Strings steht.
(Hinweis: Wenn color == null
schwarz zurückgegeben wird).
+(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)
];
}