В MacOS ошибки пользовательского интерфейса Mojave Dark Mode с NSPredicateEditor в листе
В приложении Mac я представляю лист, содержащий NSPredicateEditor:
let predicateEditorSheet = // from storyboard
parentViewController.presentAsSheet(predicateEditorSheet)
В macOS 10.14 Mojave это приводит к ряду ошибок пользовательского интерфейса:
- В темном режиме область содержимого NSPredicateEditor светлая и нечитаемая:
- В легком режиме фон элементов управления 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