Nano Hash - криптовалюты, майнинг, программирование

NSTableView и NSButtons не перерисовываются должным образом после применения NSAppearance в NSWindow

У меня есть NSButtons в NSTableView, точно так же, как в моем другом вопросе здесь.

Я реализовал переключение между «Темным режимом» и «Обычным режимом» с помощью NSAppearance в окне в NSWindowController:

override public func windowDidLoad() {
    if darkModeOn {
        setDarkMode()   
    } else {
        setLightMode()  
    }
}

func setDarkMode() {
    window?.appearance = NSAppearance(named: NSAppearanceNameVibrantDark)
    window?.backgroundColor = nil
}

func setLightMode() {
    window?.appearance = nil
    window?.backgroundColor = .white
}

Кнопки имеют свой атрибут isTemplate равным true, поэтому их цвет является обратным цвету окна.

Легкий:

введите здесь описание изображения

Темный:

введите здесь описание изображения

Это работает нормально, когда приложение запускается: кнопки черные, когда окно белое, и белые, когда окно темное.

Но это больше не работает, когда приложение уже запущено.

После запуска приложения, если я вызываю setDarkMode(), когда окно белое, я внезапно получаю черные или серые кнопки вместо желаемых белых.

введите здесь описание изображения

То же самое, если я позвоню setLightMode(), когда окно темное.

введите здесь описание изображения

В обоих случаях кнопки возвращаются в нормальное состояние, как только я прокручиваю tableView назад и вперед достаточно, чтобы принудительно перерисовать ячейки.

Обратите внимание на еще один побочный эффект переключения состояния окна: некоторые разделители строк tableView внезапно становятся толще, а также снова становятся нормальными после прокрутки.

Как вы можете себе представить, я не хочу, чтобы пользователь был вынужден выйти из приложения и перезапустить его, поэтому я хотел бы, чтобы все эти вещи правильно отображались в окне при изменении NSAppearance.

К сожалению, я пробовал много решений без успеха: комбинации needsDisplay и других способов принудительного «обновления» кнопок (и разделителей строк tableView) не имели никакого эффекта. Документация скудная. Я посмотрел все видео WWDC. Я потерялся. :п


  • Я могу ошибаться, но я не думал, что это было разработано для изменения во время выполнения, и подобные изменения внешнего вида требуют перезапуска приложения. 24.05.2017
  • @JoshuaNozzi Да, я этого и боялся. Я буду исследовать различные подходы, но все еще надеюсь, что кто-то сможет найти способ заставить этот простой способ работать. :п 25.05.2017
  • Эй, @Moritz, я думаю, вы могли бы перерисовать строки с помощью reloadRowsAtIndexPaths:withRowAnimation: или, может быть, даже лучшее решение - скрыть и снова показать весь NSTableView :-) первое - неплохое решение, второе - настоящая перерисовка FORCE :P. Скрыть на 1 кадр и нарисовать снова (моргание на 1 кадр лучше, чем заставлять пользователя перезапускать приложение). 09.02.2018
  • Я думаю, что причина, по которой вы столкнулись с этой проблемой, заключается в том, что NSTableView настроен на повторное использование ячеек. Таким образом, он просто не рисует их, когда они видны, вы можете попытаться настроить ячейки так, чтобы они не использовались повторно, и посмотреть, существует ли проблема. Конечно, отказ от их повторного использования приводит к некоторым потерям производительности, но это зависит от ваших потребностей — могу поспорить, что Mac справятся с этим хорошо (по моему опыту, пару лет назад iPhone 4 хорошо себя зарекомендовал, а UITableView был довольно сложным). 09.02.2018
  • Возможно, самый простой способ — переопределить метод didLayout() и изменить фрейм TableView на другое значение — это должно перерисовать все это и в следующем фрейме вернуть его в нужный фрейм (например, в вопросе с размытым текстом). 09.02.2018

Новые материалы

Кластеризация: более глубокий взгляд
Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

Как написать эффективное резюме
Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

Частный метод Python: улучшение инкапсуляции и безопасности
Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

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

Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..