2013-09-16 2 views
2
CGContextRef ctx = CGContextRetain([[NSGraphicsContext currentContext] graphicsPort]); 
CGColorRef color = CGColorRetain([NSColor colorWithCalibratedRed:0 green:0 blue:0 alpha:0.5f].CGColor); 

CGContextSaveGState(ctx); 
{ 
    CGContextSetFillColorWithColor(ctx, color); 
    CGContextFillRect(ctx, dirtyRect); 
} 
CGContextRestoreGState(ctx); 

CGColorRelease(color); 
CGContextRelease(ctx); 
+0

Куда он падает? Что такое сообщение об ошибке? – Fogmeister

+0

[NSCalibratedRGBColor CGColor] Непризнанный селектор отправлен ... выглядит как ошибка раннего выпуска ARC. но я сохранил объекты CF. –

+0

Это не связано с сохранением; Ошибка «Unrecognized selector» обеспечивает много вопросов по объектам Objective-C StackOverflow. Это один из наших фаворитов, и вы должны начать искать свой ответ. – trojanfoe

ответ

5

Как сообщение об ошибке говорит, объекты NSColor не реагируют на CGColor сообщений в Львином этом методе был добавлен в 10.8. На 10.7 вам придется преобразовать NSColor в CGColor самостоятельно.

Вот функция, которая выполняет преобразование. На 10.8 он просто возвращает NSColor CGColor. Если это не доступно, оно выполняет само преобразование.

CGColorRef PRHCreateCGColorWithNSColor(NSColor *color) { 
    if ([color respondsToSelector:@selector(CGColor)]) { 
     CGColorRef cgColor = [color CGColor]; 
     return cgColor != NULL ? (CGColorRef)CFRetain(cgColor) : NULL; 
    } 

    NSString *colorSpaceName = [color colorSpaceName]; 
    NSColorSpace *colorSpaceNS; 
    if ([colorSpaceName isEqualToString:NSNamedColorSpace] || [colorSpaceName isEqualToString:NSPatternColorSpace]) { 
     colorSpaceNS = [NSColorSpace genericRGBColorSpace]; 
     color = [color colorUsingColorSpace:colorSpaceNS]; 
    } else { 
     colorSpaceNS = [color colorSpace]; 
    } 
    CGColorSpaceRef colorSpace = [colorSpaceNS CGColorSpace]; 

    size_t numberOfComponents = CGColorSpaceGetNumberOfComponents(colorSpace); 
    CGFloat components[numberOfComponents]; 
    [color getComponents:components]; 

    return CGColorCreate(colorSpace, components); 
} 
+0

Благодарим вас за то, что вы терпеливы и понимаете точную проблему и отвечаете хорошим кодом, который помог многим. хороший день :) –

+0

Даже несмотря на то, что он работает, цвет, который я получаю во льве, темнее цвета, который я получаю в Горном льве. например selectedMenuItemColor дает синий и синий соответственно. любые мысли по этому поводу? –

+0

@SuhasAithal: Возможно, они изменили его между версиями ОС. Попробуйте зарегистрировать содержимое массива 'components'. –