NSVisualEffectView за NSScrollView
Я пытаюсь получить NSScrollView
(и, таким образом, содержал NSOutlineView
) использовать размытое NSVisualEffectView
с эффектом смешивания за окном.
Я успешно сделал NSVisualEffectView
вид контейнера и поместил мой вид прокрутки в качестве подпредставления. Кажется, это работает нормально (пока я делаю прозрачными все ячейки таблицы, таблицу, nsscrollview и т. Д.).
Однако теперь я включил "Уменьшить прозрачность" в параметрах специальных возможностей, и внезапно у меня за черным фоном NSScrollView
, Я попытался создать подкласс визуального эффекта, чтобы переопределить drawRect
метод, чтобы я мог нарисовать свой собственный фон, но я только что узнал, что это невозможно или не рекомендуется.
Как определить, что параметр "Уменьшить прозрачность" включен, и как сделать динамическое отображение прокрутки непрозрачным?
3 ответа
Мне потребовалось некоторое время, чтобы найти его, но есть несколько новых методов в NSWorkspace, которые вы можете использовать, чтобы узнать о предпочтениях новых возможностей специальных возможностей OS X Yosemite. -[NSWorkspace accessibilityDisplayShouldReduceTransparency]
это тот, который вы хотите.
Прислушиваясь к NSWorkspaceAccessibilityDisplayOptionsDidChangeNotification
Вы можете узнать, когда это предпочтение изменится. Обратите внимание, что вам нужно зарегистрироваться для этого уведомления на правильном NSNotificationCenter
, то есть [[NSWorkspace sharedWorkspace] notificationCenter]
,
Кажется, что на данный момент я переопределил родитель NSView
который содержит все и установить цвет фона для этого. Таким образом, когда параметр "Уменьшить прозрачность" включен, NSVisualEffectView
становится прозрачным, и цвет, который я получаю, становится видимым под ним. Кажется, сейчас это работает нормально.
Несмотря на то, что в настоящее время у нас есть SwiftUI, в классическом Cocoa вы все еще можете подклассировать пользовательскийNSScrollView
и использовать...
-(NSColor *)backgroundColor {
return NSColor.clearColor;
}
-(BOOL)drawsBackground {
return NO;
}
или установите свойства вашего NSScrollView соответственно, если вы не хотите создавать подклассы, например...
yourscrollview.drawsBackground = NO;
yourscrollview.backgroundColor = NSColor.clearColor;
это заставляет ваше представление показывать то, что находится ниже, а вместе с ним и эффект размытия или непрозрачный цвет вашего представления или окна, которое окружает ваш NSScrollView.
Преимущество этого решения в том, что вам не нужно наблюдать за рабочей областью для какого-либо уведомления или эффекта вибрации.