Используя системный оттенок управления
OS X позволяет пользователю выбирать цвет, используемый в дисплее окон, меню и средств управления с помощью области Appearance в Установках системы. Этот цвет упоминается как оттенок управления. Элементы пользовательского интерфейса, предоставленные Набором Приложения автоматически, изменяют свое появление на основе текущего оттенка управления.
Пользовательские элементы управления и другие аспекты пользовательского интерфейса Вашего приложения могут также использовать оттенок управления как показано на рисунке 1.
Получение системного оттенка управления и цвета
Можно получить текущий оттенок управления в масштабе всей системы с помощью метода класса 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]; |
} |