0

我正在为 react-native-macos 搭建一座桥梁。我需要具有与 Spotlight 相同行为的 NSPanel。

我以编程方式在里面创建了 NSPanel 和 NSTextField。一切都按预期工作,但如果我将 NSPanel 更改为 not .titled - 文本字段被禁用。

作品:

panel = NSPanel(contentRect: NSRect(x: 0, y: 0, width: 400, height: 40), styleMask: [
    .borderless,
    .nonactivatingPanel,
    .titled,  < ------- HERE
    .resizable,
  ], backing: .buffered, defer: true)

searchField = NSTextField()
searchField.delegate = self
searchField.isBezeled = false
searchField.font = NSFont.systemFont(ofSize: 20, weight: .light
searchField.drawsBackground = false
searchField.placeholderString = "Query here..."
searchField.setFrameSize(NSMakeSize(400, 40)

不起作用:

panel = NSPanel(contentRect: NSRect(x: 0, y: 0, width: 400, height: 40), styleMask: [
    .borderless,
    .nonactivatingPanel,
    .resizable,
  ], backing: .buffered, defer: true)

searchField = NSTextField()
searchField.delegate = self
searchField.isBezeled = false
searchField.font = NSFont.systemFont(ofSize: 20, weight: .light
searchField.drawsBackground = false
searchField.placeholderString = "Query here..."
searchField.setFrameSize(NSMakeSize(400, 40)

如何使用隐藏的标题栏和可编辑的 NSTextField 执行 NSPanel?

4

1 回答 1

0

我相信.borderless并且.titled是相互排斥的。换句话说,当您.borderless在顶部代码中指定时,.titled它会覆盖它,您最终会得到一个正常处理事件的“普通窗口”。在第二个代码中,.borderless实际注册并最终得到一个处理事件完全不同的无边框窗口子类。但这一切都是无关紧要的。

假设您可以要求高于 macOS 10.10,您可以使用以下代码:

panel = NSPanel(contentRect: NSRect(x: 0, y: 0, width: 400, height: 40), styleMask: [
    .titled,
    .fullSizeContentView,
    ], backing: .buffered, defer: true)
panel.titleVisibility = .hidden
panel.titlebarAppearsTransparent = true
panel.makeFirstResponder(searchField)
panel.makeKeyAndOrderFront(nil)

这将获得一个正常处理事件的全尺寸标题面板(它允许其视图成为关键)。然后在显示面板之前,隐藏标题栏并使其透明。请注意,要让标题栏完全消失,您不需要使用任何.resizable.closable.miniaturizable选项。

于 2020-07-26T19:29:32.840 回答