Tuesday, September 28, 2010

RGB components from UIColor

When Mac OS developers write their first iOS program, they often find it's not as convenient because UIKit doesn't provide as much APIs as in Cocoa AppKit. UIColor is one of these classes. In cocoa, NSColor has some convenient functions for fetching RGB components, while UIColor doesn't. I'm writing a UIColor category to provide the similar functions.

@interface UIColor(RGBComponents)

- (CGFloat)redComponent;

- (CGFloat)greenComponent;

- (CGFloat)blueComponent;

- (CGFloat)alphaComponent;

- (CGFloat)whiteComponent;

- (void)getWhite:(CGFloat *)white alpha:(CGFloat *)alpha;

- (void)getRed:(CGFloat *)red green:(CGFloat *)green blue:(CGFloat *)blue alpha:(CGFloat *)alpha;

@end



@implementation UIColor(RGBComponents)


- (CGFloat)redComponent

{

CGColorRef color = self.CGColor;

NSInteger numComponents = CGColorGetNumberOfComponents(color);

if (numComponents == 4)

{

const CGFloat *components = CGColorGetComponents(color);

return components[0];

}

else

return 0.0;

}

- (CGFloat)greenComponent

{

CGColorRef color = self.CGColor;

NSInteger numComponents = CGColorGetNumberOfComponents(color);

if (numComponents == 4)

{

const CGFloat *components = CGColorGetComponents(color);

return components[1];

}

else

return 0.0;

}

- (CGFloat)blueComponent

{

CGColorRef color = self.CGColor;

NSInteger numComponents = CGColorGetNumberOfComponents(color);

if (numComponents == 4)

{

const CGFloat *components = CGColorGetComponents(color);

return components[2];

}

else

return 0.0;

}

- (CGFloat)alphaComponent

{

CGColorRef color = self.CGColor;

NSInteger numComponents = CGColorGetNumberOfComponents(color);

if (numComponents == 2)

{

const CGFloat *components = CGColorGetComponents(color);

return components[1];

}

else if (numComponents == 4)

{

const CGFloat *components = CGColorGetComponents(color);

return components[3];

}

else

return 0.0;

}

- (CGFloat)whiteComponent

{

CGColorRef color = self.CGColor;

NSInteger numComponents = CGColorGetNumberOfComponents(color);

if (numComponents == 2)

{

const CGFloat *components = CGColorGetComponents(color);

return components[0];

}

else

return 0.0;

}

- (void)getWhite:(CGFloat *)white alpha:(CGFloat *)alpha

{

CGColorRef color = self.CGColor;

NSInteger numComponents = CGColorGetNumberOfComponents(color);

if (numComponents == 2)

{

const CGFloat *components = CGColorGetComponents(color);

*white = components[0];

*alpha = components[1];

}

}

- (void)getRed:(CGFloat *)red green:(CGFloat *)green blue:(CGFloat *)blue alpha:(CGFloat *)alpha

{

CGColorRef color = self.CGColor;

NSInteger numComponents = CGColorGetNumberOfComponents(color);

if (numComponents == 4)

{

const CGFloat *components = CGColorGetComponents(color);

*red = components[0];

*green = components[1];

*blue = components[2];

*alpha = components[3];

}

}


@end