Удалить бледный эффект на NSStatusBarButton - PullRequest
2 голосов
/ 08 марта 2020

Я ищу способ убрать бледный эффект из NSStatusBarButton. Вот как это выглядит в данный момент:

NSStatusBarButton with pale image

Вот как это должно выглядеть:

NSStatusBarButton with original image

После просмотра В документации Apple я нашел решение проблемы. Если вы установите внешний вид кнопки напрямую (например, Aqua или DarkAqua), бледный эффект исчезнет:

if let button = statusBarItem.button {
    ...
    button.appearance = NSAppearance.current // or aqua / darkAqua
}

Но проблема в том, когда пользователь меняет тему интерфейса (например, из темного режима в светлый режим) NSStatusBarButton не изменяет свой внешний вид автоматически:

NSStatusBarButton does not change the appearance automatically

Я мог бы контролировать AppleInterfaceThemeChangedNotification и затем изменять внешний вид, но это не чистое решение, и я не доволен это.

Есть ли элегантное решение для этого? Изображение в NSStatusBarButton должно просто отображаться без изменений (например, бледно). Поскольку я предлагаю все флаги мира, у меня есть только изображения в формате png, без PDF-изображений.

Ответы [ 2 ]

1 голос
/ 10 марта 2020

Поскольку решение vadian, к сожалению, не работает для меня, я хотел бы показать здесь свое альтернативное решение. Может быть, это поможет кому-то еще.

Создайте NSStatusItem и настройте NSStatusBarButton:

...
if let button = statusBarItem.button {
    ...
    button.appearance = NSAppearance.current // removes the pale effect
}
...

Напишите расширение для Notification.Name, чтобы реагировать на AppleInterfaceThemeChangedNotification:

extension Notification.Name {
    static let AppleInterfaceThemeChangedNotification = Notification.Name("AppleInterfaceThemeChangedNotification")
}

Добавьте наблюдателя к новому имени уведомления:

DistributedNotificationCenter.default.addObserver(self, selector: #selector(interfaceChanged), name: .AppleInterfaceThemeChangedNotification, object: nil)

Ответьте на изменение между светлым / темным режимом:

@objc private static func interfaceChanged() {
    // change button.appearance
}

Убедитесь, что button.appearance только изменено, если доступна необходимая версия macOS:

guard #available(OSX 10.14, *) else {
    return
}

Я уверен, что есть более чистое решение. Если у кого-то есть идея, пожалуйста, скажите мне.

0 голосов
/ 08 марта 2020

Написать расширение NSStatusBarButton и переопределить viewDidChangeEffectiveAppearance.

. В теле метода явно изменить внешний вид

extension NSStatusBarButton { 
    @available(macOS 10.14, *)
    override public func viewDidChangeEffectiveAppearance() {
        print("viewDidChangeEffectiveAppearance")
        self.appearance = .current 
    }
}
...