2015-01-29 9 views
3

Когда я пытаюсь позвонить setColorSpace в свой объект NSWindow, я не получаю никаких изменений в цвете. У меня создалось впечатление, что я могу динамически изменить способ отображения цвета.с использованием OS X NSColorspace для переключения режимов colorync

Вот .h файл для моего контроллера

#import <Cocoa/Cocoa.h> 

@interface MainWindow : NSWindowController <NSTextFieldDelegate> 
{ 

} 
@property (strong) IBOutlet NSWindow *theWindow; 
@property (weak) IBOutlet NSTextField *RedField; 
@property (weak) IBOutlet NSTextField *GreenField; 
@property (weak) IBOutlet NSTextField *BlueField; 
@property (weak) IBOutlet NSTextField *PatternField; 
@property (weak) IBOutlet NSButton *ICCBox; 
- (IBAction)UpdateICC:(id)sender; 

@end 

Вот файл .m для моего контроллера

#import "MainWindow.h" 
#import <AppKit/AppKit.h> 

@interface MainWindow() 

@end 

@implementation MainWindow 


- (id)init 
{ 
    self = [super init]; 

    return self; 
} 

- (void)awakeFromNib 
{ 
    [_RedField setDelegate:self]; 
    [_GreenField setDelegate:self]; 
    [_BlueField setDelegate:self]; 
} 


-(void) controlTextDidChange:(NSNotification *) note { 

    float redByte = [_RedField floatValue]; 
    float redF = redByte/255.0; 

    float greenByte = [_GreenField floatValue]; 
    float greenF = greenByte/255.0; 

    float blueByte = [_BlueField floatValue]; 
    float blueF = blueByte/255.0; 

    _PatternField.backgroundColor = [NSColor colorWithCalibratedRed:redF green:greenF blue:blueF alpha:1]; 
} 

- (IBAction)UpdateICC:(id)sender { 

    NSColorSpace *acs = [NSColorSpace adobeRGB1998ColorSpace]; 
    NSColorSpace *scs = [NSColorSpace sRGBColorSpace]; 
    NSColorSpace *dcs = [NSColorSpace deviceRGBColorSpace]; 

    if(_ICCBox.state == NSOnState) 
    { 
     [_theWindow setColorSpace:scs]; 
    } 
    else 
    { 
     [_theWindow setColorSpace:dcs]; 
    } 

} 
@end 

Любая идея, почему это не работает?

+0

Нужно ли вам называть 'setViewsNeedDisplay' после его изменения? – user1118321

+0

Я не думаю, что все, я просто попробовал добавить звонок, и это не изменило поведения. Также, когда я переключаю профиль ICC дисплея, он меняет цвет в окне. Так что я в настоящее время получаю sRGB управляемый цвет. –

ответ

0

Вы должны отправить указанное уведомление по умолчанию NotificationCenter, чтобы немедленно применить изменения (вызвать окно перерисовывания с новым цветовым профилем).

- (IBAction)UpdateICC:(id)sender { 

    NSColorSpace *acs = [NSColorSpace adobeRGB1998ColorSpace]; 
    NSColorSpace *scs = [NSColorSpace sRGBColorSpace]; 
    NSColorSpace *dcs = [NSColorSpace deviceRGBColorSpace]; 

    if(_ICCBox.state == NSOnState) 
    { 
     [_theWindow setColorSpace:scs]; 
    } 
    else 
    { 
     [_theWindow setColorSpace:dcs]; 
    } 

    [[NSNotificationCenter defaultCenter] postNotificationName:NSWindowDidChangeScreenNotification object:_theWindow]; 
    // In some cases additional call needed: 
    [_theWindow.contentView viewDidChangeBackingProperties]; 
}