В MacOS ошибки пользовательского интерфейса Mojave Dark Mode с NSPredicateEditor в листе

В приложении Mac я представляю лист, содержащий NSPredicateEditor:

let predicateEditorSheet = // from storyboard
parentViewController.presentAsSheet(predicateEditorSheet)

В macOS 10.14 Mojave это приводит к ряду ошибок пользовательского интерфейса:

  1. В темном режиме область содержимого NSPredicateEditor светлая и нечитаемая:

Темный режим

  1. В легком режиме фон элементов управления NSPredicateEditor не соответствует фону фона строки / суперпредставления. Обратите внимание is фон и фон текстовых полей:

Легкий режим

Как исправить ошибки, представленные в листе NSPredicateEditor, в Мохаве?

Отчеты об ошибках:

  • rdar: // 42789149 - NSPredicateEditor плохо работает в темном режиме на листе
  • rdar://46142171 - NSPredicateEditor, представленный Sheet, полностью поврежден в Dark Mode

1 ответ

По умолчанию представление прародителя NSPredicateEditor должно быть NSScrollView:

Иерархия представления редактора предикатов

Если вы предоставите этому виду прокрутки прозрачный фон clearColor, основная проблема в Dark Mode будет по большей части устранена. Если вы оставите это альфа-изменение активным в легком режиме, редактор предикатов примет белый фон, а не серый вид фона по умолчанию.

Как говорит Apple, внесите это изменение в layout() или один из других методов, который дает вашему представлению возможность обновляться при изменении внешнего вида системы.

class NSPredicateEditorDarkModeFix: NSPredicateEditor {

    override func layout() {
        defer { super.layout() }

        guard let clipView = self.superview as? NSClipView, let scrollView = clipView.superview as? NSScrollView else {
            return
        }

        let alpha: CGFloat = NSAppearance.current.name == .darkAqua ? 0.0 : 1.0
        scrollView.backgroundColor = scrollView.backgroundColor.withAlphaComponent(alpha)
    }

}

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

Темный режим после исправления

Это исправление обсуждалось на подкасте Omni Show здесь:

https://theomnishow.omnigroup.com/episode/rey-worthington-omnigraffle-engineer https://twitter.com/theomnishow/status/1052630270719868928

Этот ответ исправляет слегка неправильные цвета фона элементов управления редактора NSPredicate, как показано здесь:

  • Легкий режим:
  • Темный режим:

Вставьте представление визуальных эффектов с помощью перевернутой системы координат в иерархию представлений редактора предикатов. Перевернутый VEV должен существовать между NSClipView и NSPredicateEditor.

Затем добавьте ограничения автоматического размещения, как показано ниже. Не ограничивайте нижние или верхние анкеры VEV.


Заметка:

  • Установка scrollView.documentView = flippedVEV исправляет прокрутку.

  • Если вы не используете isFlipped VEV, строки редактора предикатов располагаются внизу, а не вверху.


class FlippedVEV: NSVisualEffectView {
    override var isFlipped: Bool { return true }
}

class PredicateEditorViewController: NSViewController {

    @IBOutlet weak var predicateEditor: NSPredicateEditor!

    override func viewDidLoad() {
        super.viewDidLoad()

        if let clipView = predicateEditor.superview as? NSClipView, let scrollView = clipView.superview as? NSScrollView {
            let flippedVEV = FlippedVEV(frame: predicateEditor.frame)
            flippedVEV.material = .sheet

            predicateEditor.removeFromSuperview()
            flippedVEV.addSubview(predicateEditor)
            clipView.addSubview(flippedVEV)
            scrollView.documentView = flippedVEV

            flippedVEV.translatesAutoresizingMaskIntoConstraints = false
            NSLayoutConstraint.activate([
                flippedVEV.leadingAnchor .constraint(equalTo:predicateEditor.leadingAnchor ),
                flippedVEV.trailingAnchor.constraint(equalTo:predicateEditor.trailingAnchor),
                flippedVEV.topAnchor     .constraint(equalTo:predicateEditor.topAnchor     ),
                flippedVEV.bottomAnchor  .constraint(equalTo:predicateEditor.bottomAnchor  ),
                clipView.leadingAnchor   .constraint(equalTo:flippedVEV     .leadingAnchor ),
                clipView.trailingAnchor  .constraint(equalTo:flippedVEV     .trailingAnchor),
                clipView.topAnchor       .constraint(equalTo:flippedVEV     .topAnchor     ),
            ])
        }
    }

}

Apple ответила на мой отчет об ошибке и говорит, что это поведение было исправлено недавним обновлением Xcode.

NSPredicateEditor, представленный Sheet, полностью сломан в Dark Mode

rdar: // 46142171

Отношения разработчиков Apple

Чтобы исправить появление в темном режиме, вы должны сбросить этот цвет фона по умолчанию

мне

Вы говорите, что исправление было сделано в обновлении Мохаве?

Прозрачный фон scrollview был необходим для того, чтобы NSPredicateEditor мог работать в темном режиме.

Отношения разработчиков Apple

Нет, в Xcode вам нужно изменить цвет фона scollview на Default (controlBackgroundColor)

мне

Хорошо, теперь я вижу, что это ведет себя в основном нормально после переключения (назад) на controlBackgroundColor, ака удаление моего clearColor исправления

Тем не менее, это определенно НЕ работало в прошлом с выбранным цветом. Можете ли вы предоставить какую-либо информацию о том, когда это было исправлено в OS X или XCode?

Отношения разработчиков Apple

Это было исправлено в Xcode

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