Khách hàng đưa cho bạn màu sắc của một bản thiết kế nào đó dạng chuỗi HTML RGB ví dụ: 6F5A4E và yêu cầu bạn đưa lên màn hình. Thông thường bạn sẽ làm như sau:
Tạo category cho NSColor để thêm phương thức tạo NSColor từ chuỗi HTMLRGB:
- Tạo file NSColor+Ext.h:
@interface NSColor(Ext) +(NSColor*) newColorFromRGBString:(NSString*) rgb; @end
- Tạo file NSColor+Ext.m
@implementation NSColor(Ext) +(NSColor*) newColorFromRGBString:(NSString*) rgb{ NSColor*result= nil; unsigned colorValue=0; unsigned char r,g, b; if (nil != rgb) { NSScanner* scanner = [NSScanner scannerWithString:rgb]; // ignore error (void) [scanner scanHexInt:&colorValue]; } r = (unsigned char)(colorValue >> 16); g = (unsigned char)(colorValue >> 8); // masks off high bits b = (unsigned char)(colorValue); result = [NSColor colorWithCalibratedRed:(CGFloat)r / 0xff green:(CGFloat)g / 0xff blue:(CGFloat)b / 0xff alpha:1.0f]; return result; } @end
Sau đây mình sẽ trình bày phương pháp để giải quyết vấn đề này bằng ColorSync Manager API (Xem thêm tài liệu Technical Q&A QA1396):
- Khai property colorSpace trong AppDelegate.h:
@interface AppDelegate:NSObject @property (strong) NSColorSpace*colorSpace; @end
- Trong AppDelegate.m
Private category:
#import <ApplicationServices/ApplicationServices.h> @interface AppDelegate() +(CGColorSpaceRef)CreateDisplayColorSpace; -(void)updateColorSpace; -(void)registerNotifications; @end @implementation AppDelegate //Disable deprecated warning #pragma GCC diagnostic ignored "-Wdeprecated-declarations" +(CGColorSpaceRef)CreateDisplayColorSpace{ CMProfileRef sysprof = NULL; CGColorSpaceRef dispColorSpace = NULL; // Get the Systems Profile for the main display if (CMGetSystemProfile(&sysprof) == noErr) { // Create a colorspace with the systems profile dispColorSpace = CGColorSpaceCreateWithPlatformColorSpace(sysprof); // Close the profile CMCloseProfile(sysprof); } return dispColorSpace; } //Enable deprecated warning #pragma GCC diagnostic warning "-Wdeprecated-declarations" -(void)registerNotifications { NSDistributedNotificationCenter *center; center = [NSDistributedNotificationCenter defaultCenter]; [center addObserver:self selector:@selector(updateColorSpace) name:kCMDeviceUnregisteredNotification object:nil]; [center addObserver:self selector:@selector(updateColorSpace) name:kCMDefaultDeviceNotification object:nil]; [center addObserver:self selector:@selector(updateColorSpace) name:kCMDeviceProfilesNotification object:nil]; [center addObserver:self selector:@selector(updateColorSpace) name:kCMDefaultDeviceProfileNotification object:nil]; } -(void)updateColorSpace{ CGColorSpaceRef csr = [AppDelegate CreateDisplayColorSpace]; self.colorSpace = [[NSColorSpace alloc] initWithCGColorSpace:csr]; CGColorSpaceRelease(csr); }
- (void)applicationWillFinishLaunching:(NSNotification *)aNotification{
[self registerNotifications];
[self updateColorSpace];
} @end - Nhiệm vụ cuối cùng là thay đổi cách viết NSColor+Ext ở trên dùng property colorSpace trong lớp AppDelegate:
@implementation NSColor(Ext) +(NSColor*) newColorFromRGBString:(NSString*) rgb{ NSColor* result = nil; unsigned colorValue = 0; unsigned char r, g, b; if (nil != rgb) { NSScanner* scanner = [NSScanner scannerWithString:rgb]; // ignore error (void) [scanner scanHexInt:&colorValue]; } r = (unsigned char)(colorValue >> 16); g = (unsigned char)(colorValue >> 8); // masks off high bits b = (unsigned char)(colorValue); CGFloat components[4] = {(CGFloat)r / 0xff,(CGFloat)g / 0xff,(CGFloat)b / 0xff,1.0f}; return [NSColor colorWithColorSpace:(AppDelegate*)([NSApplication shareApplication].delegate).colorSpace components:components count:4]; } @end
Không có nhận xét nào:
Đăng nhận xét