1

在 Mac 应用程序中,我展示了一个包含 NSPredicateEditor 的工作表:

parentViewController.presentAsSheet(predicateEditor)

我在这里为这种行为创建了一个示例项目:
https ://github.com/pkamb/Feedback_NSPredicateEditor

在 macOS 10.14 Mojave 和 10.15 Catalina 中,在引入深色模式后,这会导致一些 UI 错误。

NSPredicateEditor 控件的背景与行/超级视图的背景不匹配。注意is文本字段的背景和背景。

  1. 黑暗模式:

黑暗模式

  1. 灯光模式:

灯光模式

如何修复这些表单呈现的 NSPredicateEditor UI 错误?

错误报告:

  • rdar://42789149 - NSPredicateEditor 在工作表中的暗模式下表现不佳
  • rdar://46142171 - 工作表提供的 NSPredicateEditor 在暗模式下完全损坏
4

3 回答 3

2

编辑:

Xcode 更新中引入了相同的更改,并且不再需要。在此处查看答案:https ://stackoverflow.com/a/54189665/1265393


默认情况下,NSPredicateEditor 的祖父视图应该是一个 NSScrollView:

谓词编辑器视图层次结构

如果你给这个滚动视图一个 clearColor 透明背景,主要的暗模式问题将大部分得到修复。如果您在 Light Mode 中保持此 alpha 更改处于活动状态,则谓词编辑器将采用白色背景而不是默认的灰色视图背景。

正如 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 仍然存在一些 UI 问题,即每个控件的灰色背景框。

修复后的暗模式

此修复在此处的 Omni Show 播客中进行了讨论:

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

于 2018-11-16T21:35:22.570 回答
1

这个答案修复了 NSPredicate 编辑器控件的微妙错误的背景颜色,如下所示:

将使用翻转坐标系的视觉效果视图插入到谓词编辑器视图层次结构中。翻转的 VEV 应该存在于 NSClipView 和 NSPredicateEditor 之间。

然后添加自动布局约束,如下所示。不要限制 VEV 的底部或高度锚。


笔记:

  • 设置scrollView.documentView = flippedVEV修复滚动。

  • 如果您不使用isFlippedVEV,则谓词编辑器行堆叠在底部而不是顶部。


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     ),
            ])
        }
    }

}
于 2020-03-25T03:51:23.683 回答
0

Apple 已对我的错误报告做出回应,并表示最近对 Xcode 的更新修复了以下极其糟糕的暗模式行为。

您可能仍需要手动修复此处答案中更微妙的错误:https ://stackoverflow.com/a/60842764/1265393

Apple的这个答案只是对这里看到的极其糟糕的暗模式错误的修复:

糟糕的暗模式谓词编辑器

工作表呈现的 NSPredicateEditor 在暗模式下完全损坏

rdar://46142171

苹果开发者关系:

要修复暗模式外观,您应该将该 scollview 背景颜色重置为默认值

我:

你是说在 Mojave 的更新中进行了修复?

为了使 NSPredicateEditor 在暗模式下完全可用,需要使用 scrollview clearcolor 背景。

苹果开发者关系:

不,在 Xcode 中,您需要将 scollview 背景颜色更改为其默认 ( controlBackgroundColor)

我:

好的,在切换(返回)到controlBackgroundColor. 又名删除我的 clearColor 修复

但是,在过去选择该颜色时,这绝对行不通。您能否提供有关何时在 OS X 或 Xcode 中修复此问题的任何信息?

苹果开发者关系:

这已在 Xcode 中修复

于 2019-01-14T21:47:25.017 回答