我正在为react-native-macos 搭建一座桥梁。我需要 NSPanel 具有与 Spotlight 相同的行为。
我在里面以编程方式创建了 NSPanel 和 NSTextField。一切都按预期工作,但如果我将 NSPanel 更改为非 .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?
我相信
.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
选项。
只需将其添加到我的类中,该类继承自 NSPanel 并代表浮动面板,这有助于使文本字段具有响应能力。
override var canBecomeKey: Bool {
return true
}
override var canBecomeMain: Bool {
return true
}
在这段代码中找到:https://gist.github.com/jordibruin/8ae7b79a1c0ce2c355139f29990d5702