Используя системный оттенок управления

OS X позволяет пользователю выбирать цвет, используемый в дисплее окон, меню и средств управления с помощью области Appearance в Установках системы. Этот цвет упоминается как оттенок управления. Элементы пользовательского интерфейса, предоставленные Набором Приложения автоматически, изменяют свое появление на основе текущего оттенка управления.

Пользовательские элементы управления и другие аспекты пользовательского интерфейса Вашего приложения могут также использовать оттенок управления как показано на рисунке 1.

  Примеры рисунка 1 управления окрашивают осведомленные ячейки пользовательского элемента управления
Examples of control tint aware custom control cells

Получение системного оттенка управления и цвета

Можно получить текущий оттенок управления в масштабе всей системы с помощью метода класса NSColor currentControlTint. Этот метод возвращается NSControlTint это представляет в настоящее время выбираемый цвет появления. В настоящее время NSBlueControlTint или NSGraphiteControlTint возможные возвращаемые значения, представляющие Воду и Графитовые появления соответственно.

Определив ток NSControlTint значение, можно теперь получить соответствующий цвет с помощью NSColor метод класса colorForControlTint:.

Когда пользователь изменяет настройки появления в масштабе всей системы путем регистрации как наблюдатель, приложение может обнаружить NSControlTintDidChangeNotification уведомление.

Взаимодействие с представлениями и изображениями

Ваше приложение может хотеть изменить появление содержания подкласса NSView или изменить тип изображения, используемого подклассом NSControl в ответ на изменяемое появление в масштабе всей системы. Чтобы сделать это Ваше приложение должно зарегистрироваться для NSControlTintDidChangeNotification, обновите надлежащие элементы и перерисуйте представление.

Пример в Перечислении 1 демонстрирует, как решить, что текущее управление окрашивает и изменяет изображение, выведенное на экран в NSButton и NSImageView. Объект, реализующий этот метод, был ранее зарегистрирован как наблюдатель NSControlTintDidChangeNotification уведомление, с этим методом как селектор.

  Пример перечисления 1, устанавливающий содержание NSButton и NSImageView с помощью currentControlTint

- (void)systemTintChangedNotification:(NSNotification *)notification;
{
    NSString *tintImageName;
 
    // compare the result of [NSColor currentControlTint]
    // with the supported tint values, defaulting to Aqua
    if ([NSColor currentControlTint] == NSGraphiteControlTint)
        tintImageName=@"GraphiteImage";
    else
        tintImageName=@"AquaImage";
 
    [exampleButton setImage:[NSImage imageNamed:tintImageName]];
    [exampleImageView setImage:[NSImage imageNamed:tintImageName]];
 
}

Взаимодействие с подклассами NSCell

Когда появление в масштабе всей системы изменяется, любые объекты NSCell автоматически перерисовываются. Это - ответственность подкласса NSCell определить текущий оттенок управления как часть его реализации drawWithFrame:inView:.

Пример в Перечислении 2 демонстрирует, как реализовать осведомленное об оттенке drawWithFrame:inView: метод. Это определяет, использует ли ячейка оттенок появления в масштабе всей системы, или если его оттенок был установлен явно, и надлежащее изображение тогда выбрано для дисплея. Надлежащий цвет оттенка управления также определяется для рисования рук часов.

  Пример перечисления 2 осведомленного об оттенке NSCell drawWithFrame:inView: реализация

- (void)drawWithFrame:(NSRect)cellFrame
               inView:(NSView *)controlView
{
    // if we're not the front window, we'll resort to using the
    // special NSClearControlTint value
    NSControlTint currentTint;
    if ([[controlView window] isKeyWindow])
        currentTint = [self controlTint];
    else
        currentTint= NSClearControlTint;
 
    // If the NSCell's control tint has been overridden
    // using the setControlTint: method we should use
    // the value returned by [self controlTint] as this
    // controls authoritative tint. If the tint is
    // NSDefaultControlTint then this cell should use the
    // system-wise appearance value, and we use the value
    // returned by the NSColor +currentControlTint method.
    if ([self controlTint] == NSDefaultControlTint)
        currentTint=[NSColor currentControlTint];
    else
        currentTint=[self controlTint];
 
 
 
    // and change the image used in drawing according to
    // the currentTint
    // Use the Aqua image as the default image
    NSImage *clockFaceImage;
    switch (currentTint) {
        case NSGraphiteControlTint:
            clockFaceImage = [NSImage imageNamed: @"ClockFace-Graphite"];
            break;
        case NSClearControlTint:
            clockFaceImage = [NSImage imageNamed: @"ClockFace-Clear"];
            break;
        case NSBlueControlTint:
        default:
            clockFaceImage = [NSImage imageNamed: @"ClockFace-Aqua"];
            break;
    }
 
    float clockRadius = MIN(NSHeight(cellFrame), NSWidth(cellFrame));
 
    // Draw the clock face (draw it flipped
    // if we are in a flipped view, like NSMatrix).
    [clockFaceImage setFlipped:[controlView isFlipped]];
    [clockFaceImage drawInRect:NSMakeRect(NSMinX(cellFrame),
                                          NSMinY(cellFrame),
                                          clockRadius,clockRadius)
                      fromRect:NSMakeRect(0,0,
                                          [clockFaceImage size].width,
                                          [clockFaceImage size].height)
                     operation:NSCompositeSourceOver
                      fraction:1.0];
 
    // get the color for the currentTint and use it for
    // drawing the hands on the clock face
    NSColor *tintColor=[NSColor colorForControlTint:currentTint];
 
    // Draw the clock hour and minute hands.
    [self drawClockHandsForTime:time
                      withFrame:cellFrame
                         inView:controlView
                     usingColor:tintColor];
}