Extracting hex value from NSColor
By Michael Robinson on December 6, 2011, Filed in: Cocoa | Objective C
Example project available on GitHub –
NSColor+Hex category available on GitHub –
This category on NSColor allows one to get or set an NSColor’s colour using hex values. Intitialising an NSColor with a hexadecimal colour:
It’ll throw an exception if one attempts to use a string that is not 3 or 6 characters in length, excluding the hash.
Getting the hexadecimal representation of a given NSColor:
This being my first Cocoa category, I’m sure it must have rough edges. Nevertheless, I have found it very useful. Below is the header for NSColor+Hex:
And the implementation, more verbose than I’d like but it does the job. If anyone improves on it, I’ll be happy to update this page & accept your pull request on GitHub:
NSColor+Hex category available on GitHub –
This category on NSColor allows one to get or set an NSColor’s colour using hex values. Intitialising an NSColor with a hexadecimal colour:
1 2 3 4 5 6 7 8 | @try { // Both shorthand and full forms of hexadecimal colours are accepted [colorWell setColor:[NSColor colorWithHex:@"#F00"]]; [colorWell setColor:[NSColor colorWithHex:@"#Ff0000"]]; } @catch (NSException *exception) { NSLog(@"%@", [exception description]); } |
1 | NSString *hexColor = [color hexColor] |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | // // NSColor+Hex.h // CINSColor+Hex // // Created by Michael Robinson on 4/12/11. // Copyright 2011 Code of Interest. All rights reserved. // #import <AppKit/AppKit.h> @interface NSColor (Hex) + (NSColor *) colorWithHex:(NSString *)hexColor; - (NSString *) hexColor; @end |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 | // // NSColor+Hex.m // CINSColor+Hex // // Created by Michael Robinson on 4/12/11. // Copyright 2011 Code of Interest. All rights reserved. // #import "NSColor+Hex.h" @implementation NSColor (Hex) + (NSColor *) colorWithHex:(NSString *)hexColor { // Remove the hash if it exists hexColor = [hexColor stringByReplacingOccurrencesOfString:@"#" withString:@""]; int length = (int)[hexColor length]; bool triple = (length == 3); NSMutableArray *rgb = [[NSMutableArray alloc] init]; // Make sure the string is three or six characters long if (triple || length == 6) { CFIndex i = 0; UniChar character = 0; NSString *segment = @""; CFStringInlineBuffer buffer; CFStringInitInlineBuffer((CFStringRef)hexColor, &buffer, CFRangeMake(0, length)); while ((character = CFStringGetCharacterFromInlineBuffer(&buffer, i)) != 0 ) { if (triple) segment = [segment stringByAppendingFormat:@"%c%c", character, character]; else segment = [segment stringByAppendingFormat:@"%c", character]; if ((int)[segment length] == 2) { NSScanner *scanner = [[NSScanner alloc] initWithString:segment]; unsigned number; while([scanner scanHexInt:&number]){ [rgb addObject:[NSNumber numberWithFloat:(float)(number / (float)255)]]; } segment = @""; } i++; } // Pad the array out (for cases where we're given invalid input) while ([rgb count] != 3) [rgb addObject:[NSNumber numberWithFloat:0.0]]; return [NSColor colorWithCalibratedRed:[[rgb objectAtIndex:0] floatValue] green:[[rgb objectAtIndex:1] floatValue] blue:[[rgb objectAtIndex:2] floatValue] alpha:1]; } else { NSException* invalidHexException = [NSException exceptionWithName:@"InvalidHexException" reason:@"Hex color not three or six characters excluding hash" userInfo:nil]; @throw invalidHexException; } } - (NSString *) hexColor { if ([[self colorSpaceName] isEqualToString:NSCalibratedWhiteColorSpace]) { return [NSString stringWithFormat:@"#%0.2X%0.2X%0.2X", (int)(r * [self whiteComponent]), (int)(g * [self whiteComponent]), (int)(b * [self whiteComponent])]; } else if ([[self colorSpaceName] isEqualToString:NSCalibratedBlackColorSpace]) { return [NSString stringWithFormat:@"#%0.2X%0.2X%0.2X", (int)(r * [self blackComponent]), (int)(g * [self blackComponent]), (int)(b * [self blackComponent])]; } else if ([[self colorSpaceName] isEqualToString:NSCalibratedRGBColorSpace] || [[self colorSpaceName] isEqualToString:NSDeviceRGBColorSpace]) { return [NSString stringWithFormat:@"#%0.2X%0.2X%0.2X", (int)(r * [self redComponent]), (int)(g * [self blueComponent]), (int)(b * [self greenComponent])]; } return @"transparent"; } @end |
Related posts:
- Fill a Path With A Scaled Image, Ignoring Image Proportions While continuing to rebuild Slider’s background image features, I was forced to rewrite the code that scales an image up/down to Slider’s portal size, ignoring the image’s original proportions. The...
- Tile an NSImage Within an NSBezierPath Another snippet I had to write during the great Slider rebuild. I needed to be able to take an NSImage supplied by the user and tile it within an NSBezierPath...
Tags: Cocoa, NSColor, Objective C
Logging In...


New blog post: Extracting hex value from NSColor http://t.co/a0s0devI