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.

Преимущество этого решения в том, что вам не нужно наблюдать за рабочей областью для какого-либо уведомления или эффекта вибрации.

Другие вопросы по тегам