工作表中带有NSPredicateEditor的macOS Mojave暗模式UI错误

时间:2018-11-16 21:35:23

标签: macos macos-mojave nspredicateeditor macos-darkmode

在Mac应用中,我正在显示一个包含NSPredicateEditor的工作表:

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

在macOS 10.14 Mojave中,这导致许多UI错误:

  1. 在暗模式下,NSPredicateEditor内容区域浅且不可读:

Dark Mode

  1. 在灯光模式下,NSPredicateEditor控件的背景与行/超级视图的背景不匹配。请注意is背景和文本字段的背景:

Light Mode

如何在Mojave中修复这些以表格形式显示的NSPredicateEditor错误?

错误报告:

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

3 个答案:

答案 0 :(得分:2)

默认情况下,NSPredicateEditor的祖父母视图应为NSScrollView:

Predicate Editor View Hierarchy

如果为该滚动视图提供clearColor透明背景,则主要的深色模式问题将在很大程度上得到解决。如果您在光照模式下将此alpha更改保持活动状态,则谓词编辑器将假定白色背景,而不是默认的灰色视图背景。

As Apple says,请在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问题,即每个控件的灰色背景框架。

Dark Mode after fix

此处的Omni Show播客中讨论了此修复程序:

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

答案 1 :(得分:1)

此答案修复了NSPredicate编辑器控件的微妙背景色,如下所示:

将视觉效果视图using a flipped coordinate system插入“谓词编辑器”视图层次结构。翻转的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     ),
            ])
        }
    }

}

答案 2 :(得分:0)

Apple已回复了我的错误报告,并表示此行为已通过Xcode的最新更新得到解决。

  表格提供的

NSPredicateEditor在黑暗模式下完全损坏

     
    

rdar:// 46142171

  
     

Apple开发人员关系

     
    

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

  
     

     
    

您是说对Mojave进行了更新吗?

         

需要使用scrollview clearcolor背景才能使NSPredicateEditor在黑暗模式下全部可用。

  
     

Apple开发人员关系

     
    

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

  
     

     
    

好的,我发现在切换(返回)到controlBackgroundColor之后,这种行为现在大部分都可以了。又名删除我的clearColor修复程序

         

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

  
     

Apple开发人员关系

     
    

此问题已在Xcode中修复

  
相关问题